This reverts commit 3f845b34deada0dd58e3674119af47ce85851c24.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52354 Signed-off-by: Tim Clem tclem@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;