[resend] gdi32: Text output of records EMR_EXTTEXTOUTA/W depend on field iGraphicsMode
Alexander Kochetkov
al.kochet at gmail.com
Mon Feb 7 17:54:52 CST 2011
Fix for bug #22996, and likely for bug #16557.
BTW, I think, what the same problem exist with EMR_POLYTEXTOUTA/W records.
-------------- next part --------------
From 63f618282f2c92900302f8f05acc66ed5f57121c Mon Sep 17 00:00:00 2001
From: Alexander Kochetkov <al.kochet at gmail.com>
Date: Tue, 8 Feb 2011 02:24:24 +0300
Subject: gdi32: Text output of records EMR_EXTTEXTOUTA/W depend on field iGraphicsMode
---
dlls/gdi32/enhmetafile.c | 41 +++++++++++++++++++++++++++++++++++++----
1 files changed, 37 insertions(+), 4 deletions(-)
diff --git a/dlls/gdi32/enhmetafile.c b/dlls/gdi32/enhmetafile.c
index 15f7c1b..7943374 100644
--- a/dlls/gdi32/enhmetafile.c
+++ b/dlls/gdi32/enhmetafile.c
@@ -518,6 +518,7 @@ typedef struct enum_emh_data
EMF_dc_state state;
INT save_level;
EMF_dc_state *saved_state;
+ INT font_graphics_mode;
} enum_emh_data;
#define ENUM_GET_PRIVATE_DATA(ht) \
@@ -663,6 +664,22 @@ static void EMF_FixIsotropic(HDC hdc, enum_emh_data *info)
}
}
+
+/***********************************************************************
+ * EMF_ReselectFont
+ *
+ * Reselect the font so that font appearance get updated.
+ */
+static void EMF_ReselectFont(HDC hdc, enum_emh_data *info)
+{
+ int mode = GetGraphicsMode(hdc);
+ if (info->font_graphics_mode == mode)
+ return;
+ SelectObject(hdc, GetCurrentObject(hdc, OBJ_FONT));
+ info->font_graphics_mode = mode;
+}
+
+
/*****************************************************************************
* emr_produces_output
*
@@ -857,19 +874,21 @@ BOOL WINAPI PlayEnhMetaFileRecord(
case EMR_SELECTOBJECT:
{
const EMRSELECTOBJECT *pSelectObject = (const EMRSELECTOBJECT *)mr;
+ HGDIOBJ hobj;
if( pSelectObject->ihObject & 0x80000000 ) {
/* High order bit is set - it's a stock object
* Strip the high bit to get the index.
* See MSDN article Q142319
*/
- SelectObject( hdc, GetStockObject( pSelectObject->ihObject &
- 0x7fffffff ) );
+ hobj = GetStockObject(pSelectObject->ihObject & 0x7fffffff);
} else {
/* High order bit wasn't set - not a stock object
*/
- SelectObject( hdc,
- (handletable->objectHandle)[pSelectObject->ihObject] );
+ hobj = (handletable->objectHandle)[pSelectObject->ihObject];
}
+ SelectObject(hdc, hobj);
+ if (GetObjectType(hobj) == OBJ_FONT)
+ info->font_graphics_mode = GetGraphicsMode(hdc);
break;
}
case EMR_DELETEOBJECT:
@@ -1133,6 +1152,10 @@ BOOL WINAPI PlayEnhMetaFileRecord(
const EMREXTTEXTOUTA *pExtTextOutA = (const EMREXTTEXTOUTA *)mr;
RECT rc;
const INT *dx = NULL;
+ int gModeOld = 0;
+
+ gModeOld = SetGraphicsMode(hdc, pExtTextOutA->iGraphicsMode);
+ EMF_ReselectFont(hdc, info);
rc.left = pExtTextOutA->emrtext.rcl.left;
rc.top = pExtTextOutA->emrtext.rcl.top;
@@ -1153,6 +1176,8 @@ BOOL WINAPI PlayEnhMetaFileRecord(
pExtTextOutA->emrtext.fOptions, &rc,
(LPCSTR)((const BYTE *)mr + pExtTextOutA->emrtext.offString), pExtTextOutA->emrtext.nChars,
dx);
+
+ SetGraphicsMode(hdc, gModeOld);
break;
}
@@ -1161,6 +1186,10 @@ BOOL WINAPI PlayEnhMetaFileRecord(
const EMREXTTEXTOUTW *pExtTextOutW = (const EMREXTTEXTOUTW *)mr;
RECT rc;
const INT *dx = NULL;
+ int gModeOld;
+
+ gModeOld = SetGraphicsMode(hdc, pExtTextOutW->iGraphicsMode);
+ EMF_ReselectFont(hdc, info);
rc.left = pExtTextOutW->emrtext.rcl.left;
rc.top = pExtTextOutW->emrtext.rcl.top;
@@ -1181,6 +1210,8 @@ BOOL WINAPI PlayEnhMetaFileRecord(
pExtTextOutW->emrtext.fOptions, &rc,
(LPCWSTR)((const BYTE *)mr + pExtTextOutW->emrtext.offString), pExtTextOutW->emrtext.nChars,
dx);
+
+ SetGraphicsMode(hdc, gModeOld);
break;
}
@@ -2295,6 +2326,8 @@ BOOL WINAPI EnumEnhMetaFile(
info->save_level = 0;
info->saved_state = NULL;
+ info->font_graphics_mode = 0;
+
ht = (HANDLETABLE*) &info[1];
ht->objectHandle[0] = hmf;
for(i = 1; i < emh->nHandles; i++)
--
1.7.0.4
More information about the wine-patches
mailing list