from fontTools.misc.testTools import FakeFont, getXML, parseXML from fontTools.misc.textTools import deHexStr, hexStr from fontTools.ttLib import newTable import unittest # Apple's spec of the baseline table gives no example for 'bsln' format 0, # but the Apple Chancery font contains the following data. BSLN_FORMAT_0_DATA = deHexStr( '0001 0000 0000 ' # 0: Version=1.0, Format=0 '0000 ' # 6: DefaultBaseline=0 (Roman baseline) '0000 01D1 0000 0541 ' # 8: Delta[0..3]=0, 465, 0, 1345 '01FB 0000 0000 0000 ' # 16: Delta[4..7]=507, 0, 0, 0 '0000 0000 0000 0000 ' # 24: Delta[8..11]=0, 0, 0, 0 '0000 0000 0000 0000 ' # 32: Delta[12..15]=0, 0, 0, 0 '0000 0000 0000 0000 ' # 40: Delta[16..19]=0, 0, 0, 0 '0000 0000 0000 0000 ' # 48: Delta[20..23]=0, 0, 0, 0 '0000 0000 0000 0000 ' # 56: Delta[24..27]=0, 0, 0, 0 '0000 0000 0000 0000 ' # 64: Delta[28..31]=0, 0, 0, 0 ) # 72: assert len(BSLN_FORMAT_0_DATA) == 72 BSLN_FORMAT_0_XML = [ '', '', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '', ] # Example: Format 1 Baseline Table # https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bsln.html # The example in the AAT specification uses the value 270 for Seg[0].LastGlyph, # whereas we use the value 10 for testng to shorten the XML dump. BSLN_FORMAT_1_DATA = deHexStr( '0001 0000 0001 ' # 0: Version=1.0, Format=1 '0001 ' # 6: DefaultBaseline=1 (Ideographic baseline) '0000 0357 0000 05F0 ' # 8: Delta[0..3]=0, 855, 0, 1520 '0000 0000 0000 0000 ' # 16: Delta[4..7]=0, 0, 0, 0 '0000 0000 0000 0000 ' # 24: Delta[8..11]=0, 0, 0, 0 '0000 0000 0000 0000 ' # 32: Delta[12..15]=0, 0, 0, 0 '0000 0000 0000 0000 ' # 40: Delta[16..19]=0, 0, 0, 0 '0000 0000 0000 0000 ' # 48: Delta[20..23]=0, 0, 0, 0 '0000 0000 0000 0000 ' # 56: Delta[24..27]=0, 0, 0, 0 '0000 0000 0000 0000 ' # 64: Delta[28..31]=0, 0, 0, 0 '0002 0006 0001 ' # 72: LookupFormat=2, UnitSize=6, NUnits=1 '0006 0000 0000 ' # 78: SearchRange=6, EntrySelector=0, RangeShift=0 '000A 0002 0000 ' # 84: Seg[0].LastGlyph=10 FirstGl=2 Value=0/Roman 'FFFF FFFF 0000 ' # 90: Seg[1]= ) # 96: assert len(BSLN_FORMAT_1_DATA) == 96 BSLN_FORMAT_1_XML = [ '', '', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '', ] BSLN_FORMAT_2_DATA = deHexStr( '0001 0000 0002 ' # 0: Version=1.0, Format=2 '0004 ' # 6: DefaultBaseline=4 (Math) '0016 ' # 8: StandardGlyph=22 '0050 0051 FFFF 0052 ' # 10: ControlPoint[0..3]=80, 81, , 82 'FFFF FFFF FFFF FFFF ' # 18: ControlPoint[4..7]= 'FFFF FFFF FFFF FFFF ' # 26: ControlPoint[8..11]= 'FFFF FFFF FFFF FFFF ' # 34: ControlPoint[12..15]= 'FFFF FFFF FFFF FFFF ' # 42: ControlPoint[16..19]= 'FFFF FFFF FFFF FFFF ' # 50: ControlPoint[20..23]= 'FFFF FFFF FFFF FFFF ' # 58: ControlPoint[24..27]= 'FFFF FFFF FFFF FFFF ' # 66: ControlPoint[28..31]= ) # 74: assert len(BSLN_FORMAT_2_DATA) == 74 BSLN_FORMAT_2_XML = [ '', '', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '', ] # Example: Format 3 Baseline Table # https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bsln.html # The example in the AAT specification uses the value 270 for Seg[0].LastGlyph, # whereas we use the value 10 for testng to shorten the XML dump. BSLN_FORMAT_3_DATA = deHexStr( '0001 0000 0003 ' # 0: Version=1.0, Format=3 '0001 ' # 6: DefaultBaseline=1 (Ideographic) '0016 ' # 8: StandardGlyph=22 '0050 0051 FFFF 0052 ' # 10: ControlPoint[0..3]=80, 81, , 82 'FFFF FFFF FFFF FFFF ' # 18: ControlPoint[4..7]= 'FFFF FFFF FFFF FFFF ' # 26: ControlPoint[8..11]= 'FFFF FFFF FFFF FFFF ' # 34: ControlPoint[12..15]= 'FFFF FFFF FFFF FFFF ' # 42: ControlPoint[16..19]= 'FFFF FFFF FFFF FFFF ' # 50: ControlPoint[20..23]= 'FFFF FFFF FFFF FFFF ' # 58: ControlPoint[24..27]= 'FFFF FFFF FFFF FFFF ' # 66: ControlPoint[28..31]= '0002 0006 0001 ' # 74: LookupFormat=2, UnitSize=6, NUnits=1 '0006 0000 0000 ' # 80: SearchRange=6, EntrySelector=0, RangeShift=0 '000A 0002 0000 ' # 86: Seg[0].LastGlyph=10 FirstGl=2 Value=0/Roman 'FFFF FFFF 0000 ' # 92: Seg[1]= ) # 98: assert len(BSLN_FORMAT_3_DATA) == 98 BSLN_FORMAT_3_XML = [ '', '', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '', ] class BSLNTest(unittest.TestCase): @classmethod def setUpClass(cls): cls.maxDiff = None cls.font = FakeFont( ['.notdef'] + [g for g in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ']) def decompileToXML(self, data, xml): table = newTable('bsln') table.decompile(data, self.font) self.assertEqual(getXML(table.toXML), xml) def compileFromXML(self, xml, data): table = newTable('bsln') for name, attrs, content in parseXML(xml): table.fromXML(name, attrs, content, font=self.font) self.assertEqual(hexStr(table.compile(self.font)), hexStr(data)) def testFormat0(self): self.decompileToXML(BSLN_FORMAT_0_DATA, BSLN_FORMAT_0_XML) self.compileFromXML(BSLN_FORMAT_0_XML, BSLN_FORMAT_0_DATA) def testFormat1(self): self.decompileToXML(BSLN_FORMAT_1_DATA, BSLN_FORMAT_1_XML) self.compileFromXML(BSLN_FORMAT_1_XML, BSLN_FORMAT_1_DATA) def testFormat2(self): self.decompileToXML(BSLN_FORMAT_2_DATA, BSLN_FORMAT_2_XML) self.compileFromXML(BSLN_FORMAT_2_XML, BSLN_FORMAT_2_DATA) def testFormat3(self): self.decompileToXML(BSLN_FORMAT_3_DATA, BSLN_FORMAT_3_XML) self.compileFromXML(BSLN_FORMAT_3_XML, BSLN_FORMAT_3_DATA) if __name__ == '__main__': import sys sys.exit(unittest.main())