"""
Windows Meta File
"""
from construct import *
wmf_record = Struct("records",
ULInt32("size"), # size in words, including the size, function and params
Enum(ULInt16("function"),
AbortDoc = 0x0052,
Aldus_Header = 0x0001,
AnimatePalette = 0x0436,
Arc = 0x0817,
BitBlt = 0x0922,
Chord = 0x0830,
CLP_Header16 = 0x0002,
CLP_Header32 = 0x0003,
CreateBitmap = 0x06FE,
CreateBitmapIndirect = 0x02FD,
CreateBrush = 0x00F8,
CreateBrushIndirect = 0x02FC,
CreateFontIndirect = 0x02FB,
CreatePalette = 0x00F7,
CreatePatternBrush = 0x01F9,
CreatePenIndirect = 0x02FA,
CreateRegion = 0x06FF,
DeleteObject = 0x01F0,
DibBitblt = 0x0940,
DibCreatePatternBrush = 0x0142,
DibStretchBlt = 0x0B41,
DrawText = 0x062F,
Ellipse = 0x0418,
EndDoc = 0x005E,
EndPage = 0x0050,
EOF = 0x0000,
Escape = 0x0626,
ExcludeClipRect = 0x0415,
ExtFloodFill = 0x0548,
ExtTextOut = 0x0A32,
FillRegion = 0x0228,
FloodFill = 0x0419,
FrameRegion = 0x0429,
Header = 0x0004,
IntersectClipRect = 0x0416,
InvertRegion = 0x012A,
LineTo = 0x0213,
MoveTo = 0x0214,
OffsetClipRgn = 0x0220,
OffsetViewportOrg = 0x0211,
OffsetWindowOrg = 0x020F,
PaintRegion = 0x012B,
PatBlt = 0x061D,
Pie = 0x081A,
Polygon = 0x0324,
Polyline = 0x0325,
PolyPolygon = 0x0538,
RealizePalette = 0x0035,
Rectangle = 0x041B,
ResetDC = 0x014C,
ResizePalette = 0x0139,
RestoreDC = 0x0127,
RoundRect = 0x061C,
SaveDC = 0x001E,
ScaleViewportExt = 0x0412,
ScaleWindowExt = 0x0410,
SelectClipRegion = 0x012C,
SelectObject = 0x012D,
SelectPalette = 0x0234,
SetBKColor = 0x0201,
SetBKMode = 0x0102,
SetDibToDev = 0x0D33,
SelLayout = 0x0149,
SetMapMode = 0x0103,
SetMapperFlags = 0x0231,
SetPalEntries = 0x0037,
SetPixel = 0x041F,
SetPolyFillMode = 0x0106,
SetReLabs = 0x0105,
SetROP2 = 0x0104,
SetStretchBltMode = 0x0107,
SetTextAlign = 0x012E,
SetTextCharExtra = 0x0108,
SetTextColor = 0x0209,
SetTextJustification = 0x020A,
SetViewportExt = 0x020E,
SetViewportOrg = 0x020D,
SetWindowExt = 0x020C,
SetWindowOrg = 0x020B,
StartDoc = 0x014D,
StartPage = 0x004F,
StretchBlt = 0x0B23,
StretchDIB = 0x0F43,
TextOut = 0x0521,
_default_ = Pass,
),
Array(lambda ctx: ctx.size - 3, ULInt16("params")),
)
wmf_placeable_header = Struct("placeable_header",
Const(ULInt32("key"), 0x9AC6CDD7),
ULInt16("handle"),
SLInt16("left"),
SLInt16("top"),
SLInt16("right"),
SLInt16("bottom"),
ULInt16("units_per_inch"),
Padding(4),
ULInt16("checksum")
)
wmf_file = Struct("wmf_file",
# --- optional placeable header ---
Optional(wmf_placeable_header),
# --- header ---
Enum(ULInt16("type"),
InMemory = 0,
File = 1,
),
Const(ULInt16("header_size"), 9),
ULInt16("version"),
ULInt32("size"), # file size is in words
ULInt16("number_of_objects"),
ULInt32("size_of_largest_record"),
ULInt16("number_of_params"),
# --- records ---
GreedyRange(wmf_record)
)