diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2021-03-26 12:54:32 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2021-03-26 12:54:32 +0100 |
commit | 926f5b3d21e97cbc659039aa7a03436e3826af0c (patch) | |
tree | 9bb1eae18e38e0c4791ff9c9b3625e1526784f04 | |
parent | 0cbfc5e2b9a5e84d3e164132c682eb79e2cf0a25 (diff) |
EMF: dump EmrCommentEmfplus
I.e. start dumping EMF+ data
Change-Id: I301abd9a3d4e9802e806f970bc72916c0010b3ea
-rw-r--r-- | msodumper/emfrecord.py | 121 |
1 files changed, 119 insertions, 2 deletions
diff --git a/msodumper/emfrecord.py b/msodumper/emfrecord.py index 1b527c4..59424c0 100644 --- a/msodumper/emfrecord.py +++ b/msodumper/emfrecord.py @@ -282,6 +282,64 @@ class EmrCommentPublic(EMFRecord): print("</emrCommentPublic>") +class EMFPlusRecordHeader(EMFRecord): + """The common start of EmfPlus* records.""" + def __init__(self, parent): + EMFRecord.__init__(self, parent) + + def peek(self): + print("<emfPlusRecordHeader>") + id = self.readuInt16() + record = RecordType[id] + type = record[0] + print('<Type value="%s" name="%s"/>' % (hex(id), type)) + self.Type = id + self.printAndSet("Flags", self.readuInt16()) + self.printAndSet("Size", self.readuInt32()) + self.printAndSet("DataSize", self.readuInt32()) + print("</emfPlusRecordHeader>") + + +class EmfPlusHeader(EMFRecord): + """The EmfPlusHeader record specifies the start of EMF+ data in the metafile.""" + def __init__(self, parent, header): + EMFRecord.__init__(self, parent) + self.header = header + + def dump(self): + print("<emfPlusHeader>") + pos = self.pos + self.pos += 12 # header size + dataPos = self.pos + self.printAndSet("Version", self.readuInt32()) + self.printAndSet("EmfPlusFlags", self.readuInt32()) + self.printAndSet("LogicalDpiX", self.readuInt32()) + self.printAndSet("LogicalDpiY", self.readuInt32()) + assert self.pos == dataPos + self.header.DataSize + self.parent.pos = pos + self.header.Size + print("</emfPlusHeader>") + + +class EmrCommentEmfplus(EMFRecord): + """The EMR_COMMENT_EMFPLUS record contains embedded EMF+ records.""" + def __init__(self, parent): + EMFRecord.__init__(self, parent) + + def dump(self): + size = self.parent.DataSize - 4 # CommentIdentifier doesn't count + print("<emrCommentEmfplus size='%s'>" % size) + end = self.pos + size + while self.pos < end: + header = EMFPlusRecordHeader(self) + header.peek() + if header.Type == 0x4001: # EmfPlusHeader + EmfPlusHeader(self, header).dump() + else: + print('<todo what="EmrCommentEmfplus::dump(): handle %s"/>' % RecordType[header.Type][0]) + self.pos += header.Size + print("</emrCommentEmfplus>") + + CommentIdentifier = { 0x00000000: "EMR_COMMENT_EMFSPOOL", 0x2B464D45: "EMR_COMMENT_EMFPLUS", @@ -302,7 +360,7 @@ class EmrComment(EMFRecord): if self.CommentIdentifier == 0x00000000: # EMR_COMMENT_EMFSPOOL print('<todo what="EmrComment::dump(): handle EMR_COMMENT_EMFSPOOL"/>') elif self.CommentIdentifier == 0x2B464D45: # EMR_COMMENT_EMFPLUS - print('<todo what="EmrComment::dump(): handle EMR_COMMENT_EMFPLUS"/>') + EmrCommentEmfplus(self).dump() elif self.CommentIdentifier == 0x43494447: # EMR_COMMENT_PUBLIC EmrCommentPublic(self).dump() else: @@ -974,7 +1032,66 @@ RecordType = { 0x00000077: ['EMR_SETLINKEDUFIS'], 0x00000078: ['EMR_SETTEXTJUSTIFICATION'], 0x00000079: ['EMR_COLORMATCHTOTARGETW'], - 0x0000007A: ['EMR_CREATECOLORSPACEW'] + 0x0000007A: ['EMR_CREATECOLORSPACEW'], + # EmfPlus + 0x4001: ['EmfPlusHeader'], + 0x4002: ['EmfPlusEndOfFile'], + 0x4003: ['EmfPlusComment'], + 0x4004: ['EmfPlusGetDC'], + 0x4005: ['EmfPlusMultiFormatStart'], + 0x4006: ['EmfPlusMultiFormatSection'], + 0x4007: ['EmfPlusMultiFormatEnd'], + 0x4008: ['EmfPlusObject'], + 0x4009: ['EmfPlusClear'], + 0x400A: ['EmfPlusFillRects'], + 0x400B: ['EmfPlusDrawRects'], + 0x400C: ['EmfPlusFillPolygon'], + 0x400D: ['EmfPlusDrawLines'], + 0x400E: ['EmfPlusFillEllipse'], + 0x400F: ['EmfPlusDrawEllipse'], + 0x4010: ['EmfPlusFillPie'], + 0x4011: ['EmfPlusDrawPie'], + 0x4012: ['EmfPlusDrawArc'], + 0x4013: ['EmfPlusFillRegion'], + 0x4014: ['EmfPlusFillPath'], + 0x4015: ['EmfPlusDrawPath'], + 0x4016: ['EmfPlusFillClosedCurve'], + 0x4017: ['EmfPlusDrawClosedCurve'], + 0x4018: ['EmfPlusDrawCurve'], + 0x4019: ['EmfPlusDrawBeziers'], + 0x401A: ['EmfPlusDrawImage'], + 0x401B: ['EmfPlusDrawImagePoints'], + 0x401C: ['EmfPlusDrawString'], + 0x401D: ['EmfPlusSetRenderingOrigin'], + 0x401E: ['EmfPlusSetAntiAliasMode'], + 0x401F: ['EmfPlusSetTextRenderingHint'], + 0x4020: ['EmfPlusSetTextContrast'], + 0x4021: ['EmfPlusSetInterpolationMode'], + 0x4022: ['EmfPlusSetPixelOffsetMode'], + 0x4023: ['EmfPlusSetCompositingMode'], + 0x4024: ['EmfPlusSetCompositingQuality'], + 0x4025: ['EmfPlusSave'], + 0x4026: ['EmfPlusRestore'], + 0x4027: ['EmfPlusBeginContainer'], + 0x4028: ['EmfPlusBeginContainerNoParams'], + 0x4029: ['EmfPlusEndContainer'], + 0x402A: ['EmfPlusSetWorldTransform'], + 0x402B: ['EmfPlusResetWorldTransform'], + 0x402C: ['EmfPlusMultiplyWorldTransform'], + 0x402D: ['EmfPlusTranslateWorldTransform'], + 0x402E: ['EmfPlusScaleWorldTransform'], + 0x402F: ['EmfPlusRotateWorldTransform'], + 0x4030: ['EmfPlusSetPageTransform'], + 0x4031: ['EmfPlusResetClip'], + 0x4032: ['EmfPlusSetClipRect'], + 0x4033: ['EmfPlusSetClipPath'], + 0x4034: ['EmfPlusSetClipRegion'], + 0x4035: ['EmfPlusOffsetClip'], + 0x4036: ['EmfPlusDrawDriverstring'], + 0x4037: ['EmfPlusStrokeFillPath'], + 0x4038: ['EmfPlusSerializableObject'], + 0x4039: ['EmfPlusSetTSGraphics'], + 0x403A: ['EmfPlusSetTSClip'], } # vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab: |