| from fontTools.misc.loggingTools import CapturingLogHandler |
| from fontTools.misc.testTools import parseXML, getXML |
| from fontTools.misc.textTools import deHexStr |
| from fontTools.ttLib import TTFont, newTable |
| from fontTools.misc.fixedTools import log |
| import os |
| import unittest |
| |
| |
| CURR_DIR = os.path.abspath(os.path.dirname(os.path.realpath(__file__))) |
| DATA_DIR = os.path.join(CURR_DIR, "data") |
| |
| VHEA_DATA_VERSION_11 = deHexStr( |
| "0001 1000 " # 1.1 version |
| "01F4 " # 500 ascent |
| "FE0C " # -500 descent |
| "0000 " # 0 lineGap |
| "0BB8 " # 3000 advanceHeightMax |
| "FC16 " # -1002 minTopSideBearing |
| "FD5B " # -677 minBottomSideBearing |
| "0B70 " # 2928 yMaxExtent |
| "0000 " # 0 caretSlopeRise |
| "0001 " # 1 caretSlopeRun |
| "0000 " # 0 caretOffset |
| "0000 " # 0 reserved1 |
| "0000 " # 0 reserved2 |
| "0000 " # 0 reserved3 |
| "0000 " # 0 reserved4 |
| "0000 " # 0 metricDataFormat |
| "000C " # 12 numberOfVMetrics |
| ) |
| |
| VHEA_DATA_VERSION_10 = deHexStr("00010000") + VHEA_DATA_VERSION_11[4:] |
| |
| VHEA_VERSION_11_AS_DICT = { |
| "tableTag": "vhea", |
| "tableVersion": 0x00011000, |
| "ascent": 500, |
| "descent": -500, |
| "lineGap": 0, |
| "advanceHeightMax": 3000, |
| "minTopSideBearing": -1002, |
| "minBottomSideBearing": -677, |
| "yMaxExtent": 2928, |
| "caretSlopeRise": 0, |
| "caretSlopeRun": 1, |
| "caretOffset": 0, |
| "reserved1": 0, |
| "reserved2": 0, |
| "reserved3": 0, |
| "reserved4": 0, |
| "metricDataFormat": 0, |
| "numberOfVMetrics": 12, |
| } |
| |
| VHEA_VERSION_10_AS_DICT = dict(VHEA_VERSION_11_AS_DICT) |
| VHEA_VERSION_10_AS_DICT["tableVersion"] = 0x00010000 |
| |
| VHEA_XML_VERSION_11 = [ |
| '<tableVersion value="0x00011000"/>', |
| '<ascent value="500"/>', |
| '<descent value="-500"/>', |
| '<lineGap value="0"/>', |
| '<advanceHeightMax value="3000"/>', |
| '<minTopSideBearing value="-1002"/>', |
| '<minBottomSideBearing value="-677"/>', |
| '<yMaxExtent value="2928"/>', |
| '<caretSlopeRise value="0"/>', |
| '<caretSlopeRun value="1"/>', |
| '<caretOffset value="0"/>', |
| '<reserved1 value="0"/>', |
| '<reserved2 value="0"/>', |
| '<reserved3 value="0"/>', |
| '<reserved4 value="0"/>', |
| '<metricDataFormat value="0"/>', |
| '<numberOfVMetrics value="12"/>', |
| ] |
| |
| VHEA_XML_VERSION_11_AS_FLOAT = [ |
| '<tableVersion value="1.0625"/>', |
| ] + VHEA_XML_VERSION_11[1:] |
| |
| VHEA_XML_VERSION_10 = [ |
| '<tableVersion value="0x00010000"/>', |
| ] + VHEA_XML_VERSION_11[1:] |
| |
| VHEA_XML_VERSION_10_AS_FLOAT = [ |
| '<tableVersion value="1.0"/>', |
| ] + VHEA_XML_VERSION_11[1:] |
| |
| |
| class VheaCompileOrToXMLTest(unittest.TestCase): |
| def setUp(self): |
| vhea = newTable("vhea") |
| vhea.tableVersion = 0x00010000 |
| vhea.ascent = 500 |
| vhea.descent = -500 |
| vhea.lineGap = 0 |
| vhea.advanceHeightMax = 3000 |
| vhea.minTopSideBearing = -1002 |
| vhea.minBottomSideBearing = -677 |
| vhea.yMaxExtent = 2928 |
| vhea.caretSlopeRise = 0 |
| vhea.caretSlopeRun = 1 |
| vhea.caretOffset = 0 |
| vhea.metricDataFormat = 0 |
| vhea.numberOfVMetrics = 12 |
| vhea.reserved1 = vhea.reserved2 = vhea.reserved3 = vhea.reserved4 = 0 |
| self.font = TTFont(sfntVersion="OTTO") |
| self.font["vhea"] = vhea |
| |
| def test_compile_caretOffset_as_reserved0(self): |
| vhea = self.font["vhea"] |
| del vhea.caretOffset |
| vhea.reserved0 = 0 |
| self.assertEqual(VHEA_DATA_VERSION_10, vhea.compile(self.font)) |
| |
| def test_compile_version_10(self): |
| vhea = self.font["vhea"] |
| vhea.tableVersion = 0x00010000 |
| self.assertEqual(VHEA_DATA_VERSION_10, vhea.compile(self.font)) |
| |
| def test_compile_version_10_as_float(self): |
| vhea = self.font["vhea"] |
| vhea.tableVersion = 1.0 |
| with CapturingLogHandler(log, "WARNING") as captor: |
| self.assertEqual(VHEA_DATA_VERSION_10, vhea.compile(self.font)) |
| self.assertTrue( |
| len( |
| [r for r in captor.records if "Table version value is a float" in r.msg] |
| ) |
| == 1 |
| ) |
| |
| def test_compile_version_11(self): |
| vhea = self.font["vhea"] |
| vhea.tableVersion = 0x00011000 |
| self.assertEqual(VHEA_DATA_VERSION_11, vhea.compile(self.font)) |
| |
| def test_compile_version_11_as_float(self): |
| vhea = self.font["vhea"] |
| vhea.tableVersion = 1.0625 |
| with CapturingLogHandler(log, "WARNING") as captor: |
| self.assertEqual(VHEA_DATA_VERSION_11, vhea.compile(self.font)) |
| self.assertTrue( |
| len( |
| [r for r in captor.records if "Table version value is a float" in r.msg] |
| ) |
| == 1 |
| ) |
| |
| def test_toXML_caretOffset_as_reserved0(self): |
| vhea = self.font["vhea"] |
| del vhea.caretOffset |
| vhea.reserved0 = 0 |
| self.assertEqual(getXML(vhea.toXML), VHEA_XML_VERSION_10) |
| |
| def test_toXML_version_10(self): |
| vhea = self.font["vhea"] |
| self.font["vhea"].tableVersion = 0x00010000 |
| self.assertEqual(getXML(vhea.toXML), VHEA_XML_VERSION_10) |
| |
| def test_toXML_version_10_as_float(self): |
| vhea = self.font["vhea"] |
| vhea.tableVersion = 1.0 |
| with CapturingLogHandler(log, "WARNING") as captor: |
| self.assertEqual(getXML(vhea.toXML), VHEA_XML_VERSION_10) |
| self.assertTrue( |
| len( |
| [r for r in captor.records if "Table version value is a float" in r.msg] |
| ) |
| == 1 |
| ) |
| |
| def test_toXML_version_11(self): |
| vhea = self.font["vhea"] |
| self.font["vhea"].tableVersion = 0x00011000 |
| self.assertEqual(getXML(vhea.toXML), VHEA_XML_VERSION_11) |
| |
| def test_toXML_version_11_as_float(self): |
| vhea = self.font["vhea"] |
| vhea.tableVersion = 1.0625 |
| with CapturingLogHandler(log, "WARNING") as captor: |
| self.assertEqual(getXML(vhea.toXML), VHEA_XML_VERSION_11) |
| self.assertTrue( |
| len( |
| [r for r in captor.records if "Table version value is a float" in r.msg] |
| ) |
| == 1 |
| ) |
| |
| |
| class VheaDecompileOrFromXMLTest(unittest.TestCase): |
| def setUp(self): |
| vhea = newTable("vhea") |
| self.font = TTFont(sfntVersion="OTTO") |
| self.font["vhea"] = vhea |
| |
| def test_decompile_version_10(self): |
| vhea = self.font["vhea"] |
| vhea.decompile(VHEA_DATA_VERSION_10, self.font) |
| for key in vhea.__dict__: |
| self.assertEqual(getattr(vhea, key), VHEA_VERSION_10_AS_DICT[key]) |
| |
| def test_decompile_version_11(self): |
| vhea = self.font["vhea"] |
| vhea.decompile(VHEA_DATA_VERSION_11, self.font) |
| for key in vhea.__dict__: |
| self.assertEqual(getattr(vhea, key), VHEA_VERSION_11_AS_DICT[key]) |
| |
| def test_fromXML_version_10(self): |
| vhea = self.font["vhea"] |
| for name, attrs, content in parseXML(VHEA_XML_VERSION_10): |
| vhea.fromXML(name, attrs, content, self.font) |
| for key in vhea.__dict__: |
| self.assertEqual(getattr(vhea, key), VHEA_VERSION_10_AS_DICT[key]) |
| |
| def test_fromXML_version_10_as_float(self): |
| vhea = self.font["vhea"] |
| with CapturingLogHandler(log, "WARNING") as captor: |
| for name, attrs, content in parseXML(VHEA_XML_VERSION_10_AS_FLOAT): |
| vhea.fromXML(name, attrs, content, self.font) |
| self.assertTrue( |
| len( |
| [r for r in captor.records if "Table version value is a float" in r.msg] |
| ) |
| == 1 |
| ) |
| for key in vhea.__dict__: |
| self.assertEqual(getattr(vhea, key), VHEA_VERSION_10_AS_DICT[key]) |
| |
| def test_fromXML_version_11(self): |
| vhea = self.font["vhea"] |
| for name, attrs, content in parseXML(VHEA_XML_VERSION_11): |
| vhea.fromXML(name, attrs, content, self.font) |
| for key in vhea.__dict__: |
| self.assertEqual(getattr(vhea, key), VHEA_VERSION_11_AS_DICT[key]) |
| |
| def test_fromXML_version_11_as_float(self): |
| vhea = self.font["vhea"] |
| with CapturingLogHandler(log, "WARNING") as captor: |
| for name, attrs, content in parseXML(VHEA_XML_VERSION_11_AS_FLOAT): |
| vhea.fromXML(name, attrs, content, self.font) |
| self.assertTrue( |
| len( |
| [r for r in captor.records if "Table version value is a float" in r.msg] |
| ) |
| == 1 |
| ) |
| for key in vhea.__dict__: |
| self.assertEqual(getattr(vhea, key), VHEA_VERSION_11_AS_DICT[key]) |
| |
| |
| class VheaRecalcTest(unittest.TestCase): |
| def test_recalc_TTF(self): |
| font = TTFont() |
| font.importXML(os.path.join(DATA_DIR, "_v_h_e_a_recalc_TTF.ttx")) |
| vhea = font["vhea"] |
| vhea.recalc(font) |
| self.assertEqual(vhea.advanceHeightMax, 900) |
| self.assertEqual(vhea.minTopSideBearing, 200) |
| self.assertEqual(vhea.minBottomSideBearing, 377) |
| self.assertEqual(vhea.yMaxExtent, 312) |
| |
| def test_recalc_OTF(self): |
| font = TTFont() |
| font.importXML(os.path.join(DATA_DIR, "_v_h_e_a_recalc_OTF.ttx")) |
| vhea = font["vhea"] |
| vhea.recalc(font) |
| self.assertEqual(vhea.advanceHeightMax, 900) |
| self.assertEqual(vhea.minTopSideBearing, 200) |
| self.assertEqual(vhea.minBottomSideBearing, 377) |
| self.assertEqual(vhea.yMaxExtent, 312) |
| |
| def test_recalc_empty(self): |
| font = TTFont() |
| font.importXML(os.path.join(DATA_DIR, "_v_h_e_a_recalc_empty.ttx")) |
| vhea = font["vhea"] |
| vhea.recalc(font) |
| self.assertEqual(vhea.advanceHeightMax, 900) |
| self.assertEqual(vhea.minTopSideBearing, 0) |
| self.assertEqual(vhea.minBottomSideBearing, 0) |
| self.assertEqual(vhea.yMaxExtent, 0) |
| |
| |
| if __name__ == "__main__": |
| import sys |
| |
| sys.exit(unittest.main()) |