* 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
274 lines
9.5 KiB
Python
274 lines
9.5 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')
|
|
|
|
VHEA_DATA_VERSION_11 = deHexStr(
|
|
'0001 1000 ' # 1.1 version
|
|
'01F4 ' # 500 ascent
|
|
'FE0C ' # -500 descent
|
|
'0000 ' # 0 lineGap
|
|
'0BB8 ' # 3000 advanceHeightMax
|
|
'FC16 ' # -1002 minTopSideBearing
|
|
'FD5B ' # -677 minBottomSideBearing
|
|
'0B70 ' # 2928 yMaxExtent
|
|
'0000 ' # 0 caretSlopeRise
|
|
'0001 ' # 1 caretSlopeRun
|
|
'0000 ' # 0 caretOffset
|
|
'0000 ' # 0 reserved1
|
|
'0000 ' # 0 reserved2
|
|
'0000 ' # 0 reserved3
|
|
'0000 ' # 0 reserved4
|
|
'0000 ' # 0 metricDataFormat
|
|
'000C ' # 12 numberOfVMetrics
|
|
)
|
|
|
|
VHEA_DATA_VERSION_10 = deHexStr('00010000') + VHEA_DATA_VERSION_11[4:]
|
|
|
|
VHEA_VERSION_11_AS_DICT = {
|
|
'tableTag': 'vhea',
|
|
'tableVersion': 0x00011000,
|
|
'ascent': 500,
|
|
'descent': -500,
|
|
'lineGap': 0,
|
|
'advanceHeightMax': 3000,
|
|
'minTopSideBearing': -1002,
|
|
'minBottomSideBearing': -677,
|
|
'yMaxExtent': 2928,
|
|
'caretSlopeRise': 0,
|
|
'caretSlopeRun': 1,
|
|
'caretOffset': 0,
|
|
'reserved1': 0,
|
|
'reserved2': 0,
|
|
'reserved3': 0,
|
|
'reserved4': 0,
|
|
'metricDataFormat': 0,
|
|
'numberOfVMetrics': 12,
|
|
}
|
|
|
|
VHEA_VERSION_10_AS_DICT = dict(VHEA_VERSION_11_AS_DICT)
|
|
VHEA_VERSION_10_AS_DICT['tableVersion'] = 0x00010000
|
|
|
|
VHEA_XML_VERSION_11 = [
|
|
'<tableVersion value="0x00011000"/>',
|
|
'<ascent value="500"/>',
|
|
'<descent value="-500"/>',
|
|
'<lineGap value="0"/>',
|
|
'<advanceHeightMax value="3000"/>',
|
|
'<minTopSideBearing value="-1002"/>',
|
|
'<minBottomSideBearing value="-677"/>',
|
|
'<yMaxExtent value="2928"/>',
|
|
'<caretSlopeRise value="0"/>',
|
|
'<caretSlopeRun value="1"/>',
|
|
'<caretOffset value="0"/>',
|
|
'<reserved1 value="0"/>',
|
|
'<reserved2 value="0"/>',
|
|
'<reserved3 value="0"/>',
|
|
'<reserved4 value="0"/>',
|
|
'<metricDataFormat value="0"/>',
|
|
'<numberOfVMetrics value="12"/>',
|
|
]
|
|
|
|
VHEA_XML_VERSION_11_AS_FLOAT = [
|
|
'<tableVersion value="1.0625"/>',
|
|
] + VHEA_XML_VERSION_11[1:]
|
|
|
|
VHEA_XML_VERSION_10 = [
|
|
'<tableVersion value="0x00010000"/>',
|
|
] + VHEA_XML_VERSION_11[1:]
|
|
|
|
VHEA_XML_VERSION_10_AS_FLOAT = [
|
|
'<tableVersion value="1.0"/>',
|
|
] + VHEA_XML_VERSION_11[1:]
|
|
|
|
|
|
class VheaCompileOrToXMLTest(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
vhea = newTable('vhea')
|
|
vhea.tableVersion = 0x00010000
|
|
vhea.ascent = 500
|
|
vhea.descent = -500
|
|
vhea.lineGap = 0
|
|
vhea.advanceHeightMax = 3000
|
|
vhea.minTopSideBearing = -1002
|
|
vhea.minBottomSideBearing = -677
|
|
vhea.yMaxExtent = 2928
|
|
vhea.caretSlopeRise = 0
|
|
vhea.caretSlopeRun = 1
|
|
vhea.caretOffset = 0
|
|
vhea.metricDataFormat = 0
|
|
vhea.numberOfVMetrics = 12
|
|
vhea.reserved1 = vhea.reserved2 = vhea.reserved3 = vhea.reserved4 = 0
|
|
self.font = TTFont(sfntVersion='OTTO')
|
|
self.font['vhea'] = vhea
|
|
|
|
def test_compile_caretOffset_as_reserved0(self):
|
|
vhea = self.font['vhea']
|
|
del vhea.caretOffset
|
|
vhea.reserved0 = 0
|
|
self.assertEqual(VHEA_DATA_VERSION_10, vhea.compile(self.font))
|
|
|
|
def test_compile_version_10(self):
|
|
vhea = self.font['vhea']
|
|
vhea.tableVersion = 0x00010000
|
|
self.assertEqual(VHEA_DATA_VERSION_10, vhea.compile(self.font))
|
|
|
|
def test_compile_version_10_as_float(self):
|
|
vhea = self.font['vhea']
|
|
vhea.tableVersion = 1.0
|
|
with CapturingLogHandler(log, "WARNING") as captor:
|
|
self.assertEqual(VHEA_DATA_VERSION_10, vhea.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_compile_version_11(self):
|
|
vhea = self.font['vhea']
|
|
vhea.tableVersion = 0x00011000
|
|
self.assertEqual(VHEA_DATA_VERSION_11, vhea.compile(self.font))
|
|
|
|
def test_compile_version_11_as_float(self):
|
|
vhea = self.font['vhea']
|
|
vhea.tableVersion = 1.0625
|
|
with CapturingLogHandler(log, "WARNING") as captor:
|
|
self.assertEqual(VHEA_DATA_VERSION_11, vhea.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_caretOffset_as_reserved0(self):
|
|
vhea = self.font['vhea']
|
|
del vhea.caretOffset
|
|
vhea.reserved0 = 0
|
|
self.assertEqual(getXML(vhea.toXML), VHEA_XML_VERSION_10)
|
|
|
|
def test_toXML_version_10(self):
|
|
vhea = self.font['vhea']
|
|
self.font['vhea'].tableVersion = 0x00010000
|
|
self.assertEqual(getXML(vhea.toXML), VHEA_XML_VERSION_10)
|
|
|
|
def test_toXML_version_10_as_float(self):
|
|
vhea = self.font['vhea']
|
|
vhea.tableVersion = 1.0
|
|
with CapturingLogHandler(log, "WARNING") as captor:
|
|
self.assertEqual(getXML(vhea.toXML), VHEA_XML_VERSION_10)
|
|
self.assertTrue(
|
|
len([r for r in captor.records
|
|
if "Table version value is a float" in r.msg]) == 1)
|
|
|
|
def test_toXML_version_11(self):
|
|
vhea = self.font['vhea']
|
|
self.font['vhea'].tableVersion = 0x00011000
|
|
self.assertEqual(getXML(vhea.toXML), VHEA_XML_VERSION_11)
|
|
|
|
def test_toXML_version_11_as_float(self):
|
|
vhea = self.font['vhea']
|
|
vhea.tableVersion = 1.0625
|
|
with CapturingLogHandler(log, "WARNING") as captor:
|
|
self.assertEqual(getXML(vhea.toXML), VHEA_XML_VERSION_11)
|
|
self.assertTrue(
|
|
len([r for r in captor.records
|
|
if "Table version value is a float" in r.msg]) == 1)
|
|
|
|
|
|
class VheaDecompileOrFromXMLTest(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
vhea = newTable('vhea')
|
|
self.font = TTFont(sfntVersion='OTTO')
|
|
self.font['vhea'] = vhea
|
|
|
|
def test_decompile_version_10(self):
|
|
vhea = self.font['vhea']
|
|
vhea.decompile(VHEA_DATA_VERSION_10, self.font)
|
|
for key in vhea.__dict__:
|
|
self.assertEqual(getattr(vhea, key), VHEA_VERSION_10_AS_DICT[key])
|
|
|
|
def test_decompile_version_11(self):
|
|
vhea = self.font['vhea']
|
|
vhea.decompile(VHEA_DATA_VERSION_11, self.font)
|
|
for key in vhea.__dict__:
|
|
self.assertEqual(getattr(vhea, key), VHEA_VERSION_11_AS_DICT[key])
|
|
|
|
def test_fromXML_version_10(self):
|
|
vhea = self.font['vhea']
|
|
for name, attrs, content in parseXML(VHEA_XML_VERSION_10):
|
|
vhea.fromXML(name, attrs, content, self.font)
|
|
for key in vhea.__dict__:
|
|
self.assertEqual(getattr(vhea, key), VHEA_VERSION_10_AS_DICT[key])
|
|
|
|
def test_fromXML_version_10_as_float(self):
|
|
vhea = self.font['vhea']
|
|
with CapturingLogHandler(log, "WARNING") as captor:
|
|
for name, attrs, content in parseXML(VHEA_XML_VERSION_10_AS_FLOAT):
|
|
vhea.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 vhea.__dict__:
|
|
self.assertEqual(getattr(vhea, key), VHEA_VERSION_10_AS_DICT[key])
|
|
|
|
def test_fromXML_version_11(self):
|
|
vhea = self.font['vhea']
|
|
for name, attrs, content in parseXML(VHEA_XML_VERSION_11):
|
|
vhea.fromXML(name, attrs, content, self.font)
|
|
for key in vhea.__dict__:
|
|
self.assertEqual(getattr(vhea, key), VHEA_VERSION_11_AS_DICT[key])
|
|
|
|
def test_fromXML_version_11_as_float(self):
|
|
vhea = self.font['vhea']
|
|
with CapturingLogHandler(log, "WARNING") as captor:
|
|
for name, attrs, content in parseXML(VHEA_XML_VERSION_11_AS_FLOAT):
|
|
vhea.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 vhea.__dict__:
|
|
self.assertEqual(getattr(vhea, key), VHEA_VERSION_11_AS_DICT[key])
|
|
|
|
|
|
class VheaRecalcTest(unittest.TestCase):
|
|
|
|
def test_recalc_TTF(self):
|
|
font = TTFont()
|
|
font.importXML(os.path.join(DATA_DIR, '_v_h_e_a_recalc_TTF.ttx'))
|
|
vhea = font['vhea']
|
|
vhea.recalc(font)
|
|
self.assertEqual(vhea.advanceHeightMax, 900)
|
|
self.assertEqual(vhea.minTopSideBearing, 200)
|
|
self.assertEqual(vhea.minBottomSideBearing, 377)
|
|
self.assertEqual(vhea.yMaxExtent, 312)
|
|
|
|
def test_recalc_OTF(self):
|
|
font = TTFont()
|
|
font.importXML(os.path.join(DATA_DIR, '_v_h_e_a_recalc_OTF.ttx'))
|
|
vhea = font['vhea']
|
|
vhea.recalc(font)
|
|
self.assertEqual(vhea.advanceHeightMax, 900)
|
|
self.assertEqual(vhea.minTopSideBearing, 200)
|
|
self.assertEqual(vhea.minBottomSideBearing, 377)
|
|
self.assertEqual(vhea.yMaxExtent, 312)
|
|
|
|
def test_recalc_empty(self):
|
|
font = TTFont()
|
|
font.importXML(os.path.join(DATA_DIR, '_v_h_e_a_recalc_empty.ttx'))
|
|
vhea = font['vhea']
|
|
vhea.recalc(font)
|
|
self.assertEqual(vhea.advanceHeightMax, 900)
|
|
self.assertEqual(vhea.minTopSideBearing, 0)
|
|
self.assertEqual(vhea.minBottomSideBearing, 0)
|
|
self.assertEqual(vhea.yMaxExtent, 0)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import sys
|
|
sys.exit(unittest.main())
|