vcl/inc/skia/salbmp.hxx      |    1 
 vcl/qa/cppunit/skia/skia.cxx |   57 +++++++++++++++++++++++++++++++++++++++++++
 vcl/skia/salbmp.cxx          |    2 -
 3 files changed, 59 insertions(+), 1 deletion(-)

New commits:
commit 897130541646a37e358463cb76aa505b66a1d7ac
Author:     Luboš Luňák <l.lu...@collabora.com>
AuthorDate: Thu Nov 11 16:12:35 2021 +0100
Commit:     Luboš Luňák <l.lu...@collabora.com>
CommitDate: Fri Nov 12 11:09:11 2021 +0100

    fix assertion with scaled alpha image in SkiaSalBitmap
    
    The size of the alpha image does not really depend in mPixelsSize,
    it's created on demand and it's just necessary to check if it
    has the right size.
    
    Change-Id: Ic16c7c2b202be31c22b21b0c5ee720bda955bbbd
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125059
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lu...@collabora.com>

diff --git a/vcl/inc/skia/salbmp.hxx b/vcl/inc/skia/salbmp.hxx
index 91b11ab6255b..455414fdd7fa 100644
--- a/vcl/inc/skia/salbmp.hxx
+++ b/vcl/inc/skia/salbmp.hxx
@@ -96,6 +96,7 @@ public:
     bool unittestHasImage() const { return mImage.get(); }
     bool unittestHasAlphaImage() const { return mAlphaImage.get(); }
     bool unittestHasEraseColor() const { return mEraseColorSet; }
+    bool unittestHasPendingScale() const { return mSize != mPixelsSize; }
     const sal_uInt8* unittestGetBuffer() const { return mBuffer.get(); }
     const SkImage* unittestGetImage() const { return mImage.get(); }
     const SkImage* unittestGetAlphaImage() const { return mAlphaImage.get(); }
diff --git a/vcl/qa/cppunit/skia/skia.cxx b/vcl/qa/cppunit/skia/skia.cxx
index 4ff70306b3fe..128829aecc18 100644
--- a/vcl/qa/cppunit/skia/skia.cxx
+++ b/vcl/qa/cppunit/skia/skia.cxx
@@ -42,6 +42,7 @@ public:
     void testBitmapCopyOnWrite();
     void testMatrixQuality();
     void testDelayedScale();
+    void testDelayedScaleAlphaImage();
     void testTdf137329();
     void testTdf140848();
     void testTdf132367();
@@ -54,6 +55,7 @@ public:
     CPPUNIT_TEST(testBitmapCopyOnWrite);
     CPPUNIT_TEST(testMatrixQuality);
     CPPUNIT_TEST(testDelayedScale);
+    CPPUNIT_TEST(testDelayedScaleAlphaImage);
     CPPUNIT_TEST(testTdf137329);
     CPPUNIT_TEST(testTdf140848);
     CPPUNIT_TEST(testTdf132367);
@@ -372,6 +374,61 @@ void SkiaTest::testDelayedScale()
     skiaBitmap2.ReleaseBuffer(buffer2, BitmapAccessMode::Read);
 }
 
