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