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 = [ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ] HHEA_XML_VERSION_AS_FLOAT = [ '', ] + 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())