blob: 4b5c6338c3ea310358750a1df51e9de2913a5b7e [file] [log] [blame]
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())