winedump: Print contents of EMR_INTERSECTCLIPRECT and EMR_EXTSELECTCLIPRGN

Dmitry Timoshkov dmitry at codeweavers.com
Fri Apr 18 08:42:15 CDT 2008


Hello,

Changelog:
    winedump: Print contents of EMR_INTERSECTCLIPRECT and EMR_EXTSELECTCLIPRGN.
---
 tools/winedump/emf.c |   37 +++++++++++++++++++++++++++++++++----
 1 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/tools/winedump/emf.c b/tools/winedump/emf.c
index f539ea6..f3b6f50 100644
--- a/tools/winedump/emf.c
+++ b/tools/winedump/emf.c
@@ -112,7 +112,18 @@ static int dump_emfrecord(void)
     EMRCASE(EMR_MOVETOEX);
     EMRCASE(EMR_SETMETARGN);
     EMRCASE(EMR_EXCLUDECLIPRECT);
-    EMRCASE(EMR_INTERSECTCLIPRECT);
+
+    case EMR_INTERSECTCLIPRECT:
+    {
+        const EMRINTERSECTCLIPRECT *clip = (const EMRINTERSECTCLIPRECT *)PRD(offset, sizeof(*clip));
+
+        printf("%-20s %08x\n", "EMR_INTERSECTCLIPRECT", length);
+        printf("rect %d,%d - %d, %d\n",
+               clip->rclClip.left, clip->rclClip.top,
+               clip->rclClip.right, clip->rclClip.bottom);
+        break;
+    }
+
     EMRCASE(EMR_SCALEVIEWPORTEXTEX);
     EMRCASE(EMR_SCALEWINDOWEXTEX);
     EMRCASE(EMR_SAVEDC);
@@ -156,7 +167,25 @@ static int dump_emfrecord(void)
     EMRCASE(EMR_FRAMERGN);
     EMRCASE(EMR_INVERTRGN);
     EMRCASE(EMR_PAINTRGN);
-    EMRCASE(EMR_EXTSELECTCLIPRGN);
+
+    case EMR_EXTSELECTCLIPRGN:
+    {
+        const EMREXTSELECTCLIPRGN *clip = (const EMREXTSELECTCLIPRGN *)PRD(offset, sizeof(*clip));
+        const RGNDATA *data = (RGNDATA *)clip->RgnData;
+        DWORD i, rc_count = 0;
+        RECT *rc;
+
+        if (length >= sizeof(*clip) + sizeof(*data))
+            rc_count = data->rdh.nCount;
+
+        printf("%-20s %08x\n", "EMREXTSELECTCLIPRGN", length);
+        printf("mode %d, rects %d\n", clip->iMode, rc_count);
+        for (i = 0, rc = (RECT *)data->Buffer; i < rc_count; i++, rc++)
+            printf(" (%d,%d)-(%d,%d)", rc->left, rc->top, rc->right, rc->bottom);
+        if (rc_count != 0) printf("\n");
+        break;
+    }
+
     EMRCASE(EMR_BITBLT);
     EMRCASE(EMR_STRETCHBLT);
     EMRCASE(EMR_MASKBLT);
@@ -166,7 +195,7 @@ static int dump_emfrecord(void)
 
     case EMR_EXTCREATEFONTINDIRECTW:
     {
-        const EMREXTCREATEFONTINDIRECTW *pf = (const EMREXTCREATEFONTINDIRECTW *)PRD(offset, 4);
+        const EMREXTCREATEFONTINDIRECTW *pf = (const EMREXTCREATEFONTINDIRECTW *)PRD(offset, sizeof(*pf));
         const LOGFONTW *plf = &pf->elfw.elfLogFont;
 
         printf("%-20s %08x\n", "EMR_EXTCREATEFONTINDIRECTW", length);
@@ -187,7 +216,7 @@ static int dump_emfrecord(void)
 
     case EMR_EXTTEXTOUTW:
     {
-	const EMREXTTEXTOUTW *etoW = (const EMREXTTEXTOUTW *)PRD(offset, 4);
+	const EMREXTTEXTOUTW *etoW = (const EMREXTTEXTOUTW *)PRD(offset, sizeof(*etoW));
 
         printf("%-20s %08x\n", "EMR_EXTTEXTOUTW", length);
         printf("pt (%d,%d) rect (%d,%d - %d,%d) flags %#x, %s\n",
-- 
1.5.4.5






More information about the wine-patches mailing list