Roderick Colenbrander : winex11: Add X11DRV_XRender_SetDeviceClipping for syncing the clipping region with XRender pictures .

Alexandre Julliard julliard at winehq.org
Wed Oct 14 09:02:02 CDT 2009


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

Author: Roderick Colenbrander <thunderbird2k at gmail.com>
Date:   Wed Oct 14 12:33:40 2009 +0200

winex11: Add X11DRV_XRender_SetDeviceClipping for syncing the clipping region with XRender pictures.

---

 dlls/winex11.drv/graphics.c |    3 +++
 dlls/winex11.drv/x11drv.h   |    1 +
 dlls/winex11.drv/xrender.c  |   38 +++++++++++++++++++++++++++-----------
 3 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/dlls/winex11.drv/graphics.c b/dlls/winex11.drv/graphics.c
index af1e74c..e6cedfb 100644
--- a/dlls/winex11.drv/graphics.c
+++ b/dlls/winex11.drv/graphics.c
@@ -166,6 +166,9 @@ void CDECL X11DRV_SetDeviceClipping( X11DRV_PDEVICE *physDev, HRGN vis_rgn, HRGN
     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 );
 }
 
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index eee5849..11f8e0d 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -281,6 +281,7 @@ extern int using_client_side_fonts;
 extern void X11DRV_XRender_Init(void);
 extern void X11DRV_XRender_Finalize(void);
 extern BOOL X11DRV_XRender_SelectFont(X11DRV_PDEVICE*, HFONT);
+extern void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev, const RGNDATA *data);
 extern void X11DRV_XRender_DeleteDC(X11DRV_PDEVICE*);
 extern void X11DRV_XRender_CopyBrush(X11DRV_PDEVICE *physDev, X_PHYSBITMAP *physBitmap, int width, int height);
 extern BOOL X11DRV_XRender_ExtTextOut(X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index efced85..7d4250c 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -506,13 +506,19 @@ static Picture get_xrender_picture(X11DRV_PDEVICE *physDev)
     if (!info->pict && info->format)
     {
         XRenderPictureAttributes pa;
+        RGNDATA *clip = X11DRV_GetRegionData( physDev->region, 0 );
 
         wine_tsx11_lock();
         pa.subwindow_mode = IncludeInferiors;
         info->pict = pXRenderCreatePicture(gdi_display, physDev->drawable, info->format->pict_format,
                                            CPSubwindowMode, &pa);
+        if (info->pict && clip)
+            pXRenderSetPictureClipRectangles( gdi_display, info->pict,
+                                              physDev->dc_rect.left, physDev->dc_rect.top,
+                                              (XRectangle *)clip->Buffer, clip->rdh.nCount );
         wine_tsx11_unlock();
         TRACE("Allocing pict=%lx dc=%p drawable=%08lx\n", info->pict, physDev->hdc, physDev->drawable);
+        HeapFree( GetProcessHeap(), 0, clip );
     }
 
     return info->pict;
@@ -872,6 +878,21 @@ BOOL X11DRV_XRender_SelectFont(X11DRV_PDEVICE *physDev, HFONT hfont)
 }
 
 /***********************************************************************
+*   X11DRV_XRender_SetDeviceClipping
+*/
+void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev, const RGNDATA *data)
+{
+    if (physDev->xrender->pict)
+    {
+        wine_tsx11_lock();
+        pXRenderSetPictureClipRectangles( gdi_display, physDev->xrender->pict,
+                                          physDev->dc_rect.left, physDev->dc_rect.top,
+                                          (XRectangle *)data->Buffer, data->rdh.nCount );
+        wine_tsx11_unlock();
+    }
+}
+
+/***********************************************************************
  *   X11DRV_XRender_DeleteDC
  */
 void X11DRV_XRender_DeleteDC(X11DRV_PDEVICE *physDev)
@@ -1465,7 +1486,6 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
 				const RECT *lprect, LPCWSTR wstr, UINT count,
 				const INT *lpDx )
 {
-    RGNDATA *data;
     XGCValues xgcval;
     gsCacheEntry *entry;
     gsCacheEntryFormat *formatEntry;
@@ -1586,16 +1606,6 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
         int render_op = PictOpOver;
         Picture pict = get_xrender_picture(physDev);
 
-        if ((data = X11DRV_GetRegionData( physDev->region, 0 )))
-        {
-            wine_tsx11_lock();
-            pXRenderSetPictureClipRectangles( gdi_display, pict,
-                            physDev->dc_rect.left, physDev->dc_rect.top,
-                            (XRectangle *)data->Buffer, data->rdh.nCount );
-            wine_tsx11_unlock();
-            HeapFree( GetProcessHeap(), 0, data );
-        }
-
         /* There's a bug in XRenderCompositeText that ignores the xDst and yDst parameters.
            So we pass zeros to the function and move to our starting position using the first
            element of the elts array. */
@@ -2186,6 +2196,12 @@ void X11DRV_XRender_DeleteDC(X11DRV_PDEVICE *physDev)
   return;
 }
 
+void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev)
+{
+    assert(0);
+    return;
+}
+
 BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
 				const RECT *lprect, LPCWSTR wstr, UINT count,
 				const INT *lpDx )




More information about the wine-cvs mailing list