summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2020-10-02 15:29:34 +0200
committerLuboš Luňák <l.lunak@collabora.com>2020-10-04 11:10:51 +0200
commitc57010def9e2e62b1d3d60f13ec58967c09fbf91 (patch)
treeaff6cdfa57de5c86318d27c7c03a8dee4f949b71
parent138cd28e2605740bbcacd22bac14aeb6bc5763cd (diff)
optimize and unittest SkiaSalBitmap::InterpretAs8Bit()
Reinterpreting a color is even simpler, and do it ourselves even if there is pixel buffer, as the SkImage is preferred (it'll be more likely used afterwards). Change-Id: I3ea7ea0abb3133dce18ee51f1aae324e7bb51196 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103886 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
-rw-r--r--vcl/qa/cppunit/skia/skia.cxx40
-rw-r--r--vcl/skia/salbmp.cxx13
2 files changed, 46 insertions, 7 deletions
diff --git a/vcl/qa/cppunit/skia/skia.cxx b/vcl/qa/cppunit/skia/skia.cxx
index 439440962b44..7fa4a9e3f00e 100644
--- a/vcl/qa/cppunit/skia/skia.cxx
+++ b/vcl/qa/cppunit/skia/skia.cxx
@@ -32,10 +32,12 @@ public:
void testBitmapErase();
void testDrawShaders();
+ void testInterpretAs8Bit();
CPPUNIT_TEST_SUITE(SkiaTest);
CPPUNIT_TEST(testBitmapErase);
CPPUNIT_TEST(testDrawShaders);
+ CPPUNIT_TEST(testInterpretAs8Bit);
CPPUNIT_TEST_SUITE_END();
private:
@@ -76,8 +78,7 @@ void SkiaTest::testBitmapErase()
CPPUNIT_ASSERT(!skiaBitmap->unittestHasAlphaImage());
CPPUNIT_ASSERT(skiaBitmap->unittestHasEraseColor());
// Reading a pixel will create pixel data.
- BitmapReadAccess access(bitmap);
- CPPUNIT_ASSERT_EQUAL(BitmapColor(COL_RED), access.GetColor(0, 0));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(COL_RED), BitmapReadAccess(bitmap).GetColor(0, 0));
skiaBitmap = dynamic_cast<SkiaSalBitmap*>(bitmap.ImplGetSalBitmap().get());
CPPUNIT_ASSERT(skiaBitmap->unittestHasBuffer());
CPPUNIT_ASSERT(!skiaBitmap->unittestHasImage());
@@ -97,12 +98,10 @@ void SkiaTest::testDrawShaders()
Bitmap bitmap(Size(10, 10), 24);
bitmap.Erase(COL_RED);
SkiaSalBitmap* skiaBitmap = dynamic_cast<SkiaSalBitmap*>(bitmap.ImplGetSalBitmap().get());
- CPPUNIT_ASSERT(skiaBitmap);
CPPUNIT_ASSERT(skiaBitmap->PreferSkShader());
AlphaMask alpha(Size(10, 10));
alpha.Erase(64);
SkiaSalBitmap* skiaAlpha = dynamic_cast<SkiaSalBitmap*>(alpha.ImplGetSalBitmap().get());
- CPPUNIT_ASSERT(skiaAlpha);
CPPUNIT_ASSERT(skiaAlpha->PreferSkShader());
device->DrawBitmap(Point(5, 5), bitmap);
@@ -143,7 +142,6 @@ void SkiaTest::testDrawShaders()
bitmapLarge.Erase(COL_RED);
SkiaSalBitmap* skiaBitmapLarge
= dynamic_cast<SkiaSalBitmap*>(bitmapLarge.ImplGetSalBitmap().get());
- CPPUNIT_ASSERT(skiaBitmapLarge);
CPPUNIT_ASSERT(skiaBitmapLarge->PreferSkShader());
AlphaMask alphaLarge(Size(100, 100));
alphaLarge.Erase(64);
@@ -171,6 +169,38 @@ void SkiaTest::testDrawShaders()
device->Erase();
}
+void SkiaTest::testInterpretAs8Bit()
+{
+ if (!SkiaHelper::isVCLSkiaEnabled())
+ return;
+ Bitmap bitmap(Size(10, 10), 24);
+ // Test with erase color.
+ bitmap.Erase(Color(33, 33, 33));
+ SkiaSalBitmap* skiaBitmap = dynamic_cast<SkiaSalBitmap*>(bitmap.ImplGetSalBitmap().get());
+ CPPUNIT_ASSERT(skiaBitmap->unittestHasEraseColor());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(24), bitmap.GetBitCount());
+ bitmap.Convert(BmpConversion::N8BitNoConversion);
+ skiaBitmap = dynamic_cast<SkiaSalBitmap*>(bitmap.ImplGetSalBitmap().get());
+ CPPUNIT_ASSERT(skiaBitmap->unittestHasEraseColor());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(8), bitmap.GetBitCount());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt8>(33), BitmapReadAccess(bitmap).GetPixelIndex(0, 0));
+
+ // Test with image.
+ bitmap = Bitmap(Size(10, 10), 24);
+ bitmap.Erase(Color(34, 34, 34));
+ BitmapReadAccess(bitmap).GetColor(0, 0); // Create pixel data, reset erase color.
+ skiaBitmap = dynamic_cast<SkiaSalBitmap*>(bitmap.ImplGetSalBitmap().get());
+ skiaBitmap->GetSkImage();
+ CPPUNIT_ASSERT(!skiaBitmap->unittestHasEraseColor());
+ CPPUNIT_ASSERT(skiaBitmap->unittestHasImage());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(24), bitmap.GetBitCount());
+ bitmap.Convert(BmpConversion::N8BitNoConversion);
+ skiaBitmap = dynamic_cast<SkiaSalBitmap*>(bitmap.ImplGetSalBitmap().get());
+ CPPUNIT_ASSERT(skiaBitmap->unittestHasImage());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(8), bitmap.GetBitCount());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt8>(34), BitmapReadAccess(bitmap).GetPixelIndex(0, 0));
+}
+
} // namespace
CPPUNIT_TEST_SUITE_REGISTRATION(SkiaTest);
diff --git a/vcl/skia/salbmp.cxx b/vcl/skia/salbmp.cxx
index b6b85f60d9f3..e8f67b0585ed 100644
--- a/vcl/skia/salbmp.cxx
+++ b/vcl/skia/salbmp.cxx
@@ -412,6 +412,14 @@ bool SkiaSalBitmap::InterpretAs8Bit()
#endif
if (mBitCount == 8 && mPalette.IsGreyPalette8Bit())
return true;
+ if (mEraseColorSet)
+ {
+ mBitCount = 8;
+ ComputeScanlineSize();
+ mPalette = Bitmap::GetGreyPalette(256);
+ SAL_INFO("vcl.skia.trace", "interpretas8bit(" << this << ") with erase color");
+ return true;
+ }
// This is usually used by AlphaMask, the point is just to treat
// the content as an alpha channel. This is often used
// by the horrible separate-alpha-outdev hack, where the bitmap comes
@@ -421,15 +429,16 @@ bool SkiaSalBitmap::InterpretAs8Bit()
// just treat the SkImage as being for 8bit bitmap. EnsureBitmapData()
// will do the conversion if needed, but the normal case will be
// GetAlphaSkImage() creating kAlpha_8_SkColorType SkImage from it.
- if (!mBuffer && mImage)
+ if (mImage)
{
mBitCount = 8;
ComputeScanlineSize();
mPalette = Bitmap::GetGreyPalette(256);
ResetToSkImage(mImage); // keep mImage, it will be interpreted as 8bit if needed
- SAL_INFO("vcl.skia.trace", "interpretas8bit(" << this << ")");
+ SAL_INFO("vcl.skia.trace", "interpretas8bit(" << this << ") with image");
return true;
}
+ SAL_INFO("vcl.skia.trace", "interpretas8bit(" << this << ") with pixel data, ignoring");
return false;
}