199 lines
6.4 KiB
Python
199 lines
6.4 KiB
Python
from __future__ import absolute_import, unicode_literals
|
|
from fontTools.misc.py23 import *
|
|
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)
|
|
|
|
|
|
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())
|