For consistency with other AAT tables, and to support additional formats in the (rather unlikely) case those would ever be defined.
110 lines
4.0 KiB
Python
110 lines
4.0 KiB
Python
from __future__ import print_function, division, absolute_import
|
|
from fontTools.misc.py23 import *
|
|
from fontTools.misc.testTools import FakeFont, getXML, parseXML
|
|
from fontTools.misc.textTools import deHexStr, hexStr
|
|
from fontTools.ttLib import newTable
|
|
import unittest
|
|
|
|
|
|
# Example: Format 0 Ligature Caret Table
|
|
# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6lcar.html
|
|
LCAR_FORMAT_0_DATA = deHexStr(
|
|
'0001 0000 0000 ' # 0: Version=1.0, Format=0
|
|
'0006 0004 0002 ' # 6: LookupFormat=6, UnitSize=4, NUnits=2
|
|
'0008 0001 0000 ' # 12: SearchRange=8, EntrySelector=1, RangeShift=0
|
|
'0001 001E ' # 18: Glyph=1 (f_r), OffsetOfLigCaretEntry=30
|
|
'0003 0022 ' # 22: Glyph=3 (f_f_l), OffsetOfLigCaretEntry=34
|
|
'FFFF 0000 ' # 26: Glyph=<end>, OffsetOfLigCaretEntry=0
|
|
'0001 00DC ' # 30: DivisionPointCount=1, DivisionPoint=[220]
|
|
'0002 00EF 01D8 ' # 34: DivisionPointCount=2, DivisionPoint=[239, 475]
|
|
) # 40: <end>
|
|
assert(len(LCAR_FORMAT_0_DATA) == 40)
|
|
|
|
|
|
LCAR_FORMAT_0_XML = [
|
|
'<Version value="0x00010000"/>',
|
|
'<LigatureCarets Format="0">',
|
|
' <Carets>',
|
|
' <Lookup glyph="f_f_l">',
|
|
' <!-- DivsionPointCount=2 -->',
|
|
' <DivisionPoint index="0" value="239"/>',
|
|
' <DivisionPoint index="1" value="472"/>',
|
|
' </Lookup>',
|
|
' <Lookup glyph="f_r">',
|
|
' <!-- DivsionPointCount=1 -->',
|
|
' <DivisionPoint index="0" value="220"/>',
|
|
' </Lookup>',
|
|
' </Carets>',
|
|
'</LigatureCarets>',
|
|
]
|
|
|
|
|
|
# Example: Format 1 Ligature Caret Table
|
|
# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6lcar.html
|
|
LCAR_FORMAT_1_DATA = deHexStr(
|
|
'0001 0000 0001 ' # 0: Version=1.0, Format=1
|
|
'0006 0004 0002 ' # 6: LookupFormat=6, UnitSize=4, NUnits=2
|
|
'0008 0001 0000 ' # 12: SearchRange=8, EntrySelector=1, RangeShift=0
|
|
'0001 001E ' # 18: Glyph=1 (f_r), OffsetOfLigCaretEntry=30
|
|
'0003 0022 ' # 22: Glyph=3 (f_f_l), OffsetOfLigCaretEntry=34
|
|
'FFFF 0000 ' # 26: Glyph=<end>, OffsetOfLigCaretEntry=0
|
|
'0001 0032 ' # 30: DivisionPointCount=1, DivisionPoint=[50]
|
|
'0002 0037 004B ' # 34: DivisionPointCount=2, DivisionPoint=[55, 75]
|
|
) # 40: <end>
|
|
assert(len(LCAR_FORMAT_1_DATA) == 40)
|
|
|
|
|
|
LCAR_FORMAT_1_XML = [
|
|
'<Version value="0x00010000"/>',
|
|
'<LigatureCarets Format="1">',
|
|
' <Carets>',
|
|
' <Lookup glyph="f_f_l">',
|
|
' <!-- DivsionPointCount=2 -->',
|
|
' <DivisionPoint index="0" value="55"/>',
|
|
' <DivisionPoint index="1" value="75"/>',
|
|
' </Lookup>',
|
|
' <Lookup glyph="f_r">',
|
|
' <!-- DivsionPointCount=1 -->',
|
|
' <DivisionPoint index="0" value="50"/>',
|
|
' </Lookup>',
|
|
' </Carets>',
|
|
'</LigatureCarets>',
|
|
]
|
|
|
|
|
|
class LCARTest(unittest.TestCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
cls.maxDiff = None
|
|
cls.font = FakeFont(['.notdef', 'f_r', 'X', 'f_f_l'])
|
|
|
|
def test_decompile_toXML_format0(self):
|
|
table = newTable('lcar')
|
|
table.decompile(LCAR_FORMAT_0_DATA, self.font)
|
|
self.assertEqual(getXML(table.toXML), LCAR_FORMAT_0_XML)
|
|
|
|
def test_compile_fromXML_format0(self):
|
|
table = newTable('lcar')
|
|
for name, attrs, content in parseXML(LCAR_FORMAT_0_XML):
|
|
table.fromXML(name, attrs, content, font=self.font)
|
|
self.assertEqual(hexStr(table.compile(self.font)),
|
|
hexStr(LCAR_FORMAT_0_DATA))
|
|
|
|
def test_decompile_toXML_format1(self):
|
|
table = newTable('lcar')
|
|
table.decompile(LCAR_FORMAT_1_DATA, self.font)
|
|
self.assertEqual(getXML(table.toXML), LCAR_FORMAT_1_XML)
|
|
|
|
def test_compile_fromXML_format1(self):
|
|
table = newTable('lcar')
|
|
for name, attrs, content in parseXML(LCAR_FORMAT_1_XML):
|
|
table.fromXML(name, attrs, content, font=self.font)
|
|
self.assertEqual(hexStr(table.compile(self.font)),
|
|
hexStr(LCAR_FORMAT_1_DATA))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
sys.exit(unittest.main())
|