diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2020-10-14 14:33:28 +0200 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2020-10-14 16:02:18 +0200 |
commit | fde7bb6ddc9c2f9b515e1b3aac791635bcf813fa (patch) | |
tree | 3e963087109b377a9e29cca085f5942a86a151cf /vcl/qa/cppunit/skia | |
parent | be4616d6b49b8c9cf1a90b212b24ead3dabcab6c (diff) |
add unittest for SkiaSalBitmap copy-on-write data sharing
Change-Id: I2e331785d49c55116bf9cb893be25da1067df8ee
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104283
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'vcl/qa/cppunit/skia')
-rw-r--r-- | vcl/qa/cppunit/skia/skia.cxx | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/vcl/qa/cppunit/skia/skia.cxx b/vcl/qa/cppunit/skia/skia.cxx index c3f1c215b570..00c99823e986 100644 --- a/vcl/qa/cppunit/skia/skia.cxx +++ b/vcl/qa/cppunit/skia/skia.cxx @@ -34,12 +34,14 @@ public: void testDrawShaders(); void testInterpretAs8Bit(); void testAlphaBlendWith(); + void testBitmapCopyOnWrite(); CPPUNIT_TEST_SUITE(SkiaTest); CPPUNIT_TEST(testBitmapErase); CPPUNIT_TEST(testDrawShaders); CPPUNIT_TEST(testInterpretAs8Bit); CPPUNIT_TEST(testAlphaBlendWith); + CPPUNIT_TEST(testBitmapCopyOnWrite); CPPUNIT_TEST_SUITE_END(); private: @@ -261,6 +263,46 @@ void SkiaTest::testAlphaBlendWith() AlphaMask::ScopedReadAccess(alpha)->GetPixelIndex(0, 0)); } +void SkiaTest::testBitmapCopyOnWrite() +{ + if (!SkiaHelper::isVCLSkiaEnabled()) + return; + SkiaSalBitmap bitmap; + CPPUNIT_ASSERT(bitmap.Create(Size(10, 10), 24, BitmapPalette())); + bitmap.GetSkImage(); + bitmap.GetAlphaSkImage(); + CPPUNIT_ASSERT(bitmap.unittestHasBuffer()); + CPPUNIT_ASSERT(bitmap.unittestHasImage()); + CPPUNIT_ASSERT(bitmap.unittestHasAlphaImage()); + SkiaSalBitmap bitmap2; + CPPUNIT_ASSERT(bitmap2.Create(bitmap)); + // Data should be shared. + CPPUNIT_ASSERT_EQUAL(bitmap.unittestGetBuffer(), bitmap2.unittestGetBuffer()); + CPPUNIT_ASSERT(bitmap2.unittestHasImage()); + CPPUNIT_ASSERT(bitmap2.unittestHasAlphaImage()); + CPPUNIT_ASSERT_EQUAL(bitmap.unittestGetImage(), bitmap2.unittestGetImage()); + CPPUNIT_ASSERT_EQUAL(bitmap.unittestGetAlphaImage(), bitmap2.unittestGetAlphaImage()); + // Reading still should keep the data shrared. + const SkImage* oldImage = bitmap.unittestGetImage(); + const SkImage* oldAlphaImage = bitmap.unittestGetAlphaImage(); + BitmapBuffer* buffer = bitmap.AcquireBuffer(BitmapAccessMode::Read); + CPPUNIT_ASSERT_EQUAL(bitmap.unittestGetBuffer(), bitmap2.unittestGetBuffer()); + bitmap.ReleaseBuffer(buffer, BitmapAccessMode::Read); + // Images get possibly updated only after releasing the buffer. + CPPUNIT_ASSERT_EQUAL(bitmap.unittestGetImage(), bitmap2.unittestGetImage()); + CPPUNIT_ASSERT_EQUAL(bitmap.unittestGetAlphaImage(), bitmap2.unittestGetAlphaImage()); + CPPUNIT_ASSERT_EQUAL(bitmap.unittestGetImage(), oldImage); + CPPUNIT_ASSERT_EQUAL(bitmap.unittestGetAlphaImage(), oldAlphaImage); + // Writing should unshare. + buffer = bitmap.AcquireBuffer(BitmapAccessMode::Write); + CPPUNIT_ASSERT(bitmap.unittestGetBuffer() != bitmap2.unittestGetBuffer()); + bitmap.ReleaseBuffer(buffer, BitmapAccessMode::Write); + CPPUNIT_ASSERT(bitmap.unittestGetImage() != bitmap2.unittestGetImage()); + CPPUNIT_ASSERT(bitmap.unittestGetAlphaImage() != bitmap2.unittestGetAlphaImage()); + CPPUNIT_ASSERT(bitmap.unittestGetImage() != oldImage); + CPPUNIT_ASSERT(bitmap.unittestGetAlphaImage() != oldAlphaImage); +} + } // namespace CPPUNIT_TEST_SUITE_REGISTRATION(SkiaTest); |