[PATCH 1/6] Revert "winemac.drv: Remove now unused -[WineContentView drawRect:]."

Tim Clem tclem at codeweavers.com
Thu Apr 21 15:04:28 CDT 2022


This reverts commit 3f845b34deada0dd58e3674119af47ce85851c24.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52354
Signed-off-by: Tim Clem <tclem at codeweavers.com>
---
There's more discussion on the bug, but in short, it seems that
layer-backed views have some insurmountable issues on High Sierra
and earlier.

 dlls/winemac.drv/cocoa_window.m | 64 +++++++++++++++++++++++++++++++++
 1 file changed, 64 insertions(+)

diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m
index bfa7e2fe8cc..2ee3b862456 100644
--- a/dlls/winemac.drv/cocoa_window.m
+++ b/dlls/winemac.drv/cocoa_window.m
@@ -556,6 +556,70 @@ - (void) viewWillDraw
         [pendingGlContexts removeAllObjects];
     }
 
+    - (void) drawRect:(NSRect)rect
+    {
+        WineWindow* window = (WineWindow*)[self window];
+
+        if ([window contentView] != self)
+            return;
+
+        if (window.surface && window.surface_mutex &&
+            !pthread_mutex_lock(window.surface_mutex))
+        {
+            const CGRect* rects;
+            int count;
+
+            if (get_surface_blit_rects(window.surface, &rects, &count))
+            {
+                CGRect dirtyRect = cgrect_win_from_mac(NSRectToCGRect(rect));
+                NSAffineTransform* xform = [NSAffineTransform transform];
+                CGContextRef context;
+                int i;
+
+                [xform translateXBy:0.0 yBy:self.bounds.size.height];
+                [xform scaleXBy:1.0 yBy:-1.0];
+                [xform concat];
+
+                context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
+                CGContextSetBlendMode(context, kCGBlendModeCopy);
+                CGContextSetInterpolationQuality(context, retina_on ? kCGInterpolationHigh : kCGInterpolationNone);
+
+                for (i = 0; i < count; i++)
+                {
+                    CGRect imageRect;
+                    CGImageRef image;
+
+                    imageRect = CGRectIntersection(rects[i], dirtyRect);
+                    image = create_surface_image(window.surface, &imageRect, FALSE, window.colorKeyed,
+                                                 window.colorKeyRed, window.colorKeyGreen, window.colorKeyBlue);
+
+                    if (image)
+                    {
+                        // Account for the flipped coordinate system.
+                        imageRect = cgrect_mac_from_win(imageRect);
+                        imageRect.origin.y = self.bounds.size.height - imageRect.origin.y - imageRect.size.height;
+                        CGContextDrawImage(context, imageRect, image);
+
+                        CGImageRelease(image);
+                    }
+                }
+
+                [window windowDidDrawContent];
+            }
+
+            pthread_mutex_unlock(window.surface_mutex);
+        }
+
+        // If the window may be transparent, then we have to invalidate the
+        // shadow every time we draw.  Also, if this is the first time we've
+        // drawn since changing from transparent to opaque.
+        if (window.drawnSinceShown && (window.colorKeyed || window.usePerPixelAlpha || window.shapeChangedSinceLastDraw))
+        {
+            window.shapeChangedSinceLastDraw = FALSE;
+            [window invalidateShadow];
+        }
+    }
+
     - (void) addGLContext:(WineOpenGLContext*)context
     {
         BOOL hadContext = _everHadGLContext;
-- 
2.34.1




More information about the wine-devel mailing list