diff --git a/dlls/gdi/enhmfdrv/dc.c b/dlls/gdi/enhmfdrv/dc.c index 43ca973cad4..d6fd632be1b 100644 --- a/dlls/gdi/enhmfdrv/dc.c +++ b/dlls/gdi/enhmfdrv/dc.c @@ -134,11 +134,16 @@ INT EMFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode ) DWORD size, rgnsize; BOOL ret; - rgnsize = GetRegionData( hrgn, 0, NULL ); - size = rgnsize + sizeof(*emr) - 1; - emr = HeapAlloc( GetProcessHeap(), 0, size ); + if (!hrgn) + { + if (mode != RGN_COPY) return ERROR; + rgnsize = 0; + } + else rgnsize = GetRegionData( hrgn, 0, NULL ); - GetRegionData( hrgn, rgnsize, (RGNDATA *)&emr->RgnData ); + size = rgnsize + offsetof(EMREXTSELECTCLIPRGN,RgnData); + emr = HeapAlloc( GetProcessHeap(), 0, size ); + if (rgnsize) GetRegionData( hrgn, rgnsize, (RGNDATA *)&emr->RgnData ); emr->emr.iType = EMR_EXTSELECTCLIPRGN; emr->emr.nSize = size; diff --git a/dlls/gdi/enhmfdrv/graphics.c b/dlls/gdi/enhmfdrv/graphics.c index 402beaad4e9..997f3abf518 100644 --- a/dlls/gdi/enhmfdrv/graphics.c +++ b/dlls/gdi/enhmfdrv/graphics.c @@ -490,7 +490,7 @@ BOOL EMFDRV_FillRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush ) if(!index) return FALSE; rgnsize = GetRegionData( hrgn, 0, NULL ); - size = rgnsize + sizeof(EMRFILLRGN) - 1; + size = rgnsize + offsetof(EMRFILLRGN,RgnData); emr = HeapAlloc( GetProcessHeap(), 0, size ); GetRegionData( hrgn, rgnsize, (RGNDATA *)&emr->RgnData ); @@ -523,7 +523,7 @@ BOOL EMFDRV_FrameRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush, INT width, INT heig if(!index) return FALSE; rgnsize = GetRegionData( hrgn, 0, NULL ); - size = rgnsize + sizeof(EMRFRAMERGN) - 1; + size = rgnsize + offsetof(EMRFRAMERGN,RgnData); emr = HeapAlloc( GetProcessHeap(), 0, size ); GetRegionData( hrgn, rgnsize, (RGNDATA *)&emr->RgnData ); @@ -559,7 +559,7 @@ static BOOL EMFDRV_PaintInvertRgn( PHYSDEV dev, HRGN hrgn, DWORD iType ) rgnsize = GetRegionData( hrgn, 0, NULL ); - size = rgnsize + sizeof(EMRINVERTRGN) - 1; + size = rgnsize + offsetof(EMRINVERTRGN,RgnData); emr = HeapAlloc( GetProcessHeap(), 0, size ); GetRegionData( hrgn, rgnsize, (RGNDATA *)&emr->RgnData ); diff --git a/dlls/gdi/mfdrv/graphics.c b/dlls/gdi/mfdrv/graphics.c index aa27b6b05c5..54c4ad39e50 100644 --- a/dlls/gdi/mfdrv/graphics.c +++ b/dlls/gdi/mfdrv/graphics.c @@ -237,7 +237,7 @@ static INT16 MFDRV_CreateRegion(PHYSDEV dev, HRGN hrgn) WORD *Param, *StartBand; BOOL ret; - len = GetRegionData( hrgn, 0, NULL ); + if (!(len = GetRegionData( hrgn, 0, NULL ))) return -1; if( !(rgndata = HeapAlloc( GetProcessHeap(), 0, len )) ) { WARN("Can't alloc rgndata buffer\n"); return -1; @@ -376,16 +376,15 @@ MFDRV_FrameRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush, INT x, INT y ) INT MFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode ) { INT16 iRgn; + INT ret; - if (mode != RGN_COPY) - { - FIXME( "mode %d not supported\n", mode ); - return ERROR; - } + if (mode != RGN_COPY) return ERROR; + if (!hrgn) return NULLREGION; iRgn = MFDRV_CreateRegion( dev, hrgn ); - if(iRgn == -1) - return ERROR; - return MFDRV_MetaParam1( dev, META_SELECTCLIPREGION, iRgn ) ? SIMPLEREGION : ERROR; + if(iRgn == -1) return ERROR; + ret = MFDRV_MetaParam1( dev, META_SELECTCLIPREGION, iRgn ) ? NULLREGION : ERROR; + MFDRV_MetaParam1( dev, META_DELETEOBJECT, iRgn ); + return ret; }