From: Piotr Caban piotr@codeweavers.com
--- dlls/gdi32/metafile.c | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-)
diff --git a/dlls/gdi32/metafile.c b/dlls/gdi32/metafile.c index 50910956e1d..911dfeecf61 100644 --- a/dlls/gdi32/metafile.c +++ b/dlls/gdi32/metafile.c @@ -360,6 +360,7 @@ HMETAFILE WINAPI CopyMetaFileA( HMETAFILE hSrcMetaFile, LPCSTR lpFilename ) */ BOOL WINAPI PlayMetaFile( HDC hdc, HMETAFILE hmf ) { + BOOL metadc = GetObjectType(hdc) == OBJ_METADC; METAHEADER *mh = get_metafile_bits( hmf ); METARECORD *mr; HANDLETABLE *ht; @@ -372,16 +373,19 @@ BOOL WINAPI PlayMetaFile( HDC hdc, HMETAFILE hmf )
if (!mh) return FALSE;
- /* save DC */ - hPen = GetCurrentObject(hdc, OBJ_PEN); - hBrush = GetCurrentObject(hdc, OBJ_BRUSH); - hPal = GetCurrentObject(hdc, OBJ_PAL); - - hRgn = NtGdiCreateRectRgn(0, 0, 0, 0); - if (!GetClipRgn(hdc, hRgn)) + if (!metadc) { - DeleteObject(hRgn); - hRgn = 0; + /* save DC */ + hPen = GetCurrentObject(hdc, OBJ_PEN); + hBrush = GetCurrentObject(hdc, OBJ_BRUSH); + hPal = GetCurrentObject(hdc, OBJ_PAL); + + hRgn = NtGdiCreateRectRgn(0, 0, 0, 0); + if (!GetClipRgn(hdc, hRgn)) + { + DeleteObject(hRgn); + hRgn = 0; + } }
/* create the handle table */ @@ -414,12 +418,15 @@ BOOL WINAPI PlayMetaFile( HDC hdc, HMETAFILE hmf ) PlayMetaFileRecord( hdc, ht, mr, mh->mtNoObjects ); }
- /* restore DC */ - SelectObject(hdc, hPen); - SelectObject(hdc, hBrush); - SelectPalette(hdc, hPal, FALSE); - ExtSelectClipRgn(hdc, hRgn, RGN_COPY); - DeleteObject(hRgn); + if (!metadc) + { + /* restore DC */ + SelectObject(hdc, hPen); + SelectObject(hdc, hBrush); + SelectPalette(hdc, hPal, FALSE); + ExtSelectClipRgn(hdc, hRgn, RGN_COPY); + DeleteObject(hRgn); + }
/* free objects in handle table */ for(i = 0; i < mh->mtNoObjects; i++)
From: Piotr Caban piotr@codeweavers.com
--- dlls/gdi32/tests/metafile.c | 60 +++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+)
diff --git a/dlls/gdi32/tests/metafile.c b/dlls/gdi32/tests/metafile.c index 0e5da463f7f..b013fe1f196 100644 --- a/dlls/gdi32/tests/metafile.c +++ b/dlls/gdi32/tests/metafile.c @@ -5066,6 +5066,65 @@ static void test_emf_blit(void) ok(ret, "DeleteMetaFile(%p) error %ld\n", hmf, GetLastError()); }
+struct check_mf_arg +{ + int pos; + const WORD *records; +}; + +static int WINAPI check_mf_records(HDC hdc, HANDLETABLE *htable, + METARECORD *rec, int n, LPARAM ctx) +{ + struct check_mf_arg *records = (struct check_mf_arg *)ctx; + + ok(rec->rdFunction == records->records[records->pos], "got record %x, expected %x\n", + rec->rdFunction, records->records[records->pos]); + return rec->rdFunction == records->records[records->pos++]; +} + +static void test_PlayMetaFile(void) +{ + static WORD line_records[] = { META_LINETO, 0 }; + struct check_mf_arg records; + HMETAFILE hmeta; + HDC dc, metadc; + BOOL r; + + dc = CreateCompatibleDC(NULL); + ok(dc != NULL, "CreateCompatibleDC failed\n"); + + metadc = CreateMetaFileW(NULL); + ok(metadc != NULL, "CreateMetaFile failed\n"); + r = LineTo(metadc, 10, 10); + ok(r, "LineTo failed\n"); + hmeta = CloseMetaFile(metadc); + ok(hmeta != NULL, "CloseMetaFile failed\n"); + + records.pos = 0; + records.records = line_records; + r = EnumMetaFile(dc, hmeta, check_mf_records, (LPARAM)&records); + ok(r, "EnumMetaFile failed\n"); + + metadc = CreateMetaFileW(NULL); + ok(metadc != NULL, "CreateMetaFile failed\n"); + r = PlayMetaFile(metadc, hmeta); + ok(r, "PlayMetaFile failed\n"); + r = DeleteMetaFile(hmeta); + ok(r, "DeleteMetaFile failed\n"); + hmeta = CloseMetaFile(metadc); + ok(hmeta != NULL, "CloseMetaFile failed\n"); + + records.pos = 0; + records.records = line_records; + r = EnumMetaFile(dc, hmeta, check_mf_records, (LPARAM)&records); + ok(r, "EnumMetaFile failed\n"); + + r = DeleteMetaFile(hmeta); + ok(r, "DeleteMetaFile failed\n"); + r = DeleteDC(dc); + ok(r, "DeleteDC failed\n"); +} + static void test_emf_mask_blit(void) { BITMAPINFO bmi = {{ sizeof(bmi) }}; @@ -10769,6 +10828,7 @@ START_TEST(metafile) test_mf_select(); test_mf_palette(); test_mf_blit(); + test_PlayMetaFile();
/* For metafile conversions */ test_mf_conversions();
This merge request was approved by Huw Davies.