| 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') |
| |
| HHEA_DATA = deHexStr( |
| '0001 0000 ' # 1.0 version |
| '02EE ' # 750 ascent |
| 'FF06 ' # -250 descent |
| '00C8 ' # 200 lineGap |
| '03E8 ' # 1000 advanceWidthMax |
| 'FFE7 ' # -25 minLeftSideBearing |
| 'FFEC ' # -20 minRightSideBearing |
| '03D1 ' # 977 xMaxExtent |
| '0000 ' # 0 caretSlopeRise |
| '0001 ' # 1 caretSlopeRun |
| '0010 ' # 16 caretOffset |
| '0000 ' # 0 reserved0 |
| '0000 ' # 0 reserved1 |
| '0000 ' # 0 reserved2 |
| '0000 ' # 0 reserved3 |
| '0000 ' # 0 metricDataFormat |
| '002A ' # 42 numberOfHMetrics |
| ) |
| |
| HHEA_AS_DICT = { |
| 'tableTag': 'hhea', |
| 'tableVersion': 0x00010000, |
| 'ascent': 750, |
| 'descent': -250, |
| 'lineGap': 200, |
| 'advanceWidthMax': 1000, |
| 'minLeftSideBearing': -25, |
| 'minRightSideBearing': -20, |
| 'xMaxExtent': 977, |
| 'caretSlopeRise': 0, |
| 'caretSlopeRun': 1, |
| 'caretOffset': 16, |
| 'reserved0': 0, |
| 'reserved1': 0, |
| 'reserved2': 0, |
| 'reserved3': 0, |
| 'metricDataFormat': 0, |
| 'numberOfHMetrics': 42, |
| } |
| |
| HHEA_XML = [ |
| '<tableVersion value="0x00010000"/>', |
| '<ascent value="750"/>', |
| '<descent value="-250"/>', |
| '<lineGap value="200"/>', |
| '<advanceWidthMax value="1000"/>', |
| '<minLeftSideBearing value="-25"/>', |
| '<minRightSideBearing value="-20"/>', |
| '<xMaxExtent value="977"/>', |
| '<caretSlopeRise value="0"/>', |
| '<caretSlopeRun value="1"/>', |
| '<caretOffset value="16"/>', |
| '<reserved0 value="0"/>', |
| '<reserved1 value="0"/>', |
| '<reserved2 value="0"/>', |
| '<reserved3 value="0"/>', |
| '<metricDataFormat value="0"/>', |
| '<numberOfHMetrics value="42"/>', |
| ] |
| |
| HHEA_XML_VERSION_AS_FLOAT = [ |
| '<tableVersion value="1.0"/>', |
| ] + HHEA_XML[1:] |
| |
| |
| class HheaCompileOrToXMLTest(unittest.TestCase): |
| |
| def setUp(self): |
| hhea = newTable('hhea') |
| hhea.tableVersion = 0x00010000 |
| hhea.ascent = 750 |
| hhea.descent = -250 |
| hhea.lineGap = 200 |
| hhea.advanceWidthMax = 1000 |
| hhea.minLeftSideBearing = -25 |
| hhea.minRightSideBearing = -20 |
| hhea.xMaxExtent = 977 |
| hhea.caretSlopeRise = 0 |
| hhea.caretSlopeRun = 1 |
| hhea.caretOffset = 16 |
| hhea.metricDataFormat = 0 |
| hhea.numberOfHMetrics = 42 |
| hhea.reserved0 = hhea.reserved1 = hhea.reserved2 = hhea.reserved3 = 0 |
| self.font = TTFont(sfntVersion='OTTO') |
| self.font['hhea'] = hhea |
| |
| def test_compile(self): |
| hhea = self.font['hhea'] |
| hhea.tableVersion = 0x00010000 |
| self.assertEqual(HHEA_DATA, hhea.compile(self.font)) |
| |
| def test_compile_version_10_as_float(self): |
| hhea = self.font['hhea'] |
| hhea.tableVersion = 1.0 |
| with CapturingLogHandler(log, "WARNING") as captor: |
| self.assertEqual(HHEA_DATA, hhea.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(self): |
| hhea = self.font['hhea'] |
| self.font['hhea'].tableVersion = 0x00010000 |
| self.assertEqual(getXML(hhea.toXML), HHEA_XML) |
| |
| def test_toXML_version_as_float(self): |
| hhea = self.font['hhea'] |
| hhea.tableVersion = 1.0 |
| with CapturingLogHandler(log, "WARNING") as captor: |
| self.assertEqual(getXML(hhea.toXML), HHEA_XML) |
| self.assertTrue( |
| len([r for r in captor.records |
| if "Table version value is a float" in r.msg]) == 1) |
| |
| def test_aliases(self): |
| hhea = self.font['hhea'] |
| self.assertEqual(hhea.ascent, hhea.ascender) |
| self.assertEqual(hhea.descent, hhea.descender) |
| hhea.ascender = 800 |
| self.assertEqual(hhea.ascent, 800) |
| hhea.ascent = 750 |
| self.assertEqual(hhea.ascender, 750) |
| hhea.descender = -300 |
| self.assertEqual(hhea.descent, -300) |
| hhea.descent = -299 |
| self.assertEqual(hhea.descender, -299) |
| |
| class HheaDecompileOrFromXMLTest(unittest.TestCase): |
| |
| def setUp(self): |
| hhea = newTable('hhea') |
| self.font = TTFont(sfntVersion='OTTO') |
| self.font['hhea'] = hhea |
| |
| def test_decompile(self): |
| hhea = self.font['hhea'] |
| hhea.decompile(HHEA_DATA, self.font) |
| for key in hhea.__dict__: |
| self.assertEqual(getattr(hhea, key), HHEA_AS_DICT[key]) |
| |
| def test_fromXML(self): |
| hhea = self.font['hhea'] |
| for name, attrs, content in parseXML(HHEA_XML): |
| hhea.fromXML(name, attrs, content, self.font) |
| for key in hhea.__dict__: |
| self.assertEqual(getattr(hhea, key), HHEA_AS_DICT[key]) |
| |
| def test_fromXML_version_as_float(self): |
| hhea = self.font['hhea'] |
| with CapturingLogHandler(log, "WARNING") as captor: |
| for name, attrs, content in parseXML(HHEA_XML_VERSION_AS_FLOAT): |
| hhea.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 hhea.__dict__: |
| self.assertEqual(getattr(hhea, key), HHEA_AS_DICT[key]) |
| |
| |
| class HheaRecalcTest(unittest.TestCase): |
| |
| def test_recalc_TTF(self): |
| font = TTFont() |
| font.importXML(os.path.join(DATA_DIR, '_h_h_e_a_recalc_TTF.ttx')) |
| hhea = font['hhea'] |
| hhea.recalc(font) |
| self.assertEqual(hhea.advanceWidthMax, 600) |
| self.assertEqual(hhea.minLeftSideBearing, -56) |
| self.assertEqual(hhea.minRightSideBearing, 100) |
| self.assertEqual(hhea.xMaxExtent, 400) |
| |
| def test_recalc_OTF(self): |
| font = TTFont() |
| font.importXML(os.path.join(DATA_DIR, '_h_h_e_a_recalc_OTF.ttx')) |
| hhea = font['hhea'] |
| hhea.recalc(font) |
| self.assertEqual(hhea.advanceWidthMax, 600) |
| self.assertEqual(hhea.minLeftSideBearing, -56) |
| self.assertEqual(hhea.minRightSideBearing, 100) |
| self.assertEqual(hhea.xMaxExtent, 400) |
| |
| def test_recalc_empty(self): |
| font = TTFont() |
| font.importXML(os.path.join(DATA_DIR, '_h_h_e_a_recalc_empty.ttx')) |
| hhea = font['hhea'] |
| hhea.recalc(font) |
| self.assertEqual(hhea.advanceWidthMax, 600) |
| self.assertEqual(hhea.minLeftSideBearing, 0) |
| self.assertEqual(hhea.minRightSideBearing, 0) |
| self.assertEqual(hhea.xMaxExtent, 0) |
| |
| |
| if __name__ == "__main__": |
| import sys |
| sys.exit(unittest.main()) |