• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1from __future__ import print_function, division, absolute_import, unicode_literals
2from fontTools.misc.py23 import *
3from fontTools.misc.testTools import FakeFont, getXML, parseXML
4from fontTools.misc.textTools import deHexStr, hexStr
5from fontTools.ttLib import newTable
6import 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.
11BSLN_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>
23assert len(BSLN_FORMAT_0_DATA) == 72
24
25
26BSLN_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.
70BSLN_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>
86assert len(BSLN_FORMAT_1_DATA) == 96
87
88
89BSLN_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
140BSLN_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>
153assert len(BSLN_FORMAT_2_DATA) == 74
154
155
156BSLN_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.
201BSLN_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>
218assert len(BSLN_FORMAT_3_DATA) == 98
219
220
221BSLN_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
273class 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
309if __name__ == '__main__':
310    import sys
311    sys.exit(unittest.main())
312