Alexandre Julliard : winex11: Return a RGNDATA from add_extra_clipping_region and avoid changing the physdev region .

Alexandre Julliard julliard at winehq.org
Tue Sep 13 12:18:10 CDT 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Sep 13 15:40:57 2011 +0200

winex11: Return a RGNDATA from add_extra_clipping_region and avoid changing the physdev region.

---

 dlls/winex11.drv/bitblt.c   |    4 ++--
 dlls/winex11.drv/graphics.c |   43 ++++++++++++++++++++++++-------------------
 dlls/winex11.drv/text.c     |   24 ++++++++++++------------
 dlls/winex11.drv/x11drv.h   |    4 ++--
 dlls/winex11.drv/xrender.c  |    6 +++---
 5 files changed, 43 insertions(+), 38 deletions(-)

diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c
index bcdb996..09e99e6 100644
--- a/dlls/winex11.drv/bitblt.c
+++ b/dlls/winex11.drv/bitblt.c
@@ -1902,7 +1902,7 @@ DWORD X11DRV_PutImage( PHYSDEV dev, HBITMAP hbitmap, HRGN clip, BITMAPINFO *info
         }
         else
         {
-            HRGN saved_region = 0;
+            RGNDATA *saved_region = NULL;
 
             if (clip) saved_region = add_extra_clipping_region( physdev, clip );
             X11DRV_LockDIBSection( physdev, DIB_Status_GdiMod );
@@ -1939,7 +1939,7 @@ DWORD X11DRV_PutImage( PHYSDEV dev, HBITMAP hbitmap, HRGN clip, BITMAPINFO *info
             }
 
             X11DRV_UnlockDIBSection( physdev, !ret );
-            if (saved_region) restore_clipping_region( physdev, saved_region );
+            restore_clipping_region( physdev, saved_region );
         }
         image->data = NULL;
     }
diff --git a/dlls/winex11.drv/graphics.c b/dlls/winex11.drv/graphics.c
index c93001f..eb25764 100644
--- a/dlls/winex11.drv/graphics.c
+++ b/dlls/winex11.drv/graphics.c
@@ -185,18 +185,12 @@ RGNDATA *X11DRV_GetRegionData( HRGN hrgn, HDC hdc_lptodp )
 }
 
 
-static void update_x11_clipping( X11DRV_PDEVICE *physDev )
+static void update_x11_clipping( X11DRV_PDEVICE *physDev, const RGNDATA *data )
 {
-    RGNDATA *data;
-
-    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 );
 }
 
 /***********************************************************************
@@ -205,15 +199,24 @@ static void update_x11_clipping( X11DRV_PDEVICE *physDev )
  * 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 )
+RGNDATA *add_extra_clipping_region( X11DRV_PDEVICE *dev, HRGN rgn )
 {
-    HRGN ret, clip;
+    RGNDATA *ret, *data;
+    HRGN clip;
 
-    if (!(clip = CreateRectRgn( 0, 0, 0, 0 ))) return 0;
+    if (!(ret = X11DRV_GetRegionData( dev->region, 0 ))) return NULL;
+    if (!(clip = CreateRectRgn( 0, 0, 0, 0 )))
+    {
+        HeapFree( GetProcessHeap(), 0, ret );
+        return NULL;
+    }
     CombineRgn( clip, dev->region, rgn, RGN_AND );
-    ret = dev->region;
-    dev->region = clip;
-    update_x11_clipping( dev );
+    if ((data = X11DRV_GetRegionData( clip, 0 )))
+    {
+        update_x11_clipping( dev, data );
+        HeapFree( GetProcessHeap(), 0, data );
+    }
+    DeleteObject( clip );
     return ret;
 }
 
@@ -221,12 +224,11 @@ HRGN add_extra_clipping_region( X11DRV_PDEVICE *dev, HRGN rgn )
 /***********************************************************************
  *           restore_clipping_region
  */
-void restore_clipping_region( X11DRV_PDEVICE *dev, HRGN rgn )
+void restore_clipping_region( X11DRV_PDEVICE *dev, RGNDATA *data )
 {
-    if (!rgn) return;
-    DeleteObject( dev->region );
-    dev->region = rgn;
-    update_x11_clipping( dev );
+    if (!data) return;
+    update_x11_clipping( dev, data );
+    HeapFree( GetProcessHeap(), 0, data );
 }
 
 
