[Libreoffice-commits] core.git: 2 commits - vcl/skia

Luboš Luňák (via logerrit) logerrit at kemper.freedesktop.org
Wed Apr 1 10:49:55 UTC 2020


 vcl/skia/gdiimpl.cxx |   70 +++++++++++++++++++++++++++------------------------
 1 file changed, 38 insertions(+), 32 deletions(-)

New commits:
commit 97c468daae242ef8d62edb0942cb52ef4a2a1ebb
Author:     Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Wed Apr 1 11:07:30 2020 +0200
Commit:     Luboš Luňák <l.lunak at collabora.com>
CommitDate: Wed Apr 1 12:49:32 2020 +0200

    handle weird semantics of SkRect::intersect() (tdf#131721)
    
    If the two rectangles do not intersect, it only returns false and does
    nothing, which is stupid and confusing.
    
    Change-Id: I24de6059807c208c39db4e942ab5624dde788723
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/91471
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lunak at collabora.com>

diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index 390bf521336b..53ccda65c1d5 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -324,44 +324,50 @@ void SkiaSalGraphicsImpl::postDraw()
         {
             // Make slightly larger, just in case (rounding, antialiasing,...).
             mXorExtents.outset(2, 2);
-            mXorExtents.intersect(SkRect::MakeXYWH(0, 0, mSurface->width(), mSurface->height()));
+            if (!mXorExtents.intersect(
+                    SkRect::MakeXYWH(0, 0, mSurface->width(), mSurface->height())))
+                mXorExtents.setEmpty();
         }
         SAL_INFO("vcl.skia.trace",
                  "applyxor(" << this << "): "
                              << tools::Rectangle(mXorExtents.left(), mXorExtents.top(),
                                                  mXorExtents.right(), mXorExtents.bottom()));
-        // Copy the surface contents to another pixmap.
-        SkBitmap surfaceBitmap;
-        // Use unpremultiplied alpha format, so that we do not have to do the conversions to get
-        // the RGB and back (Skia will do it when converting, but it'll be presumably faster at it).
-        if (!surfaceBitmap.tryAllocPixels(
-                mSurface->imageInfo().makeAlphaType(kUnpremul_SkAlphaType)))
-            abort();
-        SkPaint paint;
-        paint.setBlendMode(SkBlendMode::kSrc); // copy as is
-        SkCanvas canvas(surfaceBitmap);
-        canvas.drawImageRect(mSurface->makeImageSnapshot(), mXorExtents, mXorExtents, &paint);
-        // xor to surfaceBitmap
-        assert(surfaceBitmap.info().alphaType() == kUnpremul_SkAlphaType);
-        assert(mXorBitmap.info().alphaType() == kUnpremul_SkAlphaType);
-        assert(surfaceBitmap.bytesPerPixel() == 4);
-        assert(mXorBitmap.bytesPerPixel() == 4);
-        for (int y = mXorExtents.top(); y < mXorExtents.bottom(); ++y)
+        if (!mXorExtents.isEmpty()) // the intersection above may be empty
         {
-            uint8_t* data = static_cast<uint8_t*>(surfaceBitmap.getAddr(mXorExtents.x(), y));
-            const uint8_t* xordata = static_cast<uint8_t*>(mXorBitmap.getAddr(mXorExtents.x(), y));
-            for (int x = 0; x < mXorExtents.width(); ++x)
+            // Copy the surface contents to another pixmap.
+            SkBitmap surfaceBitmap;
+            // Use unpremultiplied alpha format, so that we do not have to do the conversions to get
+            // the RGB and back (Skia will do it when converting, but it'll be presumably faster at it).
+            if (!surfaceBitmap.tryAllocPixels(
+                    mSurface->imageInfo().makeAlphaType(kUnpremul_SkAlphaType)))
+                abort();
+            SkPaint paint;
+            paint.setBlendMode(SkBlendMode::kSrc); // copy as is
+            SkCanvas canvas(surfaceBitmap);
+            canvas.drawImageRect(mSurface->makeImageSnapshot(), mXorExtents, mXorExtents, &paint);
+            // xor to surfaceBitmap
+            assert(surfaceBitmap.info().alphaType() == kUnpremul_SkAlphaType);
+            assert(mXorBitmap.info().alphaType() == kUnpremul_SkAlphaType);
+            assert(surfaceBitmap.bytesPerPixel() == 4);
+            assert(mXorBitmap.bytesPerPixel() == 4);
+            for (int y = mXorExtents.top(); y < mXorExtents.bottom(); ++y)
             {
-                *data++ ^= *xordata++;
-                *data++ ^= *xordata++;
-                *data++ ^= *xordata++;
-                // alpha is not xor-ed
-                data++;
-                xordata++;
+                uint8_t* data = static_cast<uint8_t*>(surfaceBitmap.getAddr(mXorExtents.x(), y));
+                const uint8_t* xordata
+                    = static_cast<uint8_t*>(mXorBitmap.getAddr(mXorExtents.x(), y));
+                for (int x = 0; x < mXorExtents.width(); ++x)
+                {
+                    *data++ ^= *xordata++;
+                    *data++ ^= *xordata++;
+                    *data++ ^= *xordata++;
+                    // alpha is not xor-ed
+                    data++;
+                    xordata++;
+                }
             }
+            surfaceBitmap.notifyPixelsChanged();
+            mSurface->getCanvas()->drawBitmapRect(surfaceBitmap, mXorExtents, mXorExtents, &paint);
         }
-        surfaceBitmap.notifyPixelsChanged();
-        mSurface->getCanvas()->drawBitmapRect(surfaceBitmap, mXorExtents, mXorExtents, &paint);
         mXorCanvas.reset();
         mXorBitmap.reset();
         mXorExtents.setEmpty();
commit a0e8c9d27a7a7d5415d8555176c830e56662a95f
Author:     Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Thu Mar 26 15:04:18 2020 +0100
Commit:     Luboš Luňák <l.lunak at collabora.com>
CommitDate: Wed Apr 1 12:49:17 2020 +0200

    fix incorrect tools::Rectangle ctor usage
    
    Change-Id: I3633a5d6f3d15b8ec32a831cc0566cb66a208892
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/91470
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lunak at collabora.com>

diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index dedd0839a3a9..390bf521336b 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -1283,9 +1283,9 @@ void SkiaSalGraphicsImpl::drawGenericLayout(const GenericSalLayout& layout, Colo
     preDraw();
     SAL_INFO("vcl.skia.trace",
              "drawtextblob(" << this << "): "
-                             << tools::Rectangle(textBlob->bounds().x(), textBlob->bounds().y(),
-                                                 textBlob->bounds().width(),
-                                                 textBlob->bounds().height())
+                             << tools::Rectangle(
+                                    Point(textBlob->bounds().x(), textBlob->bounds().y()),
+                                    Size(textBlob->bounds().width(), textBlob->bounds().height()))
                              << ":" << textColor);
     SkPaint paint;
     paint.setColor(toSkColor(textColor));


More information about the Libreoffice-commits mailing list