[Libreoffice-commits] core.git: vcl/quartz

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Tue Dec 11 14:50:07 UTC 2018


 vcl/quartz/salgdiutils.cxx |  100 +++++++++++++++++++++++++--------------------
 vcl/quartz/salvd.cxx       |   43 +++++++------------
 2 files changed, 73 insertions(+), 70 deletions(-)

New commits:
commit b14371703236160bf34480ef831e9b2244e140ee
Author:     Jan-Marek Glogowski <glogow at fbihome.de>
AuthorDate: Tue Dec 11 10:48:44 2018 +0100
Commit:     Jan-Marek Glogowski <glogow at fbihome.de>
CommitDate: Tue Dec 11 15:49:42 2018 +0100

    OSX always fall back to a bitmap context
    
    I'm not sure this is the best idea, but without a context many
    things will definitly break. In theory this is just needed for
    bitmap-only rendering mode.
    
    This is a more general solution of commit e659c6a1857f ("Work
    around odd macOS 10.14 graphicsContextWithWindow failure").
    
    Change-Id: I3708c25b302a38e1b0c0cccbcacd6cb9b5ff33dc
    Reviewed-on: https://gerrit.libreoffice.org/64952
    Tested-by: Jenkins
    Reviewed-by: Jan-Marek Glogowski <glogow at fbihome.de>

diff --git a/vcl/quartz/salgdiutils.cxx b/vcl/quartz/salgdiutils.cxx
index 6ef9a2430c29..2218d3e936a4 100644
--- a/vcl/quartz/salgdiutils.cxx
+++ b/vcl/quartz/salgdiutils.cxx
@@ -94,13 +94,12 @@ void AquaSalGraphics::UnsetState()
  */
 bool AquaSalGraphics::CheckContext()
 {
-    if( mbWindow && mpFrame && mpFrame->getNSWindow() )
+    if (mbWindow && mpFrame && (mpFrame->getNSWindow() || Application::IsBitmapRendering()))
     {
         const unsigned int nWidth = mpFrame->maGeometry.nWidth;
         const unsigned int nHeight = mpFrame->maGeometry.nHeight;
 
-        CGContextRef rReleaseContext = nullptr;
-        CGLayerRef   rReleaseLayer = nullptr;
+        CGLayerRef rReleaseLayer = nullptr;
 
         // check if a new drawing context is needed (e.g. after a resize)
         if( (unsigned(mnWidth) != nWidth) || (unsigned(mnHeight) != nHeight) )
@@ -108,62 +107,77 @@ bool AquaSalGraphics::CheckContext()
             mnWidth = nWidth;
             mnHeight = nHeight;
             // prepare to release the corresponding resources
-            rReleaseContext = mrContext;
-            rReleaseLayer   = mxLayer;
+            if (mxLayer)
+                rReleaseLayer = mxLayer;
+            else if (mrContext)
+            {
+                SAL_INFO("vcl.cg", "CGContextRelease(" << mrContext << ")");
+                CGContextRelease(mrContext);
+            }
             mrContext = nullptr;
             mxLayer = nullptr;
         }
 
-        if( !mrContext )
+        if (!mrContext)
         {
-            const CGSize aLayerSize = { static_cast<CGFloat>(nWidth), static_cast<CGFloat>(nHeight) };
-            NSGraphicsContext* pNSGContext = [NSGraphicsContext graphicsContextWithWindow: mpFrame->getNSWindow()];
+            if (mpFrame->getNSWindow())
+            {
+                const CGSize aLayerSize = { static_cast<CGFloat>(nWidth), static_cast<CGFloat>(nHeight) };
+                NSGraphicsContext* pNSGContext = [NSGraphicsContext graphicsContextWithWindow: mpFrame->getNSWindow()];
 SAL_WNODEPRECATED_DECLARATIONS_PUSH // 'graphicsPort' is deprecated: first deprecated in macOS 10.14
-            CGContextRef xCGContext = static_cast<CGContextRef>([pNSGContext graphicsPort]);
+                CGContextRef xCGContext = static_cast<CGContextRef>([pNSGContext graphicsPort]);
 SAL_WNODEPRECATED_DECLARATIONS_POP
-            mxLayer = CGLayerCreateWithContext( xCGContext, aLayerSize, nullptr );
-            SAL_INFO( "vcl.cg", "CGLayerCreateWithContext(" << xCGContext << "," << aLayerSize << ",NULL) = " << mxLayer );
-            if( mxLayer )
-            {
-                mrContext = CGLayerGetContext( mxLayer );
-                SAL_INFO( "vcl.cg", "CGLayerGetContext(" << mxLayer << ") = " << mrContext );
-            }
+                mxLayer = CGLayerCreateWithContext(xCGContext, aLayerSize, nullptr);
+                SAL_INFO("vcl.cg", "CGLayerCreateWithContext(" << xCGContext << "," << aLayerSize << ",NULL) = " << mxLayer);
+                if (mxLayer)
+                {
+                    mrContext = CGLayerGetContext( mxLayer );
+                    SAL_INFO( "vcl.cg", "CGLayerGetContext(" << mxLayer << ") = " << mrContext );
+                }
 
-            if( mrContext )
-            {
-                // copy original layer to resized layer
-                if( rReleaseLayer )
+                if (rReleaseLayer)
                 {
-                    SAL_INFO( "vcl.cg", "CGContextDrawLayerAtPoint(" << mrContext << "," << CGPointZero << "," << rReleaseLayer << ")" );
-                    CGContextDrawLayerAtPoint( mrContext, CGPointZero, rReleaseLayer );
+                    // copy original layer to resized layer
+                    if (mrContext)
+                    {
+                        SAL_INFO("vcl.cg", "CGContextDrawLayerAtPoint(" << mrContext << "," << CGPointZero << "," << rReleaseLayer << ")");
+                        CGContextDrawLayerAtPoint(mrContext, CGPointZero, rReleaseLayer);
+                    }
+                    SAL_INFO("vcl.cg", "CGLayerRelease(" << rReleaseLayer << ")");
+                    CGLayerRelease(rReleaseLayer);
                 }
+            }
+            else
+            {
+                assert(Application::IsBitmapRendering());
+                const int nBitmapDepth = 32;
+                const int nBytesPerRow = (nBitmapDepth * mnWidth) / 8;
+                void* pRawData = std::malloc(nBytesPerRow * mnHeight);
+                const int nFlags = kCGImageAlphaNoneSkipFirst;
+#ifndef MACOSX
+                nFlags |= kCGImageByteOrder32Little;
+#endif
+                mrContext = CGBitmapContextCreate(pRawData, mnWidth, mnHeight, 8, nBytesPerRow,
+                                                  GetSalData()->mxRGBSpace, nFlags);
+                SAL_INFO("vcl.cg", "CGBitmapContextCreate(" << mnWidth << "x" << mnHeight
+                                   << "x" << nBitmapDepth << ") = " << mrContext);
+            }
 
-                CGContextTranslateCTM( mrContext, 0, nHeight );
-                CGContextScaleCTM( mrContext, 1.0, -1.0 );
-                CGContextSetFillColorSpace( mrContext, GetSalData()->mxRGBSpace );
-                CGContextSetStrokeColorSpace( mrContext, GetSalData()->mxRGBSpace );
-                SAL_INFO( "vcl.cg", "CGContextSaveGState(" << mrContext << ") " << ++mnContextStackDepth );
-                CGContextSaveGState( mrContext );
+            if (mrContext)
+            {
+                CGContextTranslateCTM(mrContext, 0, nHeight);
+                CGContextScaleCTM(mrContext, 1.0, -1.0);
+                CGContextSetFillColorSpace(mrContext, GetSalData()->mxRGBSpace);
+                CGContextSetStrokeColorSpace(mrContext, GetSalData()->mxRGBSpace);
+                SAL_INFO("vcl.cg", "CGContextSaveGState(" << mrContext << ") " << ++mnContextStackDepth);
+                CGContextSaveGState(mrContext);
                 SetState();
 
                 // re-enable XOR emulation for the new context
-                if( mpXorEmulation )
-                {
-                    mpXorEmulation->SetTarget( mnWidth, mnHeight, mnBitmapDepth, mrContext, mxLayer );
-                }
+                if (mpXorEmulation)
+                    mpXorEmulation->SetTarget(mnWidth, mnHeight, mnBitmapDepth, mrContext, mxLayer);
             }
         }
-
-        if( rReleaseLayer )
-        {
-            SAL_INFO( "vcl.cg", "CGLayerRelease(" << rReleaseLayer << ")" );
-            CGLayerRelease( rReleaseLayer );
-        }
-        else if( rReleaseContext )
-        {
-            SAL_INFO( "vcl.cg", "CGContextRelease(" << rReleaseContext << ")" );
-            CGContextRelease( rReleaseContext );
-        }
     }
 
     SAL_WARN_IF( !mrContext && !mbPrinter, "vcl", "<<<WARNING>>> AquaSalGraphics::CheckContext() FAILED!!!!" );
diff --git a/vcl/quartz/salvd.cxx b/vcl/quartz/salvd.cxx
index f376fc4200e2..5f2422d6f455 100644
--- a/vcl/quartz/salvd.cxx
+++ b/vcl/quartz/salvd.cxx
@@ -268,36 +268,25 @@ SAL_WNODEPRECATED_DECLARATIONS_PUSH // 'graphicsPort' is deprecated: first depre
 SAL_WNODEPRECATED_DECLARATIONS_POP
                 }
             }
