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