Module: wine Branch: master Commit: f348a9309bf3a10c376f2f8ac48b907e740e9bcd URL: http://source.winehq.org/git/wine.git/?a=commit;h=f348a9309bf3a10c376f2f8ac4...
Author: Dmitry Timoshkov dmitry@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);