Alexandre Julliard : wineps: Implement the additional clipping in PutImage.

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


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

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

wineps: Implement the additional clipping in PutImage.

---

 dlls/wineps.drv/bitmap.c   |    1 +
 dlls/wineps.drv/clipping.c |  108 +++++++++++++++++++-------------------------
 dlls/wineps.drv/psdrv.h    |    1 +
 3 files changed, 49 insertions(+), 61 deletions(-)

diff --git a/dlls/wineps.drv/bitmap.c b/dlls/wineps.drv/bitmap.c
index 39e4536..4897b4e 100644
--- a/dlls/wineps.drv/bitmap.c
+++ b/dlls/wineps.drv/bitmap.c
@@ -308,6 +308,7 @@ DWORD PSDRV_PutImage( PHYSDEV dev, HBITMAP hbitmap, HRGN clip, BITMAPINFO *info,
 
     PSDRV_SetClip(dev);
     PSDRV_WriteGSave(dev);
+    if (clip) PSDRV_AddClip( dev, clip );
     PSDRV_WriteImageBits( dev, info, dst_x, dst_y, dst_width, dst_height,
                           width, height, dst_bits.ptr, size );
     PSDRV_WriteGRestore(dev);
diff --git a/dlls/wineps.drv/clipping.c b/dlls/wineps.drv/clipping.c
index 7b112eb..59c8817 100644
--- a/dlls/wineps.drv/clipping.c
+++ b/dlls/wineps.drv/clipping.c
@@ -25,6 +25,47 @@
 WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
 
 /***********************************************************************
+ *           PSDRV_AddClip
+ */
+void PSDRV_AddClip( PHYSDEV dev, HRGN hrgn )
+{
+    CHAR szArrayName[] = "clippath";
+    RECT *rect;
+    RGNDATA *data;
+    DWORD i, size = GetRegionData(hrgn, 0, NULL);
+
+    if (!size) return;
+    if (!(data = HeapAlloc( GetProcessHeap(), 0, size ))) return;
+    GetRegionData( hrgn, size, data );
+    rect = (RECT *)data->Buffer;
+
+    switch (data->rdh.nCount)
+    {
+    case 0:
+        /* set an empty clip path. */
+        PSDRV_WriteRectClip(dev, 0, 0, 0, 0);
+        break;
+    case 1:
+        /* optimize when it is a simple region */
+        PSDRV_WriteRectClip(dev, rect->left, rect->top,
+                            rect->right - rect->left, rect->bottom - rect->top);
+        break;
+    default:
+        PSDRV_WriteArrayDef(dev, szArrayName, data->rdh.nCount * 4);
+        for (i = 0; i < data->rdh.nCount; i++, rect++)
+        {
+            PSDRV_WriteArrayPut(dev, szArrayName, i * 4, rect->left);
+            PSDRV_WriteArrayPut(dev, szArrayName, i * 4 + 1, rect->top);
+            PSDRV_WriteArrayPut(dev, szArrayName, i * 4 + 2, rect->right - rect->left);
+            PSDRV_WriteArrayPut(dev, szArrayName, i * 4 + 3, rect->bottom - rect->top);
+        }
+        PSDRV_WriteRectClip2(dev, szArrayName);
+        break;
+    }
+    HeapFree( GetProcessHeap(), 0, data );
+}
+
+/***********************************************************************
  *           PSDRV_SetClip
  *
  * The idea here is that every graphics operation should bracket
@@ -38,76 +79,21 @@ WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
 void PSDRV_SetClip( PHYSDEV dev )
 {
     PSDRV_PDEVICE *physDev = get_psdrv_dev( dev );
-    CHAR szArrayName[] = "clippath";
-    DWORD size;
-    RGNDATA *rgndata = NULL;
-    HRGN hrgn = CreateRectRgn(0,0,0,0);
-    BOOL empty;
+    HRGN hrgn;
 
     TRACE("hdc=%p\n", dev->hdc);
 
     if(physDev->pathdepth) {
         TRACE("inside a path, so not clipping\n");
-        goto end;
+        return;
     }
 
-    empty = !GetClipRgn(dev->hdc, hrgn);
-
-    if(!empty) {
-        size = GetRegionData(hrgn, 0, NULL);
-        if(!size) {
-            ERR("Invalid region\n");
-            goto end;
-        }
-
-        rgndata = HeapAlloc( GetProcessHeap(), 0, size );
-        if(!rgndata) {
-            ERR("Can't allocate buffer\n");
-            goto end;
-        }
-
-        GetRegionData(hrgn, size, rgndata);
-
+    hrgn = CreateRectRgn(0,0,0,0);
+    if (GetClipRgn(dev->hdc, hrgn))
+    {
         PSDRV_WriteGSave(dev);
-
-        /* check for NULL region */
-        if (rgndata->rdh.nCount == 0)
-        {
-            /* set an empty clip path. */
-            PSDRV_WriteRectClip(dev, 0, 0, 0, 0);
-        }
-        /* optimize when it is a simple region */
-        else if (rgndata->rdh.nCount == 1)
-        {
-            RECT *pRect = (RECT *)rgndata->Buffer;
-
-            PSDRV_WriteRectClip(dev, pRect->left, pRect->top,
-                                pRect->right - pRect->left,
-                                pRect->bottom - pRect->top);
-        }
-        else
-        {
-            UINT i;
-            RECT *pRect = (RECT *)rgndata->Buffer;
-
-            PSDRV_WriteArrayDef(dev, szArrayName, rgndata->rdh.nCount * 4);
-
-            for (i = 0; i < rgndata->rdh.nCount; i++, pRect++)
-            {
-                PSDRV_WriteArrayPut(dev, szArrayName, i * 4,
-                                    pRect->left);
-                PSDRV_WriteArrayPut(dev, szArrayName, i * 4 + 1,
-                                    pRect->top);
-                PSDRV_WriteArrayPut(dev, szArrayName, i * 4 + 2,
-                                    pRect->right - pRect->left);
-                PSDRV_WriteArrayPut(dev, szArrayName, i * 4 + 3,
-                                    pRect->bottom - pRect->top);
-            }
-            PSDRV_WriteRectClip2(dev, szArrayName);
-        }
+        PSDRV_AddClip( dev, hrgn );
     }
-end:
-    HeapFree( GetProcessHeap(), 0, rgndata );
     DeleteObject(hrgn);
 }
 
diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h
index d24a8fd..7b8185f 100644
--- a/dlls/wineps.drv/psdrv.h
+++ b/dlls/wineps.drv/psdrv.h
@@ -480,6 +480,7 @@ extern BOOL PSDRV_Brush(PHYSDEV dev, BOOL EO) DECLSPEC_HIDDEN;
 extern BOOL PSDRV_SetFont( PHYSDEV dev ) DECLSPEC_HIDDEN;
 extern BOOL PSDRV_SetPen( PHYSDEV dev ) DECLSPEC_HIDDEN;
 
+extern void PSDRV_AddClip( PHYSDEV dev, HRGN hrgn ) DECLSPEC_HIDDEN;
 extern void PSDRV_SetClip( PHYSDEV dev ) DECLSPEC_HIDDEN;
 extern void PSDRV_ResetClip( PHYSDEV dev ) DECLSPEC_HIDDEN;
 




More information about the wine-cvs mailing list