Dmitry Timoshkov : winedump: Decipher contents of a couple EMF records.

Alexandre Julliard julliard at winehq.org
Thu Apr 17 14:43:41 CDT 2008


Module: wine
Branch: master
Commit: f348a9309bf3a10c376f2f8ac48b907e740e9bcd
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f348a9309bf3a10c376f2f8ac48b907e740e9bcd

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Thu Apr 17 21:11:16 2008 +0900

winedump: Decipher contents of a couple EMF records.

---

 tools/winedump/emf.c |   59 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/tools/winedump/emf.c b/tools/winedump/emf.c
index 7975e21..f539ea6 100644
--- a/tools/winedump/emf.c
+++ b/tools/winedump/emf.c
@@ -36,6 +36,28 @@
 #include "winbase.h"
 #include "wingdi.h"
 
+static const char *debugstr_wn(const WCHAR *wstr, int n)
+{
+    static char buf[80];
+    char *p;
+    int i;
+
+    if (!wstr) return "(null)";
+
+    i = 0;
+    p = buf;
+    *p++ = '\"';
+    while (i < n && i < sizeof(buf) - 2 && wstr[i])
+    {
+        if (wstr[i] < 127) *p++ = wstr[i];
+        else *p++ = '.';
+        i++;
+    }
+    *p++ = '\"';
+    *p = 0;
+    return buf;
+}
+
 static unsigned int read_int(const unsigned char *buffer)
 {
     return buffer[0]
@@ -141,9 +163,42 @@ static int dump_emfrecord(void)
     EMRCASE(EMR_PLGBLT);
     EMRCASE(EMR_SETDIBITSTODEVICE);
     EMRCASE(EMR_STRETCHDIBITS);
-    EMRCASE(EMR_EXTCREATEFONTINDIRECTW);
+
+    case EMR_EXTCREATEFONTINDIRECTW:
+    {
+        const EMREXTCREATEFONTINDIRECTW *pf = (const EMREXTCREATEFONTINDIRECTW *)PRD(offset, 4);
+        const LOGFONTW *plf = &pf->elfw.elfLogFont;
+
+        printf("%-20s %08x\n", "EMR_EXTCREATEFONTINDIRECTW", length);
+        printf("(%d %d %d %d %x out %d clip %x quality %d charset %d) %s %s %s %s\n",
+               plf->lfHeight, plf->lfWidth,
+               plf->lfEscapement, plf->lfOrientation,
+               plf->lfPitchAndFamily,
+               plf->lfOutPrecision, plf->lfClipPrecision,
+               plf->lfQuality, plf->lfCharSet,
+               debugstr_wn(plf->lfFaceName, LF_FACESIZE),
+               plf->lfWeight > 400 ? "Bold" : "",
+               plf->lfItalic ? "Italic" : "",
+               plf->lfUnderline ? "Underline" : "");
+	break;
+    }
+
     EMRCASE(EMR_EXTTEXTOUTA);
-    EMRCASE(EMR_EXTTEXTOUTW);
+
+    case EMR_EXTTEXTOUTW:
+    {
+	const EMREXTTEXTOUTW *etoW = (const EMREXTTEXTOUTW *)PRD(offset, 4);
+
+        printf("%-20s %08x\n", "EMR_EXTTEXTOUTW", length);
+        printf("pt (%d,%d) rect (%d,%d - %d,%d) flags %#x, %s\n",
+               etoW->emrtext.ptlReference.x, etoW->emrtext.ptlReference.y,
+               etoW->emrtext.rcl.left, etoW->emrtext.rcl.top,
+               etoW->emrtext.rcl.right, etoW->emrtext.rcl.bottom,
+               etoW->emrtext.fOptions,
+               debugstr_wn((LPCWSTR)((const BYTE *)etoW + etoW->emrtext.offString), etoW->emrtext.nChars));
+	break;
+    }
+
     EMRCASE(EMR_POLYBEZIER16);
     EMRCASE(EMR_POLYGON16);
     EMRCASE(EMR_POLYLINE16);




More information about the wine-cvs mailing list