Module: wine Branch: master Commit: 0f9ee1b68face4b6bf0e3f6992a9f1943c7cf2f4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0f9ee1b68face4b6bf0e3f6992...
Author: Alexandre Julliard julliard@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;