| 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()) |