blob: 8979e928fec4e2062b786cba785d7b14b5bb2ef5 [file] [log] [blame]
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')
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())