-            // At least on macOS 10.14 during CppunitTests (that have hidden windows), it happens
-            // that the above
-            //
-            //   [NSGraphicsContext graphicsContextWithWindow: pNSWindow]
-            //
-            // returns nil for unclear reasons; so use the below fallback even if there is a
-            // pNSWindow but obtaining a graphics context for it fails:
-            if (xCGContext == nullptr)
-            {
-                // fall back to a bitmap context
-                mnBitmapDepth = 32;
-
-                const int nBytesPerRow = (mnBitmapDepth * nDX) / 8;
-                void* pRawData = std::malloc( nBytesPerRow * nDY );
-                mxBitmapContext = CGBitmapContextCreate( pRawData, nDX, nDY,
-                                                         8, nBytesPerRow, GetSalData()->mxRGBSpace, kCGImageAlphaNoneSkipFirst );
-                SAL_INFO( "vcl.cg",  "CGBitmapContextCreate(" << nDX << "x" << nDY << "x32) = " << mxBitmapContext );
-                xCGContext = mxBitmapContext;
-            }
         }
-#else
-        mnBitmapDepth = 32;
+#endif
 
-        const int nBytesPerRow = (mnBitmapDepth * nDX) / 8;
-        void* pRawData = std::malloc( nBytesPerRow * nDY );
-        mxBitmapContext = CGBitmapContextCreate( pRawData, nDX, nDY,
-                                                 8, nBytesPerRow, GetSalData()->mxRGBSpace, kCGImageAlphaNoneSkipFirst | kCGImageByteOrder32Little );
-        SAL_INFO( "vcl.cg",  "CGBitmapContextCreate(" << nDX << "x" << nDY << "x32) = " << mxBitmapContext );
-        xCGContext = mxBitmapContext;
+        if (!xCGContext)
+        {
+            assert(Application::IsBitmapRendering());
+            mnBitmapDepth = 32;
+
+            const int nBytesPerRow = (mnBitmapDepth * nDX) / 8;
+            void* pRawData = std::malloc( nBytesPerRow * nDY );
+            const int nFlags = kCGImageAlphaNoneSkipFirst;
+#ifndef MACOSX
+            nFlags |= kCGImageByteOrder32Little;
 #endif
+            mxBitmapContext = CGBitmapContextCreate(pRawData, nDX, nDY, 8, nBytesPerRow,
+                                                    GetSalData()->mxRGBSpace, nFlags);
+            SAL_INFO( "vcl.cg", "CGBitmapContextCreate(" << nDX << "x" << nDY << "x32) = " << mxBitmapContext );
+            xCGContext = mxBitmapContext;
+        }
     }
 
     SAL_WARN_IF( !xCGContext, "vcl.quartz", "No context" );


More information about the Libreoffice-commits mailing list