Makefile               |    1 
 convert-enum.py        |   46 ++++++++
 msodumper/wmfrecord.py |  272 ++++++++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 315 insertions(+), 4 deletions(-)

New commits:
commit 9d706a8f4a0d35a2b11ff1f67b401af05926241a
Author:     Hossein <hoss...@libreoffice.org>
AuthorDate: Sat Sep 11 16:08:15 2021 +0200
Commit:     Hossein <hoss...@libreoffice.org>
CommitDate: Sat Sep 11 16:13:03 2021 +0200

    Added all the enums from the wmf docs
    
    All the enumerations used for the WMF files as described in [MS-WMF]
    v20210625 (protocol revision 17.0) are added, except those that were
    already existing.
    The convert-enum.py script converts the C-style enums to Python
    dictionaries that are used in the Python code.
    
    Change-Id: Ia12f4e326e927d21f17ef9e2fb6729e63e1e33e3
    Reviewed-on: https://gerrit.libreoffice.org/c/mso-dumper/+/121943
    Tested-by: Hossein <hoss...@libreoffice.org>
    Reviewed-by: Hossein <hoss...@libreoffice.org>

diff --git a/Makefile b/Makefile
index 9193c41..39312bb 100644
--- a/Makefile
+++ b/Makefile
@@ -9,3 +9,4 @@ check:
        pycodestyle --ignore=E501 swlaycache-dump.py 
msodumper/swlaycacherecord.py
        pycodestyle --ignore=E501 ole1-dump.py msodumper/ole1record.py
        pycodestyle --ignore=E501 ole2preview-dump.py 
msodumper/ole2previewrecord.py
+       pycodestyle --ignore=E501 convert-enum.py
diff --git a/convert-enum.py b/convert-enum.py
new file mode 100755
index 0000000..0a1cae0
--- /dev/null
+++ b/convert-enum.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python3
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+#
+# This is a simple script to convert C enum from documentation to the
+# Dict that is used in the Python code
+#
+# Example input:
+# ---------------
+# typedef enum
+# {
+# BLACKONWHITE = 0x0001,
+# WHITEONBLACK = 0x0002,
+# COLORONCOLOR = 0x0003,
+# HALFTONE = 0x0004
+# } StretchMode;
+# ---------------
+#
+# Example output:
+# ---------------
+# StretchMode = {
+#     0x0001: "BLACKONWHITE",
+#     0x0002: "WHITEONBLACK",
+#     0x0003: "COLORONCOLOR",
+#     0x0004: "HALFTONE",
+# }
+# ---------------
+
+import sys
+
+result = ""
+for line in sys.stdin:
+    word = line.split()
+    if len(word) == 0 or word[0] == "{" or word[0] == "enum":
+        continue
+    elif word[0] == "}":
+        name = word[1].replace(";", "")
+        result = name + " = {\n" + result
+    elif len(word) == 3:
+        enum = word[2].replace(",", "")
+        result += ("    " + enum + ": \"" + word[0] + "\",\n")
+result += "}"
+print(result)
diff --git a/msodumper/wmfrecord.py b/msodumper/wmfrecord.py
index 2294301..96cdca1 100644
--- a/msodumper/wmfrecord.py
+++ b/msodumper/wmfrecord.py
@@ -11,9 +11,33 @@ PlaceableKey = {
     0x9ac6cdd7: "META_PLACEABLE",
 }
 
