msodumper/docdirstream.py | 14 ++++ msodumper/emfrecord.py | 132 ++++++++++++++++++++++++++++++++++++++++++++-- msodumper/wmfrecord.py | 42 ++++++++++++++ 3 files changed, 183 insertions(+), 5 deletions(-)
New commits: commit 253852226a367057fbe99a51f2a906a48ece57eb Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Sun Apr 13 19:12:26 2014 +0200 dump EmrCreatebrushindirect diff --git a/msodumper/emfrecord.py b/msodumper/emfrecord.py index 82bbcd3..8875c9e 100644 --- a/msodumper/emfrecord.py +++ b/msodumper/emfrecord.py @@ -81,6 +81,56 @@ class EmrRestoredc(EMFRecord): assert self.pos - posOrig == self.Size +class EmrCreatebrushindirect(EMFRecord): + """Defines a logical brush with a LogBrushEx object.""" + def __init__(self, parent): + EMFRecord.__init__(self, parent) + + def dump(self): + posOrig = self.pos + self.printAndSet("Type", self.readuInt32()) + self.printAndSet("Size", self.readuInt32(), hexdump=False) + self.printAndSet("ihBrush", self.readuInt32(), hexdump=False) + LogBrushEx(self, "LogBrush").dump() + assert self.pos - posOrig == self.Size + + +# The HatchStyle enumeration is an extension to the WMF HatchStyle enumeration. +EmfHatchStyle = { + 0x0006: "HS_SOLIDCLR", + 0x0007: "HS_DITHEREDCLR", + 0x0008: "HS_SOLIDTEXTCLR", + 0x0009: "HS_DITHEREDTEXTCLR", + 0x000A: "HS_SOLIDBKCLR", + 0x000B: "HS_DITHEREDBKCLR" +} +HatchStyle = dict(wmfrecord.HatchStyle.items() + EmfHatchStyle.items()) + + +class LogBrushEx(EMFRecord): + """The LogBrushEx object defines the style, color, and pattern of a device-independent brush.""" + def __init__(self, parent, name): + EMFRecord.__init__(self, parent) + self.name = name + + def dump(self): + posOrig = self.pos + print '<%s>' % self.name + self.printAndSet("BrushStyle", self.readuInt32(), dict=wmfrecord.BrushStyle) + wmfrecord.ColorRef(self, "Color").dump() + self.printAndSet("BrushHatch", self.readuInt32(), dict=HatchStyle) + print '</%s>' % self.name + self.parent.pos = self.pos + + +ModifyWorldTransformMode = { + 0x01: "MWT_IDENTITY", + 0x02: "MWT_LEFTMULTIPLY", + 0x03: "MWT_RIGHTMULTIPLY", + 0x04: "MWT_SET" +} + + class EmrModifyworldtransform(EMFRecord): """Modifies the current world-space to page-space transform.""" def __init__(self, parent): @@ -91,7 +141,8 @@ class EmrModifyworldtransform(EMFRecord): self.printAndSet("Type", self.readuInt32()) self.printAndSet("Size", self.readuInt32(), hexdump=False) XForm(self, "Xform").dump() - #assert self.pos - posOrig == self.Size + self.printAndSet("ModifyWorldTransformMode", self.readuInt32(), dict=ModifyWorldTransformMode) + assert self.pos - posOrig == self.Size class XForm(EMFRecord): @@ -327,7 +378,7 @@ RecordType = { 0x00000024: ['EMR_MODIFYWORLDTRANSFORM', EmrModifyworldtransform], 0x00000025: ['EMR_SELECTOBJECT'], 0x00000026: ['EMR_CREATEPEN'], - 0x00000027: ['EMR_CREATEBRUSHINDIRECT'], + 0x00000027: ['EMR_CREATEBRUSHINDIRECT', EmrCreatebrushindirect], 0x00000028: ['EMR_DELETEOBJECT'], 0x00000029: ['EMR_ANGLEARC'], 0x0000002A: ['EMR_ELLIPSE'], diff --git a/msodumper/wmfrecord.py b/msodumper/wmfrecord.py index cd0b353..5cfcb1d 100644 --- a/msodumper/wmfrecord.py +++ b/msodumper/wmfrecord.py @@ -8,6 +8,32 @@ from docdirstream import DOCDirStream +# The BrushStyle Enumeration specifies the different possible brush types that can be used in graphics operations. +BrushStyle = { + 0x0000: "BS_SOLID", + 0x0001: "BS_NULL", + 0x0002: "BS_HATCHED", + 0x0003: "BS_PATTERN", + 0x0004: "BS_INDEXED", + 0x0005: "BS_DIBPATTERN", + 0x0006: "BS_DIBPATTERNPT", + 0x0007: "BS_PATTERN8X8", + 0x0008: "BS_DIBPATTERN8X8", + 0x0009: "BS_MONOPATTERN" +} + + +# The HatchStyle Enumeration specifies the hatch pattern. +HatchStyle = { + 0x0000: "HS_HORIZONTAL", + 0x0001: "HS_VERTICAL", + 0x0002: "HS_FDIAGONAL", + 0x0003: "HS_BDIAGONAL", + 0x0004: "HS_CROSS", + 0x0005: "HS_DIAGCROSS" +} + + class WMFRecord(DOCDirStream): def __init__(self, parent): DOCDirStream.__init__(self, parent.bytes) @@ -67,4 +93,20 @@ class PointL(WMFRecord): print '</%s>' % self.name self.parent.pos = self.pos + +class ColorRef(WMFRecord): + """The ColorRef Object defines the RGB color.""" + def __init__(self, parent, name): + WMFRecord.__init__(self, parent) + self.name = name + + def dump(self): + print '<%s type="ColorRef">' % self.name + self.printAndSet("Red", self.readuInt8(), hexdump=False) + self.printAndSet("Green", self.readuInt8(), hexdump=False) + self.printAndSet("Blue", self.readuInt8(), hexdump=False) + self.printAndSet("Reserved", self.readuInt8(), hexdump=False) + print '</%s>' % self.name + self.parent.pos = self.pos + # vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab: commit 9f04fbec4e1c7c9b98712537970854cd7d56ad35 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Sun Apr 13 18:40:31 2014 +0200 dump EmrModifyworldtransform diff --git a/msodumper/docdirstream.py b/msodumper/docdirstream.py index 61b0723..c9aa3d5 100644 --- a/msodumper/docdirstream.py +++ b/msodumper/docdirstream.py @@ -32,7 +32,7 @@ class DOCDirStream: attrs += ' name="%s"' % dict[value] else: attrs += ' name="%s"' % default - if hexdump: + if hexdump and type(value) != float: value = hex(value) if offset: attrs += ' offset="%s"' % hex(self.pos) @@ -109,6 +109,18 @@ class DOCDirStream: self.pos += 4 return ret + def getFloat32(self, bytes=None, pos=None): + if not bytes: + bytes = self.bytes + if not pos: + pos = self.pos + return struct.unpack("<f", bytes[pos:pos + 4])[0] + + def readFloat32(self): + ret = self.getFloat32() + self.pos += 4 + return ret + def getuInt64(self, bytes=None, pos=None): if not bytes: bytes = self.bytes diff --git a/msodumper/emfrecord.py b/msodumper/emfrecord.py index 7f88277..82bbcd3 100644 --- a/msodumper/emfrecord.py +++ b/msodumper/emfrecord.py @@ -81,6 +81,37 @@ class EmrRestoredc(EMFRecord): assert self.pos - posOrig == self.Size +class EmrModifyworldtransform(EMFRecord): + """Modifies the current world-space to page-space transform.""" + def __init__(self, parent): + EMFRecord.__init__(self, parent) + + def dump(self): + posOrig = self.pos + self.printAndSet("Type", self.readuInt32()) + self.printAndSet("Size", self.readuInt32(), hexdump=False) + XForm(self, "Xform").dump() + #assert self.pos - posOrig == self.Size + + +class XForm(EMFRecord): + """The XForm object defines a two-dimensional, linear transform matrix.""" + def __init__(self, parent, name): + EMFRecord.__init__(self, parent) + self.name = name + + def dump(self): + print '<%s>' % self.name + self.printAndSet("M11", self.readFloat32()) + self.printAndSet("M12", self.readFloat32()) + self.printAndSet("M21", self.readFloat32()) + self.printAndSet("M22", self.readFloat32()) + self.printAndSet("Dx", self.readFloat32()) + self.printAndSet("Dy", self.readFloat32()) + print '</%s>' % self.name + self.parent.pos = self.pos + + # The ICMMode enumeration defines values that specify when to turn on and off ICM (Image Color Management). ICMMode = { 0x01: "ICM_OFF", commit fa8053884928ea362801833d68752422c1d10dc0 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Sun Apr 13 18:30:49 2014 +0200 dump EmrSeticmmode diff --git a/msodumper/emfrecord.py b/msodumper/emfrecord.py index 905f743..7f88277 100644 --- a/msodumper/emfrecord.py +++ b/msodumper/emfrecord.py @@ -81,6 +81,28 @@ class EmrRestoredc(EMFRecord): assert self.pos - posOrig == self.Size +# The ICMMode enumeration defines values that specify when to turn on and off ICM (Image Color Management). +ICMMode = { + 0x01: "ICM_OFF", + 0x02: "ICM_ON", + 0x03: "ICM_QUERY", + 0x04: "ICM_DONE_OUTSIDEDC" +} + + +class EmrSeticmmode(EMFRecord): + """Specifies ICM to be enabled, disabled, or queried on the playback device context.""" + def __init__(self, parent): + EMFRecord.__init__(self, parent) + + def dump(self): + posOrig = self.pos + self.printAndSet("Type", self.readuInt32()) + self.printAndSet("Size", self.readuInt32(), hexdump=False) + self.printAndSet("ICMMode", self.readuInt32(), dict=ICMMode) + assert self.pos - posOrig == self.Size + + class EmrComment(EMFRecord): """The EMR_COMMENT record contains arbitrary private data.""" def __init__(self, parent): @@ -271,7 +293,7 @@ RecordType = { 0x00000021: ['EMR_SAVEDC', EmrSavedc], 0x00000022: ['EMR_RESTOREDC', EmrRestoredc], 0x00000023: ['EMR_SETWORLDTRANSFORM'], - 0x00000024: ['EMR_MODIFYWORLDTRANSFORM'], + 0x00000024: ['EMR_MODIFYWORLDTRANSFORM', EmrModifyworldtransform], 0x00000025: ['EMR_SELECTOBJECT'], 0x00000026: ['EMR_CREATEPEN'], 0x00000027: ['EMR_CREATEBRUSHINDIRECT'], @@ -332,7 +354,7 @@ RecordType = { 0x0000005F: ['EMR_EXTCREATEPEN'], 0x00000060: ['EMR_POLYTEXTOUTA'], 0x00000061: ['EMR_POLYTEXTOUTW'], - 0x00000062: ['EMR_SETICMMODE'], + 0x00000062: ['EMR_SETICMMODE', EmrSeticmmode], 0x00000063: ['EMR_CREATECOLORSPACE'], 0x00000064: ['EMR_SETCOLORSPACE'], 0x00000065: ['EMR_DELETECOLORSPACE'], commit 34ab55e38c8d5ca736055b7d1c6b4e11d51bdc8c Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Sun Apr 13 18:24:54 2014 +0200 dump EmrComment diff --git a/msodumper/emfrecord.py b/msodumper/emfrecord.py index 01a9353..905f743 100644 --- a/msodumper/emfrecord.py +++ b/msodumper/emfrecord.py @@ -81,6 +81,26 @@ class EmrRestoredc(EMFRecord): assert self.pos - posOrig == self.Size +class EmrComment(EMFRecord): + """The EMR_COMMENT record contains arbitrary private data.""" + def __init__(self, parent): + EMFRecord.__init__(self, parent) + + def dump(self): + self.printAndSet("Type", self.readuInt32()) + self.printAndSet("Size", self.readuInt32(), hexdump=False) + self.printAndSet("DataSize", self.readuInt32(), hexdump=False) + commentIdentifier = self.getuInt32() + if commentIdentifier == 0x00000000: # EMR_COMMENT_EMFSPOOL + print '<todo what="EmrComment::dump(): handle EMR_COMMENT_EMFSPOOL"/>' + elif commentIdentifier == 0x2B464D45: # EMR_COMMENT_EMFPLUS + print '<todo what="EmrComment::dump(): handle EMR_COMMENT_EMFPLUS"/>' + elif commentIdentifier == 0x43494447: # EMR_COMMENT_PUBLIC + print '<todo what="EmrComment::dump(): handle EMR_COMMENT_PUBLIC"/>' + else: + print '<todo what="EmrComment::dump(): handle EMR_COMMENT"/>' + + class EmrSetviewportorgex(EMFRecord): """Defines the viewport origin.""" def __init__(self, parent): @@ -284,7 +304,7 @@ RecordType = { 0x00000042: ['EMR_WIDENPATH'], 0x00000043: ['EMR_SELECTCLIPPATH'], 0x00000044: ['EMR_ABORTPATH'], - 0x00000046: ['EMR_COMMENT'], + 0x00000046: ['EMR_COMMENT', EmrComment], 0x00000047: ['EMR_FILLRGN'], 0x00000048: ['EMR_FRAMERGN'], 0x00000049: ['EMR_INVERTRGN'], _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits