summaryrefslogtreecommitdiff
path: root/external/construct/formats/graphics/emf.py
diff options
context:
space:
mode:
Diffstat (limited to 'external/construct/formats/graphics/emf.py')
-rw-r--r--external/construct/formats/graphics/emf.py198
1 files changed, 198 insertions, 0 deletions
diff --git a/external/construct/formats/graphics/emf.py b/external/construct/formats/graphics/emf.py
new file mode 100644
index 0000000..4f00a03
--- /dev/null
+++ b/external/construct/formats/graphics/emf.py
@@ -0,0 +1,198 @@
+"""
+Enhanced Meta File
+"""
+from construct import *
+
+
+record_type = Enum(ULInt32("record_type"),
+ ABORTPATH = 68,
+ ANGLEARC = 41,
+ ARC = 45,
+ ARCTO = 55,
+ BEGINPATH = 59,
+ BITBLT = 76,
+ CHORD = 46,
+ CLOSEFIGURE = 61,
+ CREATEBRUSHINDIRECT = 39,
+ CREATEDIBPATTERNBRUSHPT = 94,
+ CREATEMONOBRUSH = 93,
+ CREATEPALETTE = 49,
+ CREATEPEN = 38,
+ DELETEOBJECT = 40,
+ ELLIPSE = 42,
+ ENDPATH = 60,
+ EOF = 14,
+ EXCLUDECLIPRECT = 29,
+ EXTCREATEFONTINDIRECTW = 82,
+ EXTCREATEPEN = 95,
+ EXTFLOODFILL = 53,
+ EXTSELECTCLIPRGN = 75,
+ EXTTEXTOUTA = 83,
+ EXTTEXTOUTW = 84,
+ FILLPATH = 62,
+ FILLRGN = 71,
+ FLATTENPATH = 65,
+ FRAMERGN = 72,
+ GDICOMMENT = 70,
+ HEADER = 1,
+ INTERSECTCLIPRECT = 30,
+ INVERTRGN = 73,
+ LINETO = 54,
+ MASKBLT = 78,
+ MODIFYWORLDTRANSFORM = 36,
+ MOVETOEX = 27,
+ OFFSETCLIPRGN = 26,
+ PAINTRGN = 74,
+ PIE = 47,
+ PLGBLT = 79,
+ POLYBEZIER = 2,
+ POLYBEZIER16 = 85,
+ POLYBEZIERTO = 5,
+ POLYBEZIERTO16 = 88,
+ POLYDRAW = 56,
+ POLYDRAW16 = 92,
+ POLYGON = 3,
+ POLYGON16 = 86,
+ POLYLINE = 4,
+ POLYLINE16 = 87,
+ POLYLINETO = 6,
+ POLYLINETO16 = 89,
+ POLYPOLYGON = 8,
+ POLYPOLYGON16 = 91,
+ POLYPOLYLINE = 7,
+ POLYPOLYLINE16 = 90,
+ POLYTEXTOUTA = 96,
+ POLYTEXTOUTW = 97,
+ REALIZEPALETTE = 52,
+ RECTANGLE = 43,
+ RESIZEPALETTE = 51,
+ RESTOREDC = 34,
+ ROUNDRECT = 44,
+ SAVEDC = 33,
+ SCALEVIEWPORTEXTEX = 31,
+ SCALEWINDOWEXTEX = 32,
+ SELECTCLIPPATH = 67,
+ SELECTOBJECT = 37,
+ SELECTPALETTE = 48,
+ SETARCDIRECTION = 57,
+ SETBKCOLOR = 25,
+ SETBKMODE = 18,
+ SETBRUSHORGEX = 13,
+ SETCOLORADJUSTMENT = 23,
+ SETDIBITSTODEVICE = 80,
+ SETMAPMODE = 17,
+ SETMAPPERFLAGS = 16,
+ SETMETARGN = 28,
+ SETMITERLIMIT = 58,
+ SETPALETTEENTRIES = 50,
+ SETPIXELV = 15,
+ SETPOLYFILLMODE = 19,
+ SETROP2 = 20,
+ SETSTRETCHBLTMODE = 21,
+ SETTEXTALIGN = 22,
+ SETTEXTCOLOR = 24,
+ SETVIEWPORTEXTEX = 11,
+ SETVIEWPORTORGEX = 12,
+ SETWINDOWEXTEX = 9,
+ SETWINDOWORGEX = 10,
+ SETWORLDTRANSFORM = 35,
+ STRETCHBLT = 77,
+ STRETCHDIBITS = 81,
+ STROKEANDFILLPATH = 63,
+ STROKEPATH = 64,
+ WIDENPATH = 66,
+ _default_ = Pass,
+)
+
+generic_record = Struct("records",
+ record_type,
+ ULInt32("record_size"), # Size of the record in bytes
+ Union("params", # Parameters
+ Field("raw", lambda ctx: ctx._.record_size - 8),
+ Array(lambda ctx: (ctx._.record_size - 8) // 4, ULInt32("params"))
+ ),
+)
+
+header_record = Struct("header_record",
+ Const(record_type, "HEADER"),
+ ULInt32("record_size"), # Size of the record in bytes
+ SLInt32("bounds_left"), # Left inclusive bounds
+ SLInt32("bounds_right"), # Right inclusive bounds
+ SLInt32("bounds_top"), # Top inclusive bounds
+ SLInt32("bounds_bottom"), # Bottom inclusive bounds
+ SLInt32("frame_left"), # Left side of inclusive picture frame
+ SLInt32("frame_right"), # Right side of inclusive picture frame
+ SLInt32("frame_top"), # Top side of inclusive picture frame
+ SLInt32("frame_bottom"), # Bottom side of inclusive picture frame
+ Const(ULInt32("signature"), 0x464D4520),
+ ULInt32("version"), # Version of the metafile
+ ULInt32("size"), # Size of the metafile in bytes
+ ULInt32("num_of_records"), # Number of records in the metafile
+ ULInt16("num_of_handles"), # Number of handles in the handle table
+ Padding(2),
+ ULInt32("description_size"), # Size of description string in WORDs
+ ULInt32("description_offset"), # Offset of description string in metafile
+ ULInt32("num_of_palette_entries"), # Number of color palette entries
+ SLInt32("device_width_pixels"), # Width of reference device in pixels
+ SLInt32("device_height_pixels"), # Height of reference device in pixels
+ SLInt32("device_width_mm"), # Width of reference device in millimeters
+ SLInt32("device_height_mm"), # Height of reference device in millimeters
+
+ # description string
+ Pointer(lambda ctx: ctx.description_offset,
+ StringAdapter(
+ Array(lambda ctx: ctx.description_size,
+ Field("description", 2)
+ )
+ )
+ ),
+
+ # padding up to end of record
+ Padding(lambda ctx: ctx.record_size - 88),
+)
+
+emf_file = Struct("emf_file",
+ header_record,
+ Array(lambda ctx: ctx.header_record.num_of_records - 1,
+ generic_record
+ ),
+)
+
+
+if __name__ == "__main__":
+ obj = emf_file.parse_stream(open("../../../tests/emf1.emf", "rb"))
+ print (obj)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+