Piotr Caban : winedump: Add initial support for handling EMF+ records.

Alexandre Julliard julliard at winehq.org
Mon Jul 3 15:56:47 CDT 2017


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Jun 30 18:03:38 2017 +0200

winedump: Add initial support for handling EMF+ records.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/winedump/emf.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 125 insertions(+), 2 deletions(-)

diff --git a/tools/winedump/emf.c b/tools/winedump/emf.c
index 68f5b41..cce66c8 100644
--- a/tools/winedump/emf.c
+++ b/tools/winedump/emf.c
@@ -35,6 +35,15 @@
 #include "windef.h"
 #include "winbase.h"
 #include "wingdi.h"
+#include "gdiplusenums.h"
+
+typedef struct
+{
+    WORD Type;
+    WORD Flags;
+    DWORD Size;
+    DWORD DataSize;
+} EmfPlusRecordHeader;
 
 static const char *debugstr_wn(const WCHAR *wstr, unsigned int n)
 {
@@ -67,6 +76,7 @@ static unsigned int read_int(const unsigned char *buffer)
 }
 
 #define EMRCASE(x) case x: printf("%-20s %08x\n", #x, length); break
+#define EMRPLUSCASE(x) case x: printf("    %-20s %04x %08x %08x\n", #x, header->Flags, header->Size, header->DataSize); break
 
 static unsigned offset = 0;
 
@@ -162,7 +172,120 @@ static int dump_emfrecord(void)
     EMRCASE(EMR_WIDENPATH);
     EMRCASE(EMR_SELECTCLIPPATH);
     EMRCASE(EMR_ABORTPATH);
