Alexandre Julliard : gdi32: Only store a total visible region when it' s a combination of other regions.

Alexandre Julliard julliard at winehq.org
Wed Dec 7 13:57:12 CST 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Dec  7 17:05:07 2011 +0100

gdi32: Only store a total visible region when it's a combination of other regions.

---

 dlls/gdi32/clipping.c    |   50 +++++++++++++++++++++++----------------------
 dlls/gdi32/gdi_private.h |    4 ++-
 2 files changed, 29 insertions(+), 25 deletions(-)

diff --git a/dlls/gdi32/clipping.c b/dlls/gdi32/clipping.c
index 41590bd..0f41a2e 100644
--- a/dlls/gdi32/clipping.c
+++ b/dlls/gdi32/clipping.c
@@ -71,12 +71,11 @@ BOOL clip_visrect( DC *dc, RECT *dst, const RECT *src )
 {
     RECT clip;
 
-    if (!GetRgnBox( get_dc_region(dc), &clip ))
-    {
-        *dst = *src;
-        return !is_rect_empty( dst );
-    }
-    return intersect_rect( dst, src, &clip );
+    if (get_dc_visrect( dc, &clip )) intersect_rect( dst, src, &clip );
+    else *dst = *src;
+
+    if (GetRgnBox( get_dc_region(dc), &clip )) intersect_rect( dst, dst, &clip );
+    return !is_rect_empty( dst );
 }
 
 /***********************************************************************
@@ -87,7 +86,6 @@ BOOL clip_visrect( DC *dc, RECT *dst, const RECT *src )
 void CLIPPING_UpdateGCRegion( DC * dc )
 {
     HRGN clip_rgn;
-    RECT visrect;
     PHYSDEV physdev = GET_DC_PHYSDEV( dc, pSetDeviceClipping );
 
     /* update the intersection of meta and clip regions */
@@ -102,23 +100,17 @@ void CLIPPING_UpdateGCRegion( DC * dc )
         dc->hMetaClipRgn = 0;
     }
     clip_rgn = get_clip_region( dc );
-    if (dc->hVisRgn)
+    if (clip_rgn && dc->hVisRgn)
     {
         if (!dc->region) dc->region = CreateRectRgn( 0, 0, 0, 0 );
         CombineRgn( dc->region, dc->hVisRgn, clip_rgn, clip_rgn ? RGN_AND : RGN_COPY );
     }
-    else if (get_dc_visrect( dc, &visrect ))
-    {
-        if (!dc->region) dc->region = CreateRectRgn( 0, 0, 0, 0 );
-        SetRectRgn( dc->region, visrect.left, visrect.top, visrect.right, visrect.bottom );
-        if (clip_rgn) CombineRgn( dc->region, dc->region, clip_rgn, RGN_AND );
-    }
     else
     {
         if (dc->region) DeleteObject( dc->region );
         dc->region = 0;
     }
-    physdev->funcs->pSetDeviceClipping( physdev, dc->region );
+    physdev->funcs->pSetDeviceClipping( physdev, get_dc_region( dc ));
 }
 
 /***********************************************************************
@@ -132,11 +124,8 @@ static inline void create_default_clip_region( DC * dc )
 
     if (dc->header.type == OBJ_MEMDC)
     {
-        BITMAP bitmap;
-
-        GetObjectW( dc->hBitmap, sizeof(bitmap), &bitmap );
-        width = bitmap.bmWidth;
-        height = bitmap.bmHeight;
+        width = dc->vis_rect.right - dc->vis_rect.left;
+        height = dc->vis_rect.bottom - dc->vis_rect.top;
     }
     else
     {
@@ -369,6 +358,7 @@ INT WINAPI IntersectClipRect( HDC hdc, INT left, INT top, INT right, INT bottom
 BOOL WINAPI PtVisible( HDC hdc, INT x, INT y )
 {
     POINT pt;
+    RECT visrect;
     BOOL ret;
     DC *dc = get_dc_ptr( hdc );
 
@@ -379,7 +369,10 @@ BOOL WINAPI PtVisible( HDC hdc, INT x, INT y )
     pt.y = y;
     LPtoDP( hdc, &pt, 1 );
     update_dc( dc );
-    ret = PtInRegion( get_dc_region(dc), pt.x, pt.y );
+    ret = (get_dc_visrect( dc, &visrect ) &&
+           pt.x >= visrect.left && pt.x < visrect.right &&
+           pt.y >= visrect.top && pt.y < visrect.bottom);
+    if (ret && get_dc_region( dc )) ret = PtInRegion( get_dc_region( dc ), pt.x, pt.y );
     release_dc_ptr( dc );
     return ret;
 }
@@ -390,7 +383,7 @@ BOOL WINAPI PtVisible( HDC hdc, INT x, INT y )
  */
 BOOL WINAPI RectVisible( HDC hdc, const RECT* rect )
 {
-    RECT tmpRect;
+    RECT tmpRect, visrect;
     BOOL ret;
     DC *dc = get_dc_ptr( hdc );
     if (!dc) return FALSE;
@@ -400,7 +393,8 @@ BOOL WINAPI RectVisible( HDC hdc, const RECT* rect )
     LPtoDP( hdc, (POINT *)&tmpRect, 2 );
 
     update_dc( dc );
-    ret = RectInRegion( get_dc_region(dc), &tmpRect );
+    ret = (get_dc_visrect( dc, &visrect ) && intersect_rect( &visrect, &visrect, &tmpRect ));
+    if (ret && get_dc_region( dc )) ret = RectInRegion( get_dc_region( dc ), &tmpRect );
     release_dc_ptr( dc );
     return ret;
 }
@@ -411,12 +405,20 @@ BOOL WINAPI RectVisible( HDC hdc, const RECT* rect )
  */
 INT WINAPI GetClipBox( HDC hdc, LPRECT rect )
 {
+    RECT visrect;
     INT ret;
     DC *dc = get_dc_ptr( hdc );
     if (!dc) return ERROR;
 
     update_dc( dc );
-    ret = GetRgnBox( get_dc_region(dc), rect );
+    if (get_dc_region( dc ))
+    {
+        ret = GetRgnBox( get_dc_region( dc ), rect );
+        if (get_dc_visrect( dc, &visrect ) && !intersect_rect( rect, rect, &visrect ))
+            ret = NULLREGION;
+    }
+    else ret = get_dc_visrect( dc, rect ) ? SIMPLEREGION : NULLREGION;
+
     if (dc->layout & LAYOUT_RTL)
     {
         int tmp = rect->left;
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index f499de0..551a1f0 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -227,7 +227,9 @@ static inline HRGN get_clip_region( DC * dc )
 /* Return the total DC region (if any) */
 static inline HRGN get_dc_region( DC *dc )
 {
-    return dc->region;
+    if (dc->region) return dc->region;
+    if (dc->hVisRgn) return dc->hVisRgn;
+    return get_clip_region( dc );
 }
 
 /* dc.c */




More information about the wine-cvs mailing list