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