A few fixes in ExtSelectClipRgn metafile functions.
diff --git a/dlls/gdi/enhmfdrv/dc.c b/dlls/gdi/enhmfdrv/dc.c
index 43ca973..d6fd632 100644
--- a/dlls/gdi/enhmfdrv/dc.c
+++ b/dlls/gdi/enhmfdrv/dc.c
@@ -134,11 +134,16 @@
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 402beaa..997f3ab 100644
--- a/dlls/gdi/enhmfdrv/graphics.c
+++ b/dlls/gdi/enhmfdrv/graphics.c
@@ -490,7 +490,7 @@
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 @@
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 @@
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 aa27b6b..54c4ad3 100644
--- a/dlls/gdi/mfdrv/graphics.c
+++ b/dlls/gdi/mfdrv/graphics.c
@@ -237,7 +237,7 @@
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 @@
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;
}