Alexandre Julliard : winex11: Add helper functions for changing and restoring the current clipping region .

Alexandre Julliard julliard at winehq.org
Fri Jul 22 10:15:56 CDT 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jul 21 19:03:10 2011 +0200

winex11: Add helper functions for changing and restoring the current clipping region.

---

 dlls/winex11.drv/graphics.c |   51 ++++++++++++++++++++++++++++++++++++------
 dlls/winex11.drv/text.c     |   16 ++-----------
 dlls/winex11.drv/x11drv.h   |    2 +
 dlls/winex11.drv/xrender.c  |   16 ++-----------
 4 files changed, 51 insertions(+), 34 deletions(-)

diff --git a/dlls/winex11.drv/graphics.c b/dlls/winex11.drv/graphics.c
index e867670..7c4e0d5 100644
--- a/dlls/winex11.drv/graphics.c
+++ b/dlls/winex11.drv/graphics.c
@@ -185,27 +185,62 @@ RGNDATA *X11DRV_GetRegionData( HRGN hrgn, HDC hdc_lptodp )
 }
 
 
-/***********************************************************************
- *           X11DRV_SetDeviceClipping
- */
-void X11DRV_SetDeviceClipping( PHYSDEV dev, HRGN vis_rgn, HRGN clip_rgn )
+static void update_x11_clipping( X11DRV_PDEVICE *physDev )
 {
-    X11DRV_PDEVICE *physDev = get_x11drv_dev( dev );
     RGNDATA *data;
 
-    CombineRgn( physDev->region, vis_rgn, clip_rgn, clip_rgn ? RGN_AND : RGN_COPY );
     if (!(data = X11DRV_GetRegionData( physDev->region, 0 ))) return;
-
     wine_tsx11_lock();
     XSetClipRectangles( gdi_display, physDev->gc, physDev->dc_rect.left, physDev->dc_rect.top,
                         (XRectangle *)data->Buffer, data->rdh.nCount, YXBanded );
     wine_tsx11_unlock();
 
     if (physDev->xrender) X11DRV_XRender_SetDeviceClipping(physDev, data);
-
     HeapFree( GetProcessHeap(), 0, data );
 }
 
+/***********************************************************************
+ *           add_extra_clipping_region
+ *
+ * Temporarily add a region to the current clipping region.
+ * The returned region must be restored with restore_clipping_region.
+ */
+HRGN add_extra_clipping_region( X11DRV_PDEVICE *dev, HRGN rgn )
+{
+    HRGN ret, clip;
+
+    if (!(clip = CreateRectRgn( 0, 0, 0, 0 ))) return 0;
+    CombineRgn( clip, dev->region, rgn, RGN_AND );
+    ret = dev->region;
+    dev->region = clip;
+    update_x11_clipping( dev );
+    return ret;
+}
+
+
+/***********************************************************************
+ *           restore_clipping_region
+ */
+void restore_clipping_region( X11DRV_PDEVICE *dev, HRGN rgn )
+{
+    if (!rgn) return;
+    DeleteObject( dev->region );
+    dev->region = rgn;
+    update_x11_clipping( dev );
+}
+
+
+/***********************************************************************
+ *           X11DRV_SetDeviceClipping
+ */
+void X11DRV_SetDeviceClipping( PHYSDEV dev, HRGN vis_rgn, HRGN clip_rgn )
+{
+    X11DRV_PDEVICE *physDev = get_x11drv_dev( dev );
+
+    CombineRgn( physDev->region, vis_rgn, clip_rgn, clip_rgn ? RGN_AND : RGN_COPY );
+    update_x11_clipping( physDev );
+}
+
 
 /***********************************************************************
  *           X11DRV_SetupGCForPatBlt
diff --git a/dlls/winex11.drv/text.c b/dlls/winex11.drv/text.c
index 89af8f6..442a4c2 100644
--- a/dlls/winex11.drv/text.c
+++ b/dlls/winex11.drv/text.c
@@ -85,13 +85,8 @@ BOOL X11DRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
 
     if (flags & ETO_CLIPPED)
     {
-        HRGN clip_region;
-
-        clip_region = CreateRectRgnIndirect( lprect );
-        /* make a copy of the current device region */
-        saved_region = CreateRectRgn( 0, 0, 0, 0 );
-        CombineRgn( saved_region, physDev->region, 0, RGN_COPY );
-        X11DRV_SetDeviceClipping( dev, saved_region, clip_region );
+        HRGN clip_region = CreateRectRgnIndirect( lprect );
+        saved_region = add_extra_clipping_region( physDev, clip_region );
         DeleteObject( clip_region );
     }
 
@@ -177,12 +172,7 @@ BOOL X11DRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
     }
     HeapFree( GetProcessHeap(), 0, str2b );
 
-    if (flags & ETO_CLIPPED)
-    {
-        /* restore the device region */
-        X11DRV_SetDeviceClipping( dev, saved_region, 0 );
-        DeleteObject( saved_region );
-    }
+    if (saved_region) restore_clipping_region( physDev, saved_region );
     goto END;
 
 FAIL:
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 93d3981..deec898 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -289,6 +289,8 @@ extern X_PHYSBITMAP *X11DRV_init_phys_bitmap( HBITMAP hbitmap ) DECLSPEC_HIDDEN;
 extern Pixmap X11DRV_get_pixmap( HBITMAP hbitmap ) DECLSPEC_HIDDEN;
 
 extern RGNDATA *X11DRV_GetRegionData( HRGN hrgn, HDC hdc_lptodp ) DECLSPEC_HIDDEN;
+extern HRGN add_extra_clipping_region( X11DRV_PDEVICE *dev, HRGN rgn ) DECLSPEC_HIDDEN;
+extern void restore_clipping_region( X11DRV_PDEVICE *dev, HRGN rgn ) DECLSPEC_HIDDEN;
 
 extern BOOL X11DRV_SetupGCForPatBlt( X11DRV_PDEVICE *physDev, GC gc, BOOL fMapColors ) DECLSPEC_HIDDEN;
 extern BOOL X11DRV_SetupGCForBrush( X11DRV_PDEVICE *physDev ) DECLSPEC_HIDDEN;
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index dc603af..ad8e08b 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -1866,13 +1866,8 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
 
     if (flags & ETO_CLIPPED)
     {
-        HRGN clip_region;
-
-        clip_region = CreateRectRgnIndirect( lprect );
-        /* make a copy of the current device region */
-        saved_region = CreateRectRgn( 0, 0, 0, 0 );
-        CombineRgn( saved_region, physDev->region, 0, RGN_COPY );
-        X11DRV_SetDeviceClipping( &physDev->dev, saved_region, clip_region );
+        HRGN clip_region = CreateRectRgnIndirect( lprect );
+        saved_region = add_extra_clipping_region( physDev, clip_region );
         DeleteObject( clip_region );
     }
 
@@ -2131,12 +2126,7 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
     }
     LeaveCriticalSection(&xrender_cs);
 
-    if (flags & ETO_CLIPPED)
-    {
-        /* restore the device region */
-        X11DRV_SetDeviceClipping( &physDev->dev, saved_region, 0 );
-        DeleteObject( saved_region );
-    }
+    if (saved_region) restore_clipping_region( physDev, saved_region );
 
     retv = TRUE;
 




More information about the wine-cvs mailing list