Ken Thomases : winemac: Draw surface region rects separately instead of clipping one big draw.

Alexandre Julliard julliard at winehq.org
Fri Mar 29 12:17:58 CDT 2013


Module: wine
Branch: master
Commit: 0e8b30502341ee9483d5f4cbc5878ae4a4787e1e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0e8b30502341ee9483d5f4cbc5878ae4a4787e1e

Author: Ken Thomases <ken at codeweavers.com>
Date:   Thu Mar 28 23:34:03 2013 -0500

winemac: Draw surface region rects separately instead of clipping one big draw.

---

 dlls/winemac.drv/cocoa_window.m |   66 ++++++++++++++++++++------------------
 1 files changed, 35 insertions(+), 31 deletions(-)

diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m
index 48ca593..279f81f 100644
--- a/dlls/winemac.drv/cocoa_window.m
+++ b/dlls/winemac.drv/cocoa_window.m
@@ -186,51 +186,55 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
         if (window.surface && window.surface_mutex &&
             !pthread_mutex_lock(window.surface_mutex))
         {
+            CGRect bounds;
             const CGRect* rects;
             int count;
 
-            if (!get_surface_region_rects(window.surface, &rects, &count) || count)
+            if (!get_surface_region_rects(window.surface, &rects, &count))
             {
-                CGRect imageRect;
-                CGImageRef image;
+                bounds = NSRectToCGRect([self bounds]);
+                rects = &bounds;
+                count = 1;
+            }
 
-                imageRect = NSRectToCGRect(rect);
-                image = create_surface_image(window.surface, &imageRect, FALSE);
+            if (count)
+            {
+                CGContextRef context;
+                int i;
 
-                if (image)
-                {
-                    CGContextRef context;
+                [window.shape addClip];
 
-                    if (rects && count)
-                    {
-                        NSBezierPath* surfaceClip = [NSBezierPath bezierPath];
-                        int i;
-                        for (i = 0; i < count; i++)
-                            [surfaceClip appendBezierPathWithRect:NSRectFromCGRect(rects[i])];
-                        [surfaceClip addClip];
-                    }
+                context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
+                CGContextSetBlendMode(context, kCGBlendModeCopy);
 
-                    [window.shape addClip];
+                for (i = 0; i < count; i++)
+                {
+                    CGRect imageRect;
+                    CGImageRef image;
+
+                    imageRect = CGRectIntersection(rects[i], NSRectToCGRect(rect));
+                    image = create_surface_image(window.surface, &imageRect, FALSE);
 
-                    if (window.colorKeyed)
+                    if (image)
                     {
-                        CGImageRef maskedImage;
-                        CGFloat components[] = { window.colorKeyRed - 0.5, window.colorKeyRed + 0.5,
-                                                 window.colorKeyGreen - 0.5, window.colorKeyGreen + 0.5,
-                                                 window.colorKeyBlue - 0.5, window.colorKeyBlue + 0.5 };
-                        maskedImage = CGImageCreateWithMaskingColors(image, components);
-                        if (maskedImage)
+                        if (window.colorKeyed)
                         {
-                            CGImageRelease(image);
-                            image = maskedImage;
+                            CGImageRef maskedImage;
+                            CGFloat components[] = { window.colorKeyRed - 0.5, window.colorKeyRed + 0.5,
+                                                     window.colorKeyGreen - 0.5, window.colorKeyGreen + 0.5,
+                                                     window.colorKeyBlue - 0.5, window.colorKeyBlue + 0.5 };
+                            maskedImage = CGImageCreateWithMaskingColors(image, components);
+                            if (maskedImage)
+                            {
+                                CGImageRelease(image);
+                                image = maskedImage;
+                            }
                         }
-                    }
 
-                    context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
-                    CGContextSetBlendMode(context, kCGBlendModeCopy);
-                    CGContextDrawImage(context, imageRect, image);
+                        CGContextDrawImage(context, imageRect, image);
 
-                    CGImageRelease(image);
+                        CGImageRelease(image);
+                    }
                 }
             }
 




More information about the wine-cvs mailing list