[Libreoffice-commits] mso-dumper.git: emf-dump.py Makefile msodumper/emfrecord.py msodumper/wmfrecord.py
Miklos Vajna
vmiklos at collabora.co.uk
Thu Apr 10 09:22:39 PDT 2014
Makefile | 1
emf-dump.py | 35 +++++++++++++++
msodumper/emfrecord.py | 108 +++++++++++++++++++++++++++++++++++++++++++++++++
msodumper/wmfrecord.py | 53 ++++++++++++++++++++++++
4 files changed, 197 insertions(+)
New commits:
commit 60006fe4c41c866dbaeeb43c4b3c0d23c9149707
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date: Thu Apr 10 18:19:59 2014 +0200
Initial EMF dumper
It dumps the header record, but really nothing more yet.
diff --git a/Makefile b/Makefile
index a87ad52..1aa9120 100644
--- a/Makefile
+++ b/Makefile
@@ -1,3 +1,4 @@
check:
cd test/doc && ./test.py
pep8 --ignore=E501 doc-dump.py msodumper/doc{dirstream,record,sprm,stream}.py test/doc/test.py
+ pep8 --ignore=E501 emf-dump.py msodumper/{emf,wmf}record.py
diff --git a/emf-dump.py b/emf-dump.py
new file mode 100755
index 0000000..1023a9f
--- /dev/null
+++ b/emf-dump.py
@@ -0,0 +1,35 @@
+#!/usr/bin/env python2
+#
+# 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/.
+#
+
+import sys
+sys = reload(sys)
+sys.setdefaultencoding("utf-8")
+
+from msodumper import emfrecord
+
+
+class EMFDumper:
+ def __init__(self, filepath):
+ self.filepath = filepath
+
+ def dump(self):
+ file = open(self.filepath, 'rb')
+ strm = emfrecord.EMFStream(file.read())
+ file.close()
+ print '<?xml version="1.0"?>'
+ strm.dump()
+
+
+def main(args):
+ exname, args = args[0], args[1:]
+ dumper = EMFDumper(args[0])
+ dumper.dump()
+
+if __name__ == '__main__':
+ main(sys.argv)
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/msodumper/emfrecord.py b/msodumper/emfrecord.py
new file mode 100644
index 0000000..df5d9cc
--- /dev/null
+++ b/msodumper/emfrecord.py
@@ -0,0 +1,108 @@
+#!/usr/bin/env python2
+#
+# 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/.
+#
+
+from docdirstream import DOCDirStream
+import wmfrecord
+
+# The FormatSignature enumeration defines valuesembedded data in EMF records.
+FormatSignature = {
+ 0x464D4520: "ENHMETA_SIGNATURE",
+ 0x46535045: "EPS_SIGNATURE"
+}
+
+
+class EMFStream(DOCDirStream):
+ def __init__(self, bytes):
+ DOCDirStream.__init__(self, bytes)
+
+ def dump(self):
+ print '<stream type="EMF" size="%d">' % self.size
+ EmrHeader(self).dump()
+ print '</stream>'
+
+
+class EMFRecord(DOCDirStream):
+ def __init__(self, parent):
+ DOCDirStream.__init__(self, parent.bytes)
+ self.parent = parent
+ self.pos = parent.pos
+
+
+class EmrHeader(EMFRecord):
+ """The EMR_HEADER record types define the starting points of EMF metafiles."""
+ def __init__(self, parent):
+ EMFRecord.__init__(self, parent)
+
+ def dump(self):
+ print '<emrHeader>'
+ self.printAndSet("Type", self.readuInt32())
+ self.printAndSet("Size", self.readuInt32(), hexdump=False)
+ Header(self).dump()
+ if self.Size >= 100:
+ HeaderExtension1(self).dump()
+ if self.Size >= 108:
+ HeaderExtension2(self).dump()
+ print '</emrHeader>'
+
+
+class Header(EMFRecord):
+ """The Header object defines the EMF metafile header."""
+ def __init__(self, parent):
+ EMFRecord.__init__(self, parent)
+
+ def dump(self):
+ posOrig = self.pos
+ print("<header>")
+ wmfrecord.RectL(self, "Bounds").dump()
+ wmfrecord.RectL(self, "Frame").dump()
+ self.printAndSet("RecordSignature", self.readuInt32(), dict=FormatSignature)
+ self.printAndSet("Version", self.readuInt32())
+ self.printAndSet("Bytes", self.readuInt32(), hexdump=False)
+ self.printAndSet("Records", self.readuInt32(), hexdump=False)
+ self.printAndSet("Handles", self.readuInt16(), hexdump=False)
+ self.printAndSet("Reserved", self.readuInt16(), hexdump=False)
+ self.printAndSet("nDescription", self.readuInt32(), hexdump=False)
+ self.printAndSet("offDescription", self.readuInt32(), hexdump=False)
+ self.printAndSet("nPalEntries", self.readuInt32(), hexdump=False)
+ wmfrecord.SizeL(self, "Device").dump()
+ wmfrecord.SizeL(self, "Millimeters").dump()
+ print("</header>")
+ assert posOrig == self.pos - 80
+ self.parent.pos = self.pos
+
+
+class HeaderExtension1(EMFRecord):
+ """The HeaderExtension1 object defines the first extension to the EMF metafile header."""
+ def __init__(self, parent):
+ EMFRecord.__init__(self, parent)
+
+ def dump(self):
+ posOrig = self.pos
+ print("<headerExtension1>")
+ self.printAndSet("cbPixelFormat", self.readuInt32(), hexdump=False)
+ self.printAndSet("offPixelFormat", self.readuInt32(), hexdump=False)
+ self.printAndSet("bOpenGL", self.readuInt32())
+ print("</headerExtension1>")
+ assert posOrig == self.pos - 12
+ self.parent.pos = self.pos
+
+
+class HeaderExtension2(EMFRecord):
+ """The HeaderExtension1 object defines the first extension to the EMF metafile header."""
+ def __init__(self, parent):
+ EMFRecord.__init__(self, parent)
+
+ def dump(self):
+ posOrig = self.pos
+ print("<headerExtension2>")
+ self.printAndSet("MicrometersX", self.readuInt32(), hexdump=False)
+ self.printAndSet("MicrometersY", self.readuInt32(), hexdump=False)
+ print("</headerExtension2>")
+ assert posOrig == self.pos - 8
+ self.parent.pos = self.pos
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/msodumper/wmfrecord.py b/msodumper/wmfrecord.py
new file mode 100644
index 0000000..cd64e7f
--- /dev/null
+++ b/msodumper/wmfrecord.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python2
+#
+# 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/.
+#
+
+from docdirstream import DOCDirStream
+
+
+class WMFRecord(DOCDirStream):
+ def __init__(self, parent):
+ DOCDirStream.__init__(self, parent.bytes)
+ self.parent = parent
+ self.pos = parent.pos
+
+
+class RectL(WMFRecord):
+ """The RectL Object defines a rectangle."""
+ def __init__(self, parent, name=None):
+ WMFRecord.__init__(self, parent)
+ if name:
+ self.name = name
+ else:
+ self.name = "rectL"
+
+ def dump(self):
+ print '<%s type="RectL">' % self.name
+ self.printAndSet("Left", self.readInt32(), hexdump=False)
+ self.printAndSet("Top", self.readInt32(), hexdump=False)
+ self.printAndSet("Right", self.readInt32(), hexdump=False)
+ self.printAndSet("Bottom", self.readInt32(), hexdump=False)
+ print '</%s>' % self.name
+ self.parent.pos = self.pos
+
+
+class SizeL(WMFRecord):
+ """The SizeL Object defines a rectangle."""
+ def __init__(self, parent, name=None):
+ WMFRecord.__init__(self, parent)
+ if name:
+ self.name = name
+ else:
+ self.name = "sizeL"
+
+ def dump(self):
+ print '<%s type="SizeL">' % self.name
+ self.printAndSet("cx", self.readuInt32(), hexdump=False)
+ self.printAndSet("cy", self.readuInt32(), hexdump=False)
+ print '</%s>' % self.name
+ self.parent.pos = self.pos
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
More information about the Libreoffice-commits
mailing list