summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHossein <hossein@libreoffice.org>2021-09-11 23:59:28 +0200
committerHossein <hossein@libreoffice.org>2021-09-12 00:05:13 +0200
commite4a481e77c913710c0bb3b59b0749e99fdc1470a (patch)
tree65ee400337bfe7f1c7589aea5cb511303a4bd85b
parentb641e7b062b86e4c9b5f19c1819cf2ebceee4ab8 (diff)
Dump CreateFontIndirect, SetBkMode and SetTextAlign
The dump() methods for CreateFontIndirect (and also Font), SetBkMode and SetTextAlign are implemented. Change-Id: Ic15b4cee44f4eb28bef61f21b0ecf2025e03b4fd Reviewed-on: https://gerrit.libreoffice.org/c/mso-dumper/+/121968 Tested-by: Hossein <hossein@libreoffice.org> Reviewed-by: Hossein <hossein@libreoffice.org>
-rw-r--r--msodumper/wmfrecord.py98
1 files changed, 89 insertions, 9 deletions
diff --git a/msodumper/wmfrecord.py b/msodumper/wmfrecord.py
index feb9d24..cdc0581 100644
--- a/msodumper/wmfrecord.py
+++ b/msodumper/wmfrecord.py
@@ -594,7 +594,7 @@ class WMFStream(BinaryStream):
# META_EOF
if type == "META_EOF":
break
- if self.pos + size * 2 <= self.size:
+ if (self.pos + size * 2) <= self.size:
self.pos += size * 2
else:
print('<Error value="Unexpected end of file" />')
@@ -823,12 +823,28 @@ class SetPaletteEntries(WMFRecord):
class SetBkMode(WMFRecord):
- def __init__(self, parent):
+ """The SetBkMode record is used to define the background raster operation
+ mix mode (pens, text, hatched brushes, and inside of filled objects
+ with background colors)"""
+ def __init__(self, parent, name=None):
WMFRecord.__init__(self, parent)
+ if name:
+ self.name = name
+ else:
+ self.name = "setbkmode"
def dump(self):
- print("<todo/>")
pass
+ dataPos = self.pos
+ print('<%s type="SetBkMode">' % self.name)
+ self.printAndSet("RecordSize", self.readuInt32(), hexdump=False)
+ self.printAndSet("RecordFunction", self.readuInt16(), hexdump=True)
+ self.printAndSet("BkMode", self.readuInt16(), hexdump=False)
+ # Check optional reserved value if the size shows that it exists
+ if self.RecordSize == 5:
+ self.printAndSet("Reserved", self.readuInt16(), hexdump=False)
+ print('</%s>' % self.name)
+ assert self.pos == dataPos + self.RecordSize * 2
class SetMapMode(WMFRecord):
@@ -1336,12 +1352,25 @@ class SelectObject(WMFRecord):
class SetTextAlign(WMFRecord):
- def __init__(self, parent):
+ """The SetTextAlign record is used to define the text alignment"""
+ def __init__(self, parent, name=None):
WMFRecord.__init__(self, parent)
+ if name:
+ self.name = name
+ else:
+ self.name = "settextalign"
def dump(self):
- print("<todo/>")
- pass
+ dataPos = self.pos
+ print('<%s type="SetTextAlign">' % self.name)
+ self.printAndSet("RecordSize", self.readuInt32(), hexdump=False)
+ self.printAndSet("RecordFunction", self.readuInt16(), hexdump=True)
+ self.printAndSet("TextAlignmentMode", self.readuInt16(), hexdump=False)
+ # Check optional reserved value if the size shows that it exists
+ if self.RecordSize == 5:
+ self.printAndSet("Reserved", self.readuInt16(), hexdump=False)
+ print('</%s>' % self.name)
+ assert self.pos == dataPos + self.RecordSize * 2
class Arc(WMFRecord):
@@ -1453,12 +1482,63 @@ class CreatePenIndirect(WMFRecord):
class CreateFontIndirect(WMFRecord):
- def __init__(self, parent):
+ """The CreateFontIndirect record is used to create a font object"""
+ def __init__(self, parent, name=None):
WMFRecord.__init__(self, parent)
+ if name:
+ self.name = name
+ else:
+ self.name = "createfontindirect"
def dump(self):
- print("<todo/>")
- pass
+ dataPos = self.pos
+ print('<%s type="CreateFontIndirect">' % self.name)
+ self.printAndSet("RecordSize", self.readuInt32(), hexdump=False)
+ self.printAndSet("RecordFunction", self.readuInt16(), hexdump=True)
+ # Check optional reserved value if the size shows that it exists
+ if self.RecordSize > 3:
+ Font(self, "Font").dump()
+ print('</%s>' % self.name)
+ # RecordSize is described in words, so we should double for bytes
+ assert self.pos == dataPos + self.RecordSize * 2
+
+
+class Font(WMFRecord):
+ """The Font object describes a logical font and its attributes"""
+ def __init__(self, parent, name=None):
+ WMFRecord.__init__(self, parent)
+ if name:
+ self.name = name
+ else:
+ self.name = "Font"
+
+ def dump(self):
+ dataPos = self.pos
+ print('<%s type="Font">' % self.name)
+ self.printAndSet("Height", self.readInt16(), hexdump=False)
+ self.printAndSet("Width", self.readInt16(), hexdump=False)
+ self.printAndSet("Escapement", self.readInt16(), hexdump=False)
+ self.printAndSet("Orientation", self.readInt16(), hexdump=False)
+ self.printAndSet("Weight", self.readInt16(), hexdump=False)
+ self.printAndSet("Italic", self.readuInt8(), hexdump=False)
+ self.printAndSet("Underline", self.readuInt8(), hexdump=False)
+ self.printAndSet("StrikeOut", self.readuInt8(), hexdump=False)
+ self.printAndSet("CharSet", self.readuInt8(), hexdump=False)
+ self.printAndSet("OutPrecision", self.readuInt8(), hexdump=False)
+ self.printAndSet("ClipPrecision", self.readuInt8(), hexdump=False)
+ self.printAndSet("Quality", self.readuInt8(), hexdump=False)
+ self.printAndSet("PitchAndFamily", self.readuInt8(), hexdump=False)
+ name = self.readBytes(32)
+ self.FaceName = ""
+ # Use characters until null byte
+ for i in range(32):
+ if name[i] == 0:
+ break
+ self.FaceName += chr(name[i])
+ print('<FaceName value="%s"/>' % self.FaceName)
+ print('</%s>' % self.name)
+ assert self.pos == dataPos + 50
+ self.parent.pos = self.pos
class CreateBrushIndirect(WMFRecord):