fonttools/Tests/ttLib/tables/_h_h_e_a_test.py
Just van Rossum 5fc65d7168
Misc py23 cleanups (#2243)
* Replaced all from ...py23 import * with explicit name imports, or removed completely when possible.
* Replaced tounicode() with tostr()
* Changed all BytesIO ans StringIO imports to from io import ..., replaced all UnicodeIO with StringIO.
* Replaced all unichr() with chr()
* Misc minor tweaks and fixes
2021-03-29 11:45:58 +02:00

209 lines
6.8 KiB
Python

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