@@ -235,10 +237,13 @@ void restore_clipping_region( X11DRV_PDEVICE *dev, HRGN rgn )
  */
 void X11DRV_SetDeviceClipping( PHYSDEV dev, HRGN vis_rgn, HRGN clip_rgn )
 {
+    RGNDATA *data;
     X11DRV_PDEVICE *physDev = get_x11drv_dev( dev );
 
     CombineRgn( physDev->region, vis_rgn, clip_rgn, clip_rgn ? RGN_AND : RGN_COPY );
-    update_x11_clipping( physDev );
+
+    if ((data = X11DRV_GetRegionData( physDev->region, 0 ))) update_x11_clipping( physDev, data );
+    HeapFree( GetProcessHeap(), 0, data );
 }
 
 
diff --git a/dlls/winex11.drv/text.c b/dlls/winex11.drv/text.c
index bbc57a8..bce0af9 100644
--- a/dlls/winex11.drv/text.c
+++ b/dlls/winex11.drv/text.c
@@ -41,6 +41,7 @@ BOOL X11DRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
                         const RECT *lprect, LPCWSTR wstr, UINT count, const INT *lpDx )
 {
     X11DRV_PDEVICE *physDev = get_x11drv_dev( dev );
+    RGNDATA *saved_region = NULL;
     unsigned int i;
     fontObject*		pfo;
     XFontStruct*	font;
@@ -48,7 +49,6 @@ BOOL X11DRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
     XChar2b		*str2b = NULL;
     BOOL		dibUpdateFlag = FALSE;
     BOOL                result = TRUE;
-    HRGN                saved_region = 0;
 
     if (!X11DRV_SetupGCForText( physDev )) return TRUE;
 
@@ -98,7 +98,10 @@ BOOL X11DRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
 
     /* Draw the text (count > 0 verified) */
     if (!(str2b = X11DRV_cptable[pfo->fi->cptable].punicode_to_char2b( pfo, wstr, count )))
-        goto FAIL;
+    {
+        result = FALSE;
+        goto END;
+    }
 
     wine_tsx11_lock();
     XSetForeground( gdi_display, physDev->gc, physDev->textPixel );
@@ -116,8 +119,11 @@ BOOL X11DRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
             XTextItem16 *items;
 
             items = HeapAlloc( GetProcessHeap(), 0, count * sizeof(XTextItem16) );
-            if(items == NULL) goto FAIL;
-
+            if(items == NULL)
+            {
+                result = FALSE;
+                goto END;
+            }
             items[0].chars = str2b;
             items[0].delta = 0;
             items[0].nchars = 1;
@@ -167,17 +173,11 @@ BOOL X11DRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
             }
         }
     }
-    HeapFree( GetProcessHeap(), 0, str2b );
-
-    if (saved_region) restore_clipping_region( physDev, saved_region );
-    goto END;
-
-FAIL:
-    HeapFree( GetProcessHeap(), 0, str2b );
-    result = FALSE;
 
 END:
+    HeapFree( GetProcessHeap(), 0, str2b );
     if (dibUpdateFlag) X11DRV_UnlockDIBSection( physDev, TRUE );
+    restore_clipping_region( physDev, saved_region );
     return result;
 }
 
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index fb190b2..02dc34b 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -280,8 +280,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 RGNDATA *add_extra_clipping_region( X11DRV_PDEVICE *dev, HRGN rgn ) DECLSPEC_HIDDEN;
+extern void restore_clipping_region( X11DRV_PDEVICE *dev, RGNDATA *data ) 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 e7a1062..ab1cade 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -1948,7 +1948,7 @@ BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
     gsCacheEntryFormat *formatEntry;
     BOOL retv = FALSE;
     int textPixel, backgroundPixel;
-    HRGN saved_region = 0;
+    RGNDATA *saved_region = NULL;
     BOOL disable_antialias = FALSE;
     AA_Type aa_type = AA_None;
     unsigned int idx;
@@ -1957,7 +1957,7 @@ BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
     if (!physdev->x11dev->has_gdi_font)
     {
         dev = GET_NEXT_PHYSDEV( dev, pExtTextOut );
-        dev->funcs->pExtTextOut( dev, x, y, flags, lprect, wstr, count, lpDx );
+        return dev->funcs->pExtTextOut( dev, x, y, flags, lprect, wstr, count, lpDx );
     }
 
     if(is_dib_with_colortable( physdev->x11dev ))
@@ -2266,7 +2266,7 @@ BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
     }
     LeaveCriticalSection(&xrender_cs);
 
-    if (saved_region) restore_clipping_region( physdev->x11dev, saved_region );
+    restore_clipping_region( physdev->x11dev, saved_region );
 
     retv = TRUE;
 




More information about the wine-cvs mailing list