diff options
-rw-r--r-- | external/skia/extend-rgb-to-rgba.patch.0 | 14 | ||||
-rw-r--r-- | vcl/skia/salbmp.cxx | 26 |
2 files changed, 34 insertions, 6 deletions
diff --git a/external/skia/extend-rgb-to-rgba.patch.0 b/external/skia/extend-rgb-to-rgba.patch.0 index f68dbab96336..e0ce55fa2377 100644 --- a/external/skia/extend-rgb-to-rgba.patch.0 +++ b/external/skia/extend-rgb-to-rgba.patch.0 @@ -1,19 +1,21 @@ diff --git a/include/core/SkSwizzle.h b/include/core/SkSwizzle.h -index 61e93b2da7..c19063bb91 100644 +index 61e93b2da7..9a26f0f492 100644 --- ./include/core/SkSwizzle.h +++ ./include/core/SkSwizzle.h -@@ -16,4 +16,6 @@ +@@ -16,4 +16,8 @@ */ SK_API void SkSwapRB(uint32_t* dest, const uint32_t* src, int count); +SK_API void SkExtendRGBToRGBA(uint32_t* dest, const uint8_t* src, int count); + ++SK_API void SkExtendGrayToRGBA(uint32_t* dest, const uint8_t* src, int count); ++ #endif diff --git a/src/core/SkSwizzle.cpp b/src/core/SkSwizzle.cpp -index 301b0184f1..6e6dd27558 100644 +index 301b0184f1..382323695f 100644 --- ./src/core/SkSwizzle.cpp +++ ./src/core/SkSwizzle.cpp -@@ -12,3 +12,7 @@ +@@ -12,3 +12,11 @@ void SkSwapRB(uint32_t* dest, const uint32_t* src, int count) { SkOpts::RGBA_to_BGRA(dest, src, count); } @@ -21,3 +23,7 @@ index 301b0184f1..6e6dd27558 100644 +void SkExtendRGBToRGBA(uint32_t* dest, const uint8_t* src, int count) { + SkOpts::RGB_to_RGB1(dest, src, count); +} ++ ++void SkExtendGrayToRGBA(uint32_t* dest, const uint8_t* src, int count) { ++ SkOpts::gray_to_RGB1(dest, src, count); ++} diff --git a/vcl/skia/salbmp.cxx b/vcl/skia/salbmp.cxx index 5a426fa6e404..91748f57552a 100644 --- a/vcl/skia/salbmp.cxx +++ b/vcl/skia/salbmp.cxx @@ -451,8 +451,29 @@ SkBitmap SkiaSalBitmap::GetAsSkBitmap() const abort(); bitmap.setImmutable(); } - // Skia has a format for 8bit grayscale SkBitmap, but it seems to cause a problem - // with our PNG loader (tdf#121120), so convert it to RGBA below as well. + else if (mBitCount == 8 && mPalette.IsGreyPalette8Bit()) + { + // Convert 8bpp gray to 32bpp RGBA/BGRA. + // There's also kGray_8_SkColorType, but it's probably simpler to make + // GetAsSkBitmap() always return 32bpp SkBitmap and then assume mImage + // is always 32bpp too. + std::unique_ptr<uint32_t[]> data( + new uint32_t[mPixelsSize.Height() * mPixelsSize.Width()]); + uint32_t* dest = data.get(); + for (long y = 0; y < mPixelsSize.Height(); ++y) + { + const sal_uInt8* src = mBuffer.get() + mScanlineSize * y; + SkExtendGrayToRGBA(dest, src, mPixelsSize.Width()); + dest += mPixelsSize.Width(); + } + if (!bitmap.installPixels( + SkImageInfo::MakeS32(mPixelsSize.Width(), mPixelsSize.Height(), + kOpaque_SkAlphaType), + data.release(), mPixelsSize.Width() * 4, + [](void* addr, void*) { delete[] static_cast<sal_uInt8*>(addr); }, nullptr)) + abort(); + bitmap.setImmutable(); + } else { // Use a macro to hide an unreachable code warning. @@ -634,6 +655,7 @@ void SkiaSalBitmap::EnsureBitmapData() // Try to fill mBuffer from mImage. if (!mImage) return; + assert(mImage->colorType() == kN32_SkColorType); SkiaZone zone; if (!CreateBitmapData()) abort(); |