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 = [ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ] VHEA_XML_VERSION_11_AS_FLOAT = [ '', ] + VHEA_XML_VERSION_11[1:] VHEA_XML_VERSION_10 = [ '', ] + VHEA_XML_VERSION_11[1:] VHEA_XML_VERSION_10_AS_FLOAT = [ '', ] + 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())