From aa2723c559bd72a11e06670a12ad4d13f7449a7e Mon Sep 17 00:00:00 2001 From: jvr Date: Fri, 22 Aug 2003 20:02:25 +0000 Subject: [PATCH] VORG support by rroberts. git-svn-id: svn://svn.code.sf.net/p/fonttools/code/trunk@408 4cde692c-a291-49d1-8350-778aa11640f8 --- Lib/fontTools/ttLib/tables/V_O_R_G_.py | 119 +++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 Lib/fontTools/ttLib/tables/V_O_R_G_.py diff --git a/Lib/fontTools/ttLib/tables/V_O_R_G_.py b/Lib/fontTools/ttLib/tables/V_O_R_G_.py new file mode 100644 index 000000000..63c52fb1d --- /dev/null +++ b/Lib/fontTools/ttLib/tables/V_O_R_G_.py @@ -0,0 +1,119 @@ +import DefaultTable +import struct +from fontTools.ttLib import sfnt +from fontTools.misc.textTools import safeEval, readHex +from types import TupleType, StringType + + +class table_V_O_R_G_(DefaultTable.DefaultTable): + + """ This table is structured so that you can treat it like a dictionary keyed by glyph name. + ttFont['VORG'][] will return the vertical origin for any glyph + ttFont['VORG'][] = will set the vertical origin for any glyph. + """ + + def decompile(self, data, ttFont): + self.majorVersion, self.minorVersion, self.defaultVertOriginY, self.numVertOriginYMetrics = struct.unpack(">HHhH", data[:8]) + assert (self.majorVersion <= 1), "Major version of VORG table is higher than I knwo how to handle" + data = data[8:] + self.VOriginRecords = {} + for i in range(self.numVertOriginYMetrics): + gid, vOrigin = struct.unpack(">Hh", data[:4]) + glyphName = ttFont.getGlyphName(gid) + self.VOriginRecords[glyphName] = vOrigin + data = data[4:] + + def compile(self, ttFont): + glyphNames = self.VOriginRecords.keys() + self.numVertOriginYMetrics = len(glyphNames) + data = struct.pack(">HHhH", self.majorVersion, self.minorVersion, self.defaultVertOriginY, self.numVertOriginYMetrics) + vOriginTable = [] + for glyphName in glyphNames: + try: + gid = ttFont.getGlyphID(glyphName) + except: + assert 0, "VORG table contains a glyph name not in ttFont.getGlyphNames(): " + str(glyphName) + vOriginTable.append([gid, self.VOriginRecords[glyphName]]) + vOriginTable.sort() + for entry in vOriginTable: + data = data + struct.pack(">Hh", entry[0], entry[1]) + return data + + def toXML(self, writer, ttFont): + writer.simpletag("majorVersion", value=self.majorVersion) + writer.newline() + writer.simpletag("minorVersion", value=self.minorVersion) + writer.newline() + writer.simpletag("defaultVertOriginY", value=self.defaultVertOriginY) + writer.newline() + writer.simpletag("numVertOriginYMetrics", value=self.numVertOriginYMetrics) + writer.newline() + vOriginTable = [] + glyphNames = self.VOriginRecords.keys() + for glyphName in glyphNames: + try: + gid = ttFont.getGlyphID(glyphName) + except: + assert 0, "VORG table contains a glyph name not in ttFont.getGlyphNames(): " + str(glyphName) + vOriginTable.append([gid, glyphName, self.VOriginRecords[glyphName]]) + vOriginTable.sort() + for entry in vOriginTable: + vOriginRec = VOriginRecord(entry[1], entry[2]) + vOriginRec.toXML(writer, ttFont) + + def fromXML(self, (name, attrs, content), ttFont): + if name == "VOriginRecord": + for element in content: + if isinstance(element, StringType): + continue + if not hasattr(self, "VOriginRecords"): + self.VOriginRecords = {} + vOriginRec = VOriginRecord() + for element in content: + if isinstance(element, StringType): + continue + vOriginRec.fromXML(element, ttFont) + self.VOriginRecords[vOriginRec.glyphName] = vOriginRec.vOrigin + elif attrs.has_key("value"): + value = safeEval(attrs["value"]) + setattr(self, name, value) + + def __getitem__(self, name): + if not self.VOriginRecords.has_key(name): + return self.defaultVertOriginY + + return self.VOriginRecords[name] + + def __setitem__(self, name, value): + if value != self.defaultVertOriginY: + self.VOriginRecords[name] = value + elif self.VOriginRecords.has_key(name): + del self.VOriginRecords[name] + + +class VOriginRecord: + + def __init__(self, name = None, vOrigin = None): + self.glyphName = name + self.vOrigin = vOrigin + + def toXML(self, writer, ttFont): + writer.begintag("VOriginRecord") + writer.newline() + writer.simpletag("glyphName", value=self.glyphName) + writer.newline() + writer.simpletag("vOrigin", value=self.vOrigin) + writer.newline() + writer.endtag("VOriginRecord") + writer.newline() + + def fromXML(self, (name, attrs, content), ttFont): + value = attrs["value"] + if name == "glyphName": + setattr(self, name, value) + else: + try: + value = safeEval(value) + except OverflowError: + value = long(value) + setattr(self, name, value)