-FileType = {
-    0x00: "Memory",
-    0x01: "Disk",
+BinaryRasterOperation = {
+    0x0001: "R2_BLACK",
+    0x0002: "R2_NOTMERGEPEN",
+    0x0003: "R2_MASKNOTPEN",
+    0x0004: "R2_NOTCOPYPEN",
+    0x0005: "R2_MASKPENNOT",
+    0x0006: "R2_NOT",
+    0x0007: "R2_XORPEN",
+    0x0008: "R2_NOTMASKPEN",
+    0x0009: "R2_MASKPEN",
+    0x000A: "R2_NOTXORPEN",
+    0x000B: "R2_NOP",
+    0x000C: "R2_MERGENOTPEN",
+    0x000D: "R2_COPYPEN",
+    0x000E: "R2_MERGEPENNOT",
+    0x000F: "R2_MERGEPEN",
+    0x0010: "R2_WHITE",
+}
+
+BitCount = {
+    0x0000: "BI_BITCOUNT_0",
+    0x0001: "BI_BITCOUNT_1",
+    0x0004: "BI_BITCOUNT_2",
+    0x0008: "BI_BITCOUNT_3",
+    0x0010: "BI_BITCOUNT_4",
+    0x0018: "BI_BITCOUNT_5",
+    0x0020: "BI_BITCOUNT_6",
 }
 
 # The BrushStyle Enumeration specifies the different possible brush types that 
can be used in graphics operations.
@@ -30,6 +54,81 @@ BrushStyle = {
     0x0009: "BS_MONOPATTERN"
 }
 
+CharacterSet = {
+    0x00000001: "DEFAULT_CHARSET",
+    0x00000002: "SYMBOL_CHARSET",
+    0x0000004D: "MAC_CHARSET",
+    0x00000080: "SHIFTJIS_CHARSET",
+    0x00000081: "HANGUL_CHARSET",
+    0x00000082: "JOHAB_CHARSET",
+    0x00000086: "GB2312_CHARSET",
+    0x00000088: "CHINESEBIG5_CHARSET",
+    0x000000A1: "GREEK_CHARSET",
+    0x000000A2: "TURKISH_CHARSET",
+    0x000000A3: "VIETNAMESE_CHARSET",
+    0x000000B1: "HEBREW_CHARSET",
+    0x000000B2: "ARABIC_CHARSET",
+    0x000000BA: "BALTIC_CHARSET",
+    0x000000CC: "RUSSIAN_CHARSET",
+    0x000000DE: "THAI_CHARSET",
+    0x000000EE: "EASTEUROPE_CHARSET",
+    0x000000FF: "OEM_CHARSET",
+}
+
+ColorUsage = {
+    0x0000: "DIB_RGB_COLORS",
+    0x0001: "DIB_PAL_COLORS",
+    0x0002: "DIB_PAL_INDICES",
+}
+
+Compression = {
+    0x0000: "BI_RGB",
+    0x0001: "BI_RLE8",
+    0x0002: "BI_RLE4",
+    0x0003: "BI_BITFIELDS",
+    0x0004: "BI_JPEG",
+    0x0005: "BI_PNG",
+    0x000B: "BI_CMYK",
+    0x000C: "BI_CMYKRLE8",
+    0x000D: "BI_CMYKRLE4",
+}
+
+FamilyFont = {
+    0x00: "FF_DONTCARE",
+    0x01: "FF_ROMAN",
+    0x02: "FF_SWISS",
+    0x03: "FF_MODERN",
+    0x04: "FF_SCRIPT",
+    0x05: "FF_DECORATIVE",
+}
+
+FloodFill = {
+    0x0000: "FLOODFILLBORDER",
+    0x0001: "FLOODFILLSURFACE",
+}
+
+FontQuality = {
+    0x00: "DEFAULT_QUALITY",
+    0x01: "DRAFT_QUALITY",
+    0x02: "PROOF_QUALITY",
+    0x03: "NONANTIALIASED_QUALITY",
+    0x04: "ANTIALIASED_QUALITY",
+    0x05: "CLEARTYPE_QUALITY",
+}
+
+GamutMappingIntent = {
+    0x00000008: "LCS_GM_ABS_COLORIMETRIC",
+    0x00000001: "LCS_GM_BUSINESS",
+    0x00000002: "LCS_GM_GRAPHICS",
+    0x00000004: "LCS_GM_IMAGES",
+}
+
+ColorUsage = {
+    0x0000: "DIB_RGB_COLORS",
+    0x0001: "DIB_PAL_COLORS",
+    0x0002: "DIB_PAL_INDICES",
+}
+
 # The HatchStyle Enumeration specifies the hatch pattern.
 HatchStyle = {
     0x0000: "HS_HORIZONTAL",
@@ -40,6 +139,171 @@ HatchStyle = {
     0x0005: "HS_DIAGCROSS"
 }
 
+Layout = {
+    0x0000: "LAYOUT_LTR",
+    0x0001: "LAYOUT_RTL",
+    0x0008: "LAYOUT_BITMAPORIENTATIONPRESERVED",
+}
+
+LogicalColorSpace = {
+    0x00000000: "LCS_CALIBRATED_RGB",
+    0x73524742: "LCS_sRGB",
+    0x57696E20: "LCS_WINDOWS_COLOR_SPACE",
+}
+
+LogicalColorSpaceV5 = {
+    0x4C494E4B: "LCS_PROFILE_LINKED",
+    0x4D424544: "LCS_PROFILE_EMBEDDED",
+}
+
+MapMode = {
+    0x0001: "MM_TEXT",
+    0x0002: "MM_LOMETRIC",
+    0x0003: "MM_HIMETRIC",
+    0x0004: "MM_LOENGLISH",
+    0x0005: "MM_HIENGLISH",
+    0x0006: "MM_TWIPS",
+    0x0007: "MM_ISOTROPIC",
+    0x0008: "MM_ANISOTROPIC",
+}
+
+MetafileEscapes = {
+    0x0001: "NEWFRAME",
+    0x0002: "ABORTDOC",
+    0x0003: "NEXTBAND",
+    0x0004: "SETCOLORTABLE",
+    0x0005: "GETCOLORTABLE",
+    0x0006: "FLUSHOUT",
+    0x0007: "DRAFTMODE",
+    0x0008: "QUERYESCSUPPORT",
+    0x0009: "SETABORTPROC",
+    0x000A: "STARTDOC",
+    0x000B: "ENDDOC",
+    0x000C: "GETPHYSPAGESIZE",
+    0x000D: "GETPRINTINGOFFSET",
+    0x000E: "GETSCALINGFACTOR",
+    0x000F: "META_ESCAPE_ENHANCED_METAFILE",
+    0x0010: "SETPENWIDTH",
+    0x0011: "SETCOPYCOUNT",
+    0x0012: "SETPAPERSOURCE",
+    0x0013: "PASSTHROUGH",
+    0x0014: "GETTECHNOLOGY",
+    0x0015: "SETLINECAP",
+    0x0016: "SETLINEJOIN",
+    0x0017: "SETMITERLIMIT",
+    0x0018: "BANDINFO",
+    0x0019: "DRAWPATTERNRECT",
+    0x001A: "GETVECTORPENSIZE",
+    0x001B: "GETVECTORBRUSHSIZE",
+    0x001C: "ENABLEDUPLEX",
+    0x001D: "GETSETPAPERBINS",
+    0x001E: "GETSETPRINTORIENT",
+    0x001F: "ENUMPAPERBINS",
+    0x0020: "SETDIBSCALING",
+    0x0021: "EPSPRINTING",
+    0x0022: "ENUMPAPERMETRICS",
+    0x0023: "GETSETPAPERMETRICS",
+    0x0025: "POSTSCRIPT_DATA",
+    0x0026: "POSTSCRIPT_IGNORE",
+    0x002A: "GETDEVICEUNITS",
+    0x0100: "GETEXTENDEDTEXTMETRICS",
+    0x0102: "GETPAIRKERNTABLE",
+    0x0200: "EXTTEXTOUT",
+    0x0201: "GETFACENAME",
+    0x0202: "DOWNLOADFACE",
+    0x0801: "METAFILE_DRIVER",
+    0x0C01: "QUERYDIBSUPPORT",
+    0x1000: "BEGIN_PATH",
+    0x1001: "CLIP_TO_PATH",
+    0x1002: "END_PATH",
+    0x100E: "OPENCHANNEL",
+    0x100F: "DOWNLOADHEADER",
+    0x1010: "CLOSECHANNEL",
+    0x1013: "POSTSCRIPT_PASSTHROUGH",
+    0x1014: "ENCAPSULATED_POSTSCRIPT",
+    0x1015: "POSTSCRIPT_IDENTIFY",
+    0x1016: "POSTSCRIPT_INJECTION",
+    0x1017: "CHECKJPEGFORMAT",
+    0x1018: "CHECKPNGFORMAT",
+    0x1019: "GET_PS_FEATURESETTING",
+    0x101A: "MXDC_ESCAPE",
+    0x11D8: "SPCLPASSTHROUGH2",
+}
+
+MetafileType = {
+    0x0001: "MEMORYMETAFILE",
+    0x0002: "DISKMETAFILE",
+}
+
+MetafileVersion = {
+    0x0100: "METAVERSION100",
+    0x0300: "METAVERSION300",
+}
+
+MixMode = {
+    0x0001: "TRANSPARENT",
+    0x0002: "OPAQUE",
+}
+
+OutPrecision = {
+    0x00000000: "OUT_DEFAULT_PRECIS",
+    0x00000001: "OUT_STRING_PRECIS",
+    0x00000003: "OUT_STROKE_PRECIS",
+    0x00000004: "OUT_TT_PRECIS",
+    0x00000005: "OUT_DEVICE_PRECIS",
+    0x00000006: "OUT_RASTER_PRECIS",
+    0x00000007: "OUT_TT_ONLY_PRECIS",
+    0x00000008: "OUT_OUTLINE_PRECIS",
+    0x00000009: "OUT_SCREEN_OUTLINE_PRECIS",
+    0x0000000A: "OUT_PS_ONLY_PRECIS",
+}
+
+PaletteEntryFlag = {
+    0x01: "PC_RESERVED",
+    0x02: "PC_EXPLICIT",
+    0x04: "PC_NOCOLLAPSE",
+}
+
+PostScriptCap = {
+    -2: "PostScriptNotSet",
+    0: "PostScriptFlatCap",
+    1: "PostScriptRoundCap",
+    2: "PostScriptSquareCap",
+}
+
+PostScriptClipping = {
+    0x0000: "CLIP_SAVE",
+    0x0001: "CLIP_RESTORE",
+    0x0002: "CLIP_INCLUSIVE",
+}
+
+PostScriptFeatureSetting = {
+    0x00000000: "FEATURESETTING_NUP",
+    0x00000001: "FEATURESETTING_OUTPUT",
+    0x00000002: "FEATURESETTING_PSLEVEL",
+    0x00000003: "FEATURESETTING_CUSTPAPER",
+    0x00000004: "FEATURESETTING_MIRROR",
+    0x00000005: "FEATURESETTING_NEGATIVE",
+    0x00000006: "FEATURESETTING_PROTOCOL",
+    0x00001000: "FEATURESETTING_PRIVATE_BEGIN",
+    0x00001FFF: "FEATURESETTING_PRIVATE_END",
+}
+
+PostScriptJoin = {
+    -2: "PostScriptNotSet",
+    0: "PostScriptMiterJoin",
+    1: "PostScriptRoundJoin",
+    2: "PostScriptBevelJoin",
+}
+
+StretchMode = {
+    0x0001: "BLACKONWHITE",
+    0x0002: "WHITEONBLACK",
+    0x0003: "COLORONCOLOR",
+    0x0004: "HALFTONE",
+}
+
+
 # No idea what's the proper name of this thing, see
 # http://msdn.microsoft.com/en-us/library/dd145130%28VS.85%29.aspx
 RasterPolishMap = {
@@ -489,7 +753,7 @@ class Header(WMFRecord):
             PlaceableHeader(self).dump()
             self.Size += 22
         print("<header>")
-        self.printAndSet("FileType", self.readuInt16(), dict=FileType)
+        self.printAndSet("FileType", self.readuInt16(), dict=MetafileType)
         self.printAndSet("HeaderSize", self.readuInt16(), hexdump=False)
         self.printAndSet("Version", self.readuInt16(), hexdump=False)
         self.printAndSet("FileSize", self.readuInt32(), hexdump=False)

Reply via email to