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