vcl/skia/osx/gdiimpl.cxx |   21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

New commits:
commit d43e2a9214c0d06465a3027231948760e65ad4ee
Author:     Patrick Luby <plub...@neooffice.org>
AuthorDate: Wed Sep 27 10:29:05 2023 -0400
Commit:     Patrick Luby <plub...@neooffice.org>
CommitDate: Wed Sep 27 19:25:59 2023 +0200

    Let SkBitmap determine when it is safe to delete the pixel buffer
    
    Also, make bitmap immutable to avoid making a copy in bitmap.asImage()
    and, just to be safe, flush the canvas after drawing the pixel buffer.
    
    Change-Id: I3ac99cf4acf0bf4c8b274dc73295ca7b9f386c70
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157333
    Tested-by: Jenkins
    Reviewed-by: Patrick Luby <plub...@neooffice.org>

diff --git a/vcl/skia/osx/gdiimpl.cxx b/vcl/skia/osx/gdiimpl.cxx
index abe9befb2fce..e64f84b111bc 100644
--- a/vcl/skia/osx/gdiimpl.cxx
+++ b/vcl/skia/osx/gdiimpl.cxx
@@ -37,6 +37,13 @@
 
 using namespace SkiaHelper;
 
+static void releaseInstalledPixels(void* pAddr, void* pContext)
+{
+    (void)pContext;
+    if (pAddr)
+        delete[] static_cast<sal_uInt8*>(pAddr);
+}
+
 AquaSkiaSalGraphicsImpl::AquaSkiaSalGraphicsImpl(AquaSalGraphics& rParent,
                                                  AquaSharedAttributes& rShared)
     : SkiaSalGraphicsImpl(rParent, rShared.mpFrame)
@@ -232,10 +239,10 @@ bool 
AquaSkiaSalGraphicsImpl::drawNativeControl(ControlType nType, ControlPart n
     const tools::Long width = boundingRegion.GetWidth() * mScaling;
     const tools::Long height = boundingRegion.GetHeight() * mScaling;
     const size_t bytes = width * height * 4;
-    std::unique_ptr<sal_uInt8[]> data(new sal_uInt8[bytes]);
-    memset(data.get(), 0, bytes);
+    sal_uInt8* data = new sal_uInt8[bytes];
+    memset(data, 0, bytes);
     CGContextRef context = CGBitmapContextCreate(
-        data.get(), width, height, 8, width * 4, GetSalData()->mxRGBSpace,
+        data, width, height, 8, width * 4, GetSalData()->mxRGBSpace,
         SkiaToCGBitmapType(mSurface->imageInfo().colorType(), 
kPremul_SkAlphaType));
     if (!context)
     {
@@ -271,13 +278,17 @@ bool 
AquaSkiaSalGraphicsImpl::drawNativeControl(ControlType nType, ControlPart n
     CGContextRelease(context);
     if (bOK)
     {
+        // Let SkBitmap determine when it is safe to delete the pixel buffer
         SkBitmap bitmap;
         if (!bitmap.installPixels(SkImageInfo::Make(width, height,
                                                     
mSurface->imageInfo().colorType(),
                                                     kPremul_SkAlphaType),
-                                  data.get(), width * 4))
+                                  data, width * 4, releaseInstalledPixels, 
nullptr))
             abort();
 
+        // Make bitmap immutable to avoid making a copy in bitmap.asImage()
+        bitmap.setImmutable();
+
         preDraw();
         SAL_INFO("vcl.skia.trace", "drawnativecontrol(" << this << "): " << 
rControlRegion << ":"
                                                         << int(nType) << "/" 
<< int(nPart));
@@ -292,6 +303,8 @@ bool AquaSkiaSalGraphicsImpl::drawNativeControl(ControlType 
nType, ControlPart n
                                            boundingRegion.GetWidth(), 
boundingRegion.GetHeight());
         assert(drawRect.width() * mScaling == bitmap.width()); // no scaling 
should be needed
         getDrawCanvas()->drawImageRect(bitmap.asImage(), drawRect, 
SkSamplingOptions());
+        // Related: tdf#156881 flush the canvas after drawing the pixel buffer
+        getDrawCanvas()->flush();
         ++pendingOperationsToFlush; // tdf#136369
         postDraw();
     }

Reply via email to