[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