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 <vmik...@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: _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits