• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1from fontTools.misc.testTools import FakeFont, getXML, parseXML
2from fontTools.misc.textTools import deHexStr, hexStr
3from fontTools.ttLib.tables._f_v_a_r import Axis
4from fontTools.ttLib import newTable, TTFont
5import unittest
6
7
8MVAR_DATA = deHexStr(
9    '0001 0000 '  # 0:   version=1.0
10    '0000 0008 '  # 4:   reserved=0, valueRecordSize=8
11    '0009 '       # 8:   valueRecordCount=9
12    '0054 '       # 10:  offsetToItemVariationStore=84
13    '6861 7363 '  # 12:  ValueRecord.valueTag="hasc"
14    '0000 '       # 16:  ValueRecord.deltaSetOuterIndex
15    '0003 '       # 18:  ValueRecord.deltaSetInnerIndex
16    '6863 6C61 '  # 20:  ValueRecord.valueTag="hcla"
17    '0000 '       # 24:  ValueRecord.deltaSetOuterIndex
18    '0003 '       # 26:  ValueRecord.deltaSetInnerIndex
19    '6863 6C64 '  # 28:  ValueRecord.valueTag="hcld"
20    '0000 '       # 32:  ValueRecord.deltaSetOuterIndex
21    '0003 '       # 34:  ValueRecord.deltaSetInnerIndex
22    '6864 7363 '  # 36:  ValueRecord.valueTag="hdsc"
23    '0000 '       # 40:  ValueRecord.deltaSetOuterIndex
24    '0000 '       # 42:  ValueRecord.deltaSetInnerIndex
25    '686C 6770 '  # 44:  ValueRecord.valueTag="hlgp"
26    '0000 '       # 48:  ValueRecord.deltaSetOuterIndex
27    '0002 '       # 50:  ValueRecord.deltaSetInnerIndex
28    '7362 796F '  # 52:  ValueRecord.valueTag="sbyo"
29    '0000 '       # 56:  ValueRecord.deltaSetOuterIndex
30    '0001 '       # 58:  ValueRecord.deltaSetInnerIndex
31    '7370 796F '  # 60:  ValueRecord.valueTag="spyo"
32    '0000 '       # 64:  ValueRecord.deltaSetOuterIndex
33    '0002 '       # 66:  ValueRecord.deltaSetInnerIndex
34    '7465 7374 '  # 68:  ValueRecord.valueTag="test"
35    '0000 '       # 72:  ValueRecord.deltaSetOuterIndex
36    '0002 '       # 74:  ValueRecord.deltaSetInnerIndex
37    '7465 7332 '  # 76:  ValueRecord.valueTag="tes2"
38    '0000 '       # 78:  ValueRecord.deltaSetOuterIndex
39    '0002 '       # 82:  ValueRecord.deltaSetInnerIndex
40    '0001 '       # 84:  VarStore.format=1
41    '0000 000C '  # 86:  VarStore.offsetToVariationRegionList=12
42    '0001 '       # 90:  VarStore.itemVariationDataCount=1
43    '0000 0016 '  # 92:  VarStore.itemVariationDataOffsets[0]=22
44    '0001 '       # 96:  VarRegionList.axisCount=1
45    '0001 '       # 98:  VarRegionList.regionCount=1
46    '0000 '       # 100:  variationRegions[0].regionAxes[0].startCoord=0.0
47    '4000 '       # 102:  variationRegions[0].regionAxes[0].peakCoord=1.0
48    '4000 '       # 104:  variationRegions[0].regionAxes[0].endCoord=1.0
49    '0004 '       # 106:  VarData.ItemCount=4
50    '0001 '       # 108:  VarData.NumShorts=1
51    '0001 '       # 110:  VarData.VarRegionCount=1
52    '0000 '       # 112:  VarData.VarRegionIndex[0]=0
53    'FF38 '       # 114:  VarData.deltaSets[0]=-200
54    'FFCE '       # 116: VarData.deltaSets[0]=-50
55    '0064 '       # 118: VarData.deltaSets[0]=100
56    '00C8 '       # 120: VarData.deltaSets[0]=200
57)
58
59MVAR_XML = [
60    '<Version value="0x00010000"/>',
61    '<Reserved value="0"/>',
62    '<ValueRecordSize value="8"/>',
63    '<!-- ValueRecordCount=9 -->',
64    '<VarStore Format="1">',
65    '  <Format value="1"/>',
66    '  <VarRegionList>',
67    '    <!-- RegionAxisCount=1 -->',
68    '    <!-- RegionCount=1 -->',
69    '    <Region index="0">',
70    '      <VarRegionAxis index="0">',
71    '        <StartCoord value="0.0"/>',
72    '        <PeakCoord value="1.0"/>',
73    '        <EndCoord value="1.0"/>',
74    '      </VarRegionAxis>',
75    '    </Region>',
76    '  </VarRegionList>',
77    '  <!-- VarDataCount=1 -->',
78    '  <VarData index="0">',
79    '    <!-- ItemCount=4 -->',
80    '    <NumShorts value="1"/>',
81    '    <!-- VarRegionCount=1 -->',
82    '    <VarRegionIndex index="0" value="0"/>',
83    '    <Item index="0" value="[-200]"/>',
84    '    <Item index="1" value="[-50]"/>',
85    '    <Item index="2" value="[100]"/>',
86    '    <Item index="3" value="[200]"/>',
87    '  </VarData>',
88    '</VarStore>',
89    '<ValueRecord index="0">',
90    '  <ValueTag value="hasc"/>',
91    '  <VarIdx value="3"/>',
92    '</ValueRecord>',
93    '<ValueRecord index="1">',
94    '  <ValueTag value="hcla"/>',
95    '  <VarIdx value="3"/>',
96    '</ValueRecord>',
97    '<ValueRecord index="2">',
98    '  <ValueTag value="hcld"/>',
99    '  <VarIdx value="3"/>',
100    '</ValueRecord>',
101    '<ValueRecord index="3">',
102    '  <ValueTag value="hdsc"/>',
103    '  <VarIdx value="0"/>',
104    '</ValueRecord>',
105    '<ValueRecord index="4">',
106    '  <ValueTag value="hlgp"/>',
107    '  <VarIdx value="2"/>',
108    '</ValueRecord>',
109    '<ValueRecord index="5">',
110    '  <ValueTag value="sbyo"/>',
111    '  <VarIdx value="1"/>',
112    '</ValueRecord>',
113    '<ValueRecord index="6">',
114    '  <ValueTag value="spyo"/>',
115    '  <VarIdx value="2"/>',
116    '</ValueRecord>',
117    '<ValueRecord index="7">',
118    '  <ValueTag value="test"/>',
119    '  <VarIdx value="2"/>',
120    '</ValueRecord>',
121    '<ValueRecord index="8">',
122    '  <ValueTag value="tes2"/>',
123    '  <VarIdx value="2"/>',
124    '</ValueRecord>',
125]
126
127
128class MVARTest(unittest.TestCase):
129
130    @classmethod
131    def setUpClass(cls):
132        cls.maxDiff = None
133
134    def test_decompile_toXML(self):
135        mvar = newTable('MVAR')
136        font = TTFont()
137        mvar.decompile(MVAR_DATA, font)
138        self.assertEqual(getXML(mvar.toXML), MVAR_XML)
139
140
141    def test_decompile_toXML_lazy(self):
142        mvar = newTable('MVAR')
143        font = TTFont(lazy=True)
144        mvar.decompile(MVAR_DATA, font)
145        self.assertEqual(getXML(mvar.toXML), MVAR_XML)
146
147    def test_compile_fromXML(self):
148        mvar = newTable('MVAR')
149        font = TTFont()
150        for name, attrs, content in parseXML(MVAR_XML):
151            mvar.fromXML(name, attrs, content, font=font)
152        data = MVAR_DATA
153        self.assertEqual(hexStr(mvar.compile(font)), hexStr(data))
154
155
156if __name__ == '__main__':
157    import sys
158    sys.exit(unittest.main())
159