From 3c6075e4b46b73e465cd65b716bc0bf389c93903 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 3 Aug 2021 12:55:40 +0200 Subject: [PATCH] gdi32: Don't restore DC state in EnumEnhMetaFile when using metafiles. Querying state is not supported on metafiles. Signed-off-by: Jacek Caban Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/gdi32/enhmetafile.c | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/dlls/gdi32/enhmetafile.c b/dlls/gdi32/enhmetafile.c index 99f692adb98..25ffcff93bf 100644 --- a/dlls/gdi32/enhmetafile.c +++ b/dlls/gdi32/enhmetafile.c @@ -2415,26 +2415,27 @@ BOOL WINAPI EnumEnhMetaFile( info->state.next = NULL; info->save_level = 0; info->saved_state = NULL; + info->init_transform = info->state.world_transform; ht = (HANDLETABLE*) &info[1]; ht->objectHandle[0] = hmf; for(i = 1; i < emh->nHandles; i++) ht->objectHandle[i] = NULL; - if(hdc) + if (hdc && !is_meta_dc( hdc )) { - savedMode = SetGraphicsMode(hdc, GM_ADVANCED); - GetWorldTransform(hdc, &savedXform); + savedMode = SetGraphicsMode(hdc, GM_ADVANCED); + GetWorldTransform(hdc, &savedXform); GetViewportExtEx(hdc, &vp_size); GetWindowExtEx(hdc, &win_size); GetViewportOrgEx(hdc, &vp_org); GetWindowOrgEx(hdc, &win_org); mapMode = GetMapMode(hdc); - /* save DC */ - hPen = GetCurrentObject(hdc, OBJ_PEN); - hBrush = GetCurrentObject(hdc, OBJ_BRUSH); - hFont = GetCurrentObject(hdc, OBJ_FONT); + /* save DC */ + hPen = GetCurrentObject(hdc, OBJ_PEN); + hBrush = GetCurrentObject(hdc, OBJ_BRUSH); + hFont = GetCurrentObject(hdc, OBJ_FONT); hRgn = NtGdiCreateRectRgn(0, 0, 0, 0); if (!GetClipRgn(hdc, hRgn)) @@ -2451,17 +2452,7 @@ BOOL WINAPI EnumEnhMetaFile( old_polyfill = SetPolyFillMode(hdc, ALTERNATE); old_stretchblt = SetStretchBltMode(hdc, BLACKONWHITE); - if ( IS_WIN9X() ) - { - /* Win95 leaves the vp/win ext/org info alone */ - info->init_transform.eM11 = 1.0; - info->init_transform.eM12 = 0.0; - info->init_transform.eM21 = 0.0; - info->init_transform.eM22 = 1.0; - info->init_transform.eDx = 0.0; - info->init_transform.eDy = 0.0; - } - else + if (!IS_WIN9X()) { /* WinNT combines the vp/win ext/org info into a transform */ double xscale, yscale; @@ -2505,7 +2496,7 @@ BOOL WINAPI EnumEnhMetaFile( } /* WinNT resets the current vp/win org/ext */ - if ( !IS_WIN9X() ) + if (!IS_WIN9X()) { SetMapMode(hdc, MM_TEXT); SetWindowOrgEx(hdc, 0, 0, NULL); @@ -2537,7 +2528,7 @@ BOOL WINAPI EnumEnhMetaFile( offset += emr->nSize; } - if (hdc) + if (hdc && !is_meta_dc( hdc )) { SetStretchBltMode(hdc, old_stretchblt); SetPolyFillMode(hdc, old_polyfill); @@ -2554,9 +2545,9 @@ BOOL WINAPI EnumEnhMetaFile( ExtSelectClipRgn(hdc, hRgn, RGN_COPY); DeleteObject(hRgn); - SetWorldTransform(hdc, &savedXform); - if (savedMode) - SetGraphicsMode(hdc, savedMode); + SetWorldTransform(hdc, &savedXform); + if (savedMode) + SetGraphicsMode(hdc, savedMode); SetMapMode(hdc, mapMode); SetWindowOrgEx(hdc, win_org.x, win_org.y, NULL); SetWindowExtEx(hdc, win_size.cx, win_size.cy, NULL);