Home | History | Annotate | Download | only in tables
      1 from __future__ import print_function, division, absolute_import, unicode_literals
      2 from fontTools.misc.py23 import *
      3 from fontTools.misc.testTools import FakeFont, getXML, parseXML
      4 from fontTools.misc.textTools import deHexStr, hexStr
      5 from fontTools.ttLib import newTable
      6 import unittest
      7 
      8 
      9 # Apple's spec of the baseline table gives no example for 'bsln' format 0,
     10 # but the Apple Chancery font contains the following data.
     11 BSLN_FORMAT_0_DATA = deHexStr(
     12     '0001 0000 0000 '       #  0: Version=1.0, Format=0
     13     '0000 '                 #  6: DefaultBaseline=0 (Roman baseline)
     14     '0000 01D1 0000 0541 '  #  8: Delta[0..3]=0, 465, 0, 1345
     15     '01FB 0000 0000 0000 '  # 16: Delta[4..7]=507, 0, 0, 0
     16     '0000 0000 0000 0000 '  # 24: Delta[8..11]=0, 0, 0, 0
     17     '0000 0000 0000 0000 '  # 32: Delta[12..15]=0, 0, 0, 0
     18     '0000 0000 0000 0000 '  # 40: Delta[16..19]=0, 0, 0, 0
     19     '0000 0000 0000 0000 '  # 48: Delta[20..23]=0, 0, 0, 0
     20     '0000 0000 0000 0000 '  # 56: Delta[24..27]=0, 0, 0, 0
     21     '0000 0000 0000 0000 '  # 64: Delta[28..31]=0, 0, 0, 0
     22 )                           # 72: <end>
     23 assert len(BSLN_FORMAT_0_DATA) == 72
     24 
     25 
     26 BSLN_FORMAT_0_XML = [
     27     '<Version value="0x00010000"/>',
     28     '<Baseline Format="0">',
     29     '  <DefaultBaseline value="0"/>',
     30     '  <Delta index="0" value="0"/>',
     31     '  <Delta index="1" value="465"/>',
     32     '  <Delta index="2" value="0"/>',
     33     '  <Delta index="3" value="1345"/>',
     34     '  <Delta index="4" value="507"/>',
     35     '  <Delta index="5" value="0"/>',
     36     '  <Delta index="6" value="0"/>',
     37     '  <Delta index="7" value="0"/>',
     38     '  <Delta index="8" value="0"/>',
     39     '  <Delta index="9" value="0"/>',
     40     '  <Delta index="10" value="0"/>',
     41     '  <Delta index="11" value="0"/>',
     42     '  <Delta index="12" value="0"/>',
     43     '  <Delta index="13" value="0"/>',
     44     '  <Delta index="14" value="0"/>',
     45     '  <Delta index="15" value="0"/>',
     46     '  <Delta index="16" value="0"/>',
     47     '  <Delta index="17" value="0"/>',
     48     '  <Delta index="18" value="0"/>',
     49     '  <Delta index="19" value="0"/>',
     50     '  <Delta index="20" value="0"/>',
     51     '  <Delta index="21" value="0"/>',
     52     '  <Delta index="22" value="0"/>',
     53     '  <Delta index="23" value="0"/>',
     54     '  <Delta index="24" value="0"/>',
     55     '  <Delta index="25" value="0"/>',
     56     '  <Delta index="26" value="0"/>',
     57     '  <Delta index="27" value="0"/>',
     58     '  <Delta index="28" value="0"/>',
     59     '  <Delta index="29" value="0"/>',
     60     '  <Delta index="30" value="0"/>',
     61     '  <Delta index="31" value="0"/>',
     62     '</Baseline>',
     63 ]
     64 
     65 
     66 # Example: Format 1 Baseline Table
     67 # https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bsln.html
     68 # The example in the AAT specification uses the value 270 for Seg[0].LastGlyph,
     69 # whereas we use the value 10 for testng to shorten the XML dump.
     70 BSLN_FORMAT_1_DATA = deHexStr(
     71     '0001 0000 0001 '       #  0: Version=1.0, Format=1
     72     '0001 '                 #  6: DefaultBaseline=1 (Ideographic baseline)
     73     '0000 0357 0000 05F0 '  #  8: Delta[0..3]=0, 855, 0, 1520
     74     '0000 0000 0000 0000 '  # 16: Delta[4..7]=0, 0, 0, 0
     75     '0000 0000 0000 0000 '  # 24: Delta[8..11]=0, 0, 0, 0
     76     '0000 0000 0000 0000 '  # 32: Delta[12..15]=0, 0, 0, 0
     77     '0000 0000 0000 0000 '  # 40: Delta[16..19]=0, 0, 0, 0
     78     '0000 0000 0000 0000 '  # 48: Delta[20..23]=0, 0, 0, 0
     79     '0000 0000 0000 0000 '  # 56: Delta[24..27]=0, 0, 0, 0
     80     '0000 0000 0000 0000 '  # 64: Delta[28..31]=0, 0, 0, 0
     81     '0002 0006 0001 '       # 72: LookupFormat=2, UnitSize=6, NUnits=1
     82     '0006 0000 0000 '       # 78: SearchRange=6, EntrySelector=0, RangeShift=0
     83     '000A 0002 0000 '       # 84: Seg[0].LastGlyph=10 FirstGl=2 Value=0/Roman
     84     'FFFF FFFF 0000 '       # 90: Seg[1]=<end>
     85 )                           # 96: <end>
     86 assert len(BSLN_FORMAT_1_DATA) == 96
     87 
     88 
     89 BSLN_FORMAT_1_XML = [
     90     '<Version value="0x00010000"/>',
     91     '<Baseline Format="1">',
     92     '  <DefaultBaseline value="1"/>',
     93     '  <Delta index="0" value="0"/>',
     94     '  <Delta index="1" value="855"/>',
     95     '  <Delta index="2" value="0"/>',
     96     '  <Delta index="3" value="1520"/>',
     97     '  <Delta index="4" value="0"/>',
     98     '  <Delta index="5" value="0"/>',
     99     '  <Delta index="6" value="0"/>',
    100     '  <Delta index="7" value="0"/>',
    101     '  <Delta index="8" value="0"/>',
    102     '  <Delta index="9" value="0"/>',
    103     '  <Delta index="10" value="0"/>',
    104     '  <Delta index="11" value="0"/>',
    105     '  <Delta index="12" value="0"/>',
    106     '  <Delta index="13" value="0"/>',
    107     '  <Delta index="14" value="0"/>',
    108     '  <Delta index="15" value="0"/>',
    109     '  <Delta index="16" value="0"/>',
    110     '  <Delta index="17" value="0"/>',
    111     '  <Delta index="18" value="0"/>',
    112     '  <Delta index="19" value="0"/>',
    113     '  <Delta index="20" value="0"/>',
    114     '  <Delta index="21" value="0"/>',
    115     '  <Delta index="22" value="0"/>',
    116     '  <Delta index="23" value="0"/>',
    117     '  <Delta index="24" value="0"/>',
    118     '  <Delta index="25" value="0"/>',
    119     '  <Delta index="26" value="0"/>',
    120     '  <Delta index="27" value="0"/>',
    121     '  <Delta index="28" value="0"/>',
    122     '  <Delta index="29" value="0"/>',
    123     '  <Delta index="30" value="0"/>',
    124     '  <Delta index="31" value="0"/>',
    125     '  <BaselineValues>',
    126     '    <Lookup glyph="B" value="0"/>',
    127     '    <Lookup glyph="C" value="0"/>',
    128     '    <Lookup glyph="D" value="0"/>',
    129     '    <Lookup glyph="E" value="0"/>',
    130     '    <Lookup glyph="F" value="0"/>',
    131     '    <Lookup glyph="G" value="0"/>',
    132     '    <Lookup glyph="H" value="0"/>',
    133     '    <Lookup glyph="I" value="0"/>',
    134     '    <Lookup glyph="J" value="0"/>',
    135     '  </BaselineValues>',
    136     '</Baseline>',
    137 ]
    138 
    139 
    140 BSLN_FORMAT_2_DATA = deHexStr(
    141     '0001 0000 0002 '       #  0: Version=1.0, Format=2
    142     '0004 '                 #  6: DefaultBaseline=4 (Math)
    143     '0016 '                 #  8: StandardGlyph=22
    144     '0050 0051 FFFF 0052 '  # 10: ControlPoint[0..3]=80, 81, <none>, 82
    145     'FFFF FFFF FFFF FFFF '  # 18: ControlPoint[4..7]=<none>
    146     'FFFF FFFF FFFF FFFF '  # 26: ControlPoint[8..11]=<none>
    147     'FFFF FFFF FFFF FFFF '  # 34: ControlPoint[12..15]=<none>
    148     'FFFF FFFF FFFF FFFF '  # 42: ControlPoint[16..19]=<none>
    149     'FFFF FFFF FFFF FFFF '  # 50: ControlPoint[20..23]=<none>
    150     'FFFF FFFF FFFF FFFF '  # 58: ControlPoint[24..27]=<none>
    151     'FFFF FFFF FFFF FFFF '  # 66: ControlPoint[28..31]=<none>
    152 )                           # 74: <end>
    153 assert len(BSLN_FORMAT_2_DATA) == 74
    154 
    155 
    156 BSLN_FORMAT_2_XML = [
    157     '<Version value="0x00010000"/>',
    158     '<Baseline Format="2">',
    159     '  <DefaultBaseline value="4"/>',
    160     '  <StandardGlyph value="V"/>',
    161     '  <ControlPoint index="0" value="80"/>',
    162     '  <ControlPoint index="1" value="81"/>',
    163     '  <ControlPoint index="2" value="65535"/>',
    164     '  <ControlPoint index="3" value="82"/>',
    165     '  <ControlPoint index="4" value="65535"/>',
    166     '  <ControlPoint index="5" value="65535"/>',
    167     '  <ControlPoint index="6" value="65535"/>',
    168     '  <ControlPoint index="7" value="65535"/>',
    169     '  <ControlPoint index="8" value="65535"/>',
    170     '  <ControlPoint index="9" value="65535"/>',
    171     '  <ControlPoint index="10" value="65535"/>',
    172     '  <ControlPoint index="11" value="65535"/>',
    173     '  <ControlPoint index="12" value="65535"/>',
    174     '  <ControlPoint index="13" value="65535"/>',
    175     '  <ControlPoint index="14" value="65535"/>',
    176     '  <ControlPoint index="15" value="65535"/>',
    177     '  <ControlPoint index="16" value="65535"/>',
    178     '  <ControlPoint index="17" value="65535"/>',
    179     '  <ControlPoint index="18" value="65535"/>',
    180     '  <ControlPoint index="19" value="65535"/>',
    181     '  <ControlPoint index="20" value="65535"/>',
    182     '  <ControlPoint index="21" value="65535"/>',
    183     '  <ControlPoint index="22" value="65535"/>',
    184     '  <ControlPoint index="23" value="65535"/>',
    185     '  <ControlPoint index="24" value="65535"/>',
    186     '  <ControlPoint index="25" value="65535"/>',
    187     '  <ControlPoint index="26" value="65535"/>',
    188     '  <ControlPoint index="27" value="65535"/>',
    189     '  <ControlPoint index="28" value="65535"/>',
    190     '  <ControlPoint index="29" value="65535"/>',
    191     '  <ControlPoint index="30" value="65535"/>',
    192     '  <ControlPoint index="31" value="65535"/>',
    193     '</Baseline>',
    194 ]
    195 
    196 
    197 # Example: Format 3 Baseline Table
    198 # https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bsln.html
    199 # The example in the AAT specification uses the value 270 for Seg[0].LastGlyph,
    200 # whereas we use the value 10 for testng to shorten the XML dump.
    201 BSLN_FORMAT_3_DATA = deHexStr(
    202     '0001 0000 0003 '       #  0: Version=1.0, Format=3
    203     '0001 '                 #  6: DefaultBaseline=1 (Ideographic)
    204     '0016 '                 #  8: StandardGlyph=22
    205     '0050 0051 FFFF 0052 '  # 10: ControlPoint[0..3]=80, 81, <none>, 82
    206     'FFFF FFFF FFFF FFFF '  # 18: ControlPoint[4..7]=<none>
    207     'FFFF FFFF FFFF FFFF '  # 26: ControlPoint[8..11]=<none>
    208     'FFFF FFFF FFFF FFFF '  # 34: ControlPoint[12..15]=<none>
    209     'FFFF FFFF FFFF FFFF '  # 42: ControlPoint[16..19]=<none>
    210     'FFFF FFFF FFFF FFFF '  # 50: ControlPoint[20..23]=<none>
    211     'FFFF FFFF FFFF FFFF '  # 58: ControlPoint[24..27]=<none>
    212     'FFFF FFFF FFFF FFFF '  # 66: ControlPoint[28..31]=<none>
    213     '0002 0006 0001 '       # 74: LookupFormat=2, UnitSize=6, NUnits=1
    214     '0006 0000 0000 '       # 80: SearchRange=6, EntrySelector=0, RangeShift=0
    215     '000A 0002 0000 '       # 86: Seg[0].LastGlyph=10 FirstGl=2 Value=0/Roman
    216     'FFFF FFFF 0000 '       # 92: Seg[1]=<end>
    217 )                           # 98: <end>
    218 assert len(BSLN_FORMAT_3_DATA) == 98
    219 
    220 
    221 BSLN_FORMAT_3_XML = [
    222     '<Version value="0x00010000"/>',
    223     '<Baseline Format="3">',
    224     '  <DefaultBaseline value="1"/>',
    225     '  <StandardGlyph value="V"/>',
    226     '  <ControlPoint index="0" value="80"/>',
    227     '  <ControlPoint index="1" value="81"/>',
    228     '  <ControlPoint index="2" value="65535"/>',
    229     '  <ControlPoint index="3" value="82"/>',
    230     '  <ControlPoint index="4" value="65535"/>',
    231     '  <ControlPoint index="5" value="65535"/>',
    232     '  <ControlPoint index="6" value="65535"/>',
    233     '  <ControlPoint index="7" value="65535"/>',
    234     '  <ControlPoint index="8" value="65535"/>',
    235     '  <ControlPoint index="9" value="65535"/>',
    236     '  <ControlPoint index="10" value="65535"/>',
    237     '  <ControlPoint index="11" value="65535"/>',
    238     '  <ControlPoint index="12" value="65535"/>',
    239     '  <ControlPoint index="13" value="65535"/>',
    240     '  <ControlPoint index="14" value="65535"/>',
    241     '  <ControlPoint index="15" value="65535"/>',
    242     '  <ControlPoint index="16" value="65535"/>',
    243     '  <ControlPoint index="17" value="65535"/>',
    244     '  <ControlPoint index="18" value="65535"/>',
    245     '  <ControlPoint index="19" value="65535"/>',
    246     '  <ControlPoint index="20" value="65535"/>',
    247     '  <ControlPoint index="21" value="65535"/>',
    248     '  <ControlPoint index="22" value="65535"/>',
    249     '  <ControlPoint index="23" value="65535"/>',
    250     '  <ControlPoint index="24" value="65535"/>',
    251     '  <ControlPoint index="25" value="65535"/>',
    252     '  <ControlPoint index="26" value="65535"/>',
    253     '  <ControlPoint index="27" value="65535"/>',
    254     '  <ControlPoint index="28" value="65535"/>',
    255     '  <ControlPoint index="29" value="65535"/>',
    256     '  <ControlPoint index="30" value="65535"/>',
    257     '  <ControlPoint index="31" value="65535"/>',
    258     '  <BaselineValues>',
    259     '    <Lookup glyph="B" value="0"/>',
    260     '    <Lookup glyph="C" value="0"/>',
    261     '    <Lookup glyph="D" value="0"/>',
    262     '    <Lookup glyph="E" value="0"/>',
    263     '    <Lookup glyph="F" value="0"/>',
    264     '    <Lookup glyph="G" value="0"/>',
    265     '    <Lookup glyph="H" value="0"/>',
    266     '    <Lookup glyph="I" value="0"/>',
    267     '    <Lookup glyph="J" value="0"/>',
    268     '  </BaselineValues>',
    269     '</Baseline>',
    270 ]
    271 
    272 
    273 class BSLNTest(unittest.TestCase):
    274 
    275     @classmethod
    276     def setUpClass(cls):
    277         cls.maxDiff = None
    278         cls.font = FakeFont(
    279             ['.notdef'] + [g for g in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'])
    280 
    281     def decompileToXML(self, data, xml):
    282         table = newTable('bsln')
    283         table.decompile(data, self.font)
    284         self.assertEqual(getXML(table.toXML), xml)
    285 
    286     def compileFromXML(self, xml, data):
    287         table = newTable('bsln')
    288         for name, attrs, content in parseXML(xml):
    289             table.fromXML(name, attrs, content, font=self.font)
    290         self.assertEqual(hexStr(table.compile(self.font)), hexStr(data))
    291 
    292     def testFormat0(self):
    293         self.decompileToXML(BSLN_FORMAT_0_DATA, BSLN_FORMAT_0_XML)
    294         self.compileFromXML(BSLN_FORMAT_0_XML, BSLN_FORMAT_0_DATA)
    295 
    296     def testFormat1(self):
    297         self.decompileToXML(BSLN_FORMAT_1_DATA, BSLN_FORMAT_1_XML)
    298         self.compileFromXML(BSLN_FORMAT_1_XML, BSLN_FORMAT_1_DATA)
    299 
    300     def testFormat2(self):
    301         self.decompileToXML(BSLN_FORMAT_2_DATA, BSLN_FORMAT_2_XML)
    302         self.compileFromXML(BSLN_FORMAT_2_XML, BSLN_FORMAT_2_DATA)
    303 
    304     def testFormat3(self):
    305         self.decompileToXML(BSLN_FORMAT_3_DATA, BSLN_FORMAT_3_XML)
    306         self.compileFromXML(BSLN_FORMAT_3_XML, BSLN_FORMAT_3_DATA)
    307 
    308 
    309 if __name__ == '__main__':
    310     import sys
    311     sys.exit(unittest.main())
    312