-    EMRCASE(EMR_GDICOMMENT);
+
+    case EMR_GDICOMMENT:
+    {
+        printf("%-20s %08x\n", "EMR_GDICOMMENT", length);
+
+        /* Handle EMF+ records */
+        if (length >= 16 && !memcmp((char*)PRD(offset + 12, sizeof(unsigned int)), "EMF+", 4))
+        {
+            const EmfPlusRecordHeader *header;
+            const unsigned int *data_size;
+
+            offset += 8;
+            length -= 8;
+            data_size = PRD(offset, sizeof(*data_size));
+            printf("data size = %x\n", *data_size);
+            offset += 8;
+            length -= 8;
+
+            while (length >= sizeof(*header))
+            {
+                header = PRD(offset, sizeof(*header));
+                switch(header->Type)
+                {
+                EMRPLUSCASE(EmfPlusRecordTypeInvalid);
+                EMRPLUSCASE(EmfPlusRecordTypeHeader);
+                EMRPLUSCASE(EmfPlusRecordTypeEndOfFile);
+                EMRPLUSCASE(EmfPlusRecordTypeComment);
+                EMRPLUSCASE(EmfPlusRecordTypeGetDC);
+                EMRPLUSCASE(EmfPlusRecordTypeMultiFormatStart);
+                EMRPLUSCASE(EmfPlusRecordTypeMultiFormatSection);
+                EMRPLUSCASE(EmfPlusRecordTypeMultiFormatEnd);
+                EMRPLUSCASE(EmfPlusRecordTypeObject);
+                EMRPLUSCASE(EmfPlusRecordTypeClear);
+                EMRPLUSCASE(EmfPlusRecordTypeFillRects);
+                EMRPLUSCASE(EmfPlusRecordTypeDrawRects);
+                EMRPLUSCASE(EmfPlusRecordTypeFillPolygon);
+                EMRPLUSCASE(EmfPlusRecordTypeDrawLines);
+                EMRPLUSCASE(EmfPlusRecordTypeFillEllipse);
+                EMRPLUSCASE(EmfPlusRecordTypeDrawEllipse);
+                EMRPLUSCASE(EmfPlusRecordTypeFillPie);
+                EMRPLUSCASE(EmfPlusRecordTypeDrawPie);
+                EMRPLUSCASE(EmfPlusRecordTypeDrawArc);
+                EMRPLUSCASE(EmfPlusRecordTypeFillRegion);
+                EMRPLUSCASE(EmfPlusRecordTypeFillPath);
+                EMRPLUSCASE(EmfPlusRecordTypeDrawPath);
+                EMRPLUSCASE(EmfPlusRecordTypeFillClosedCurve);
+                EMRPLUSCASE(EmfPlusRecordTypeDrawClosedCurve);
+                EMRPLUSCASE(EmfPlusRecordTypeDrawCurve);
+                EMRPLUSCASE(EmfPlusRecordTypeDrawBeziers);
+                EMRPLUSCASE(EmfPlusRecordTypeDrawImage);
+                EMRPLUSCASE(EmfPlusRecordTypeDrawImagePoints);
+                EMRPLUSCASE(EmfPlusRecordTypeDrawString);
+                EMRPLUSCASE(EmfPlusRecordTypeSetRenderingOrigin);
+                EMRPLUSCASE(EmfPlusRecordTypeSetAntiAliasMode);
+                EMRPLUSCASE(EmfPlusRecordTypeSetTextRenderingHint);
+                EMRPLUSCASE(EmfPlusRecordTypeSetTextContrast);
+                EMRPLUSCASE(EmfPlusRecordTypeSetInterpolationMode);
+                EMRPLUSCASE(EmfPlusRecordTypeSetPixelOffsetMode);
+                EMRPLUSCASE(EmfPlusRecordTypeSetCompositingMode);
+                EMRPLUSCASE(EmfPlusRecordTypeSetCompositingQuality);
+                EMRPLUSCASE(EmfPlusRecordTypeSave);
+                EMRPLUSCASE(EmfPlusRecordTypeRestore);
+                EMRPLUSCASE(EmfPlusRecordTypeBeginContainer);
+                EMRPLUSCASE(EmfPlusRecordTypeBeginContainerNoParams);
+                EMRPLUSCASE(EmfPlusRecordTypeEndContainer);
+                EMRPLUSCASE(EmfPlusRecordTypeSetWorldTransform);
+                EMRPLUSCASE(EmfPlusRecordTypeResetWorldTransform);
+                EMRPLUSCASE(EmfPlusRecordTypeMultiplyWorldTransform);
+                EMRPLUSCASE(EmfPlusRecordTypeTranslateWorldTransform);
+                EMRPLUSCASE(EmfPlusRecordTypeScaleWorldTransform);
+                EMRPLUSCASE(EmfPlusRecordTypeRotateWorldTransform);
+                EMRPLUSCASE(EmfPlusRecordTypeSetPageTransform);
+                EMRPLUSCASE(EmfPlusRecordTypeResetClip);
+                EMRPLUSCASE(EmfPlusRecordTypeSetClipRect);
+                EMRPLUSCASE(EmfPlusRecordTypeSetClipPath);
+                EMRPLUSCASE(EmfPlusRecordTypeSetClipRegion);
+                EMRPLUSCASE(EmfPlusRecordTypeOffsetClip);
+                EMRPLUSCASE(EmfPlusRecordTypeDrawDriverString);
+                EMRPLUSCASE(EmfPlusRecordTypeStrokeFillPath);
+                EMRPLUSCASE(EmfPlusRecordTypeSerializableObject);
+                EMRPLUSCASE(EmfPlusRecordTypeSetTSGraphics);
+                EMRPLUSCASE(EmfPlusRecordTypeSetTSClip);
+                EMRPLUSCASE(EmfPlusRecordTotal);
+
+                default:
+                    printf("    unknown EMF+ record %x %04x %08x\n", header->Type, header->Flags, header->Size);
+                    break;
+                }
+
+                if (length<sizeof(*header) || header->Size%4)
+                    return -1;
+
+                length -= sizeof(*header);
+                offset += sizeof(*header);
+
+                for (i=0; i<header->Size-sizeof(*header); i+=4)
+                {
+                    if (i%16 == 0)
+                        printf("       ");
+                    if (!(ptr = PRD(offset, 4))) return -1;
+                    length -= 4;
+                    offset += 4;
+                    printf("%08x ", read_int(ptr));
+                    if ((i % 16 == 12) || (i + 4 == header->Size - sizeof(*header)))
+                        printf("\n");
+                }
+            }
+
+            return 0;
+        }
+
+        break;
+    }
+
     EMRCASE(EMR_FILLRGN);
     EMRCASE(EMR_FRAMERGN);
     EMRCASE(EMR_INVERTRGN);
@@ -178,7 +301,7 @@ static int dump_emfrecord(void)
         if (length >= sizeof(*clip) + sizeof(*data))
             rc_count = data->rdh.nCount;
 
-        printf("%-20s %08x\n", "EMREXTSELECTCLIPRGN", length);
+        printf("%-20s %08x\n", "EMR_EXTSELECTCLIPRGN", length);
         printf("mode %d, rects %d\n", clip->iMode, rc_count);
         for (i = 0, rc = (const RECT *)data->Buffer; i < rc_count; i++, rc++)
             printf(" (%d,%d)-(%d,%d)", rc->left, rc->top, rc->right, rc->bottom);




More information about the wine-cvs mailing list