+void SkiaTest::testDelayedScaleAlphaImage()
+{
+    if (!SkiaHelper::isVCLSkiaEnabled())
+        return;
+    auto bitmapTmp = std::make_unique<SkiaSalBitmap>();
+    CPPUNIT_ASSERT(bitmapTmp->Create(Size(10, 10), vcl::PixelFormat::N24_BPP, 
BitmapPalette()));
+    bitmapTmp->Erase(COL_RED);
+    // Create a bitmap that has only an image, not a pixel buffer.
+    SkiaSalBitmap bitmap(bitmapTmp->GetSkImage());
+    bitmapTmp.release();
+    CPPUNIT_ASSERT(!bitmap.unittestHasBuffer());
+    CPPUNIT_ASSERT(bitmap.unittestHasImage());
+    CPPUNIT_ASSERT(!bitmap.unittestHasAlphaImage());
+    // Set up pending scale.
+    CPPUNIT_ASSERT(bitmap.Scale(2.0, 2.0, BmpScaleFlag::Fast));
+    CPPUNIT_ASSERT(bitmap.unittestHasPendingScale());
+    CPPUNIT_ASSERT(bitmap.InterpretAs8Bit());
+    // Ask for SkImage and make sure it's scaled up.
+    sk_sp<SkImage> image = bitmap.GetSkImage();
+    CPPUNIT_ASSERT_EQUAL(20, image->width());
+    // Ask again, this time it should be cached.
+    sk_sp<SkImage> image2 = bitmap.GetSkImage();
+    CPPUNIT_ASSERT_EQUAL(image.get(), image2.get());
+    // Add another scale.
+    CPPUNIT_ASSERT(bitmap.Scale(3.0, 3.0, BmpScaleFlag::Fast));
+    // Ask for alpha SkImage and make sure it's scaled up.
+    sk_sp<SkImage> alphaImage = bitmap.GetAlphaSkImage();
+    CPPUNIT_ASSERT_EQUAL(60, alphaImage->width());
+    // Ask again, this time it should be cached.
+    sk_sp<SkImage> alphaImage2 = bitmap.GetAlphaSkImage();
+    CPPUNIT_ASSERT_EQUAL(alphaImage.get(), alphaImage2.get());
+    // Ask again for non-alpha image, it should be scaled again.
+    sk_sp<SkImage> image3 = bitmap.GetSkImage();
+    CPPUNIT_ASSERT_EQUAL(60, image3->width());
+    CPPUNIT_ASSERT(image3.get() != image2.get());
+    CPPUNIT_ASSERT(image3.get() != image.get());
+    // Create pixel buffer from the image (it should convert from alpha image 
because the bitmap is 8bpp
+    // and the alpha image size matches).
+    SkiaSalBitmap bitmapCopy;
+    bitmapCopy.Create(bitmap);
+    CPPUNIT_ASSERT(!bitmap.unittestHasBuffer());
+    BitmapBuffer* buffer1 = bitmap.AcquireBuffer(BitmapAccessMode::Read);
+    CPPUNIT_ASSERT(bitmap.unittestHasBuffer());
+    bitmap.ReleaseBuffer(buffer1, BitmapAccessMode::Read);
+    CPPUNIT_ASSERT_EQUAL(Size(60, 60), bitmap.GetSize());
+    // Scale the copy before the buffer was created (this time it should 
convert from non-alpha image
+    // because of the different size).
+    CPPUNIT_ASSERT(!bitmapCopy.unittestHasBuffer());
+    CPPUNIT_ASSERT(bitmapCopy.Scale(4.0, 4.0, BmpScaleFlag::Fast));
+    BitmapBuffer* buffer2 = bitmapCopy.AcquireBuffer(BitmapAccessMode::Read);
+    CPPUNIT_ASSERT(bitmapCopy.unittestHasBuffer());
+    bitmapCopy.ReleaseBuffer(buffer2, BitmapAccessMode::Read);
+    CPPUNIT_ASSERT_EQUAL(Size(240, 240), bitmapCopy.GetSize());
+}
+
 void SkiaTest::testTdf137329()
 {
     if (!SkiaHelper::isVCLSkiaEnabled())
diff --git a/vcl/skia/salbmp.cxx b/vcl/skia/salbmp.cxx
index abcfb0326e3a..31a369724259 100644
--- a/vcl/skia/salbmp.cxx
+++ b/vcl/skia/salbmp.cxx
@@ -831,7 +831,7 @@ const sk_sp<SkImage>& SkiaSalBitmap::GetAlphaSkImage() const
     }
     if (mAlphaImage)
     {
-        assert(mSize == mPixelsSize); // data has already been scaled if needed
+        assert(imageSize(mAlphaImage) == mSize); // data has already been 
scaled if needed
         return mAlphaImage;
     }
     if (mImage)

Reply via email to