From 0f9ee1b68face4b6bf0e3f6992a9f1943c7cf2f4 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 21 Jul 2011 19:46:28 +0200 Subject: [PATCH] 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 39e45369ee1..4897b4e027b 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 7b112ebb9fa..59c8817bc20 100644 --- a/dlls/wineps.drv/clipping.c +++ b/dlls/wineps.drv/clipping.c @@ -24,6 +24,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 * @@ -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 d24a8fd0ebd..7b8185feab4 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;