• 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    @classmethod
130    def setUpClass(cls):
131        cls.maxDiff = None
132
133    def test_decompile_toXML(self):
134        mvar = newTable("MVAR")
135        font = TTFont()
136        mvar.decompile(MVAR_DATA, font)
137        self.assertEqual(getXML(mvar.toXML), MVAR_XML)
138
139    def test_decompile_toXML_lazy(self):
140        mvar = newTable("MVAR")
141        font = TTFont(lazy=True)
142        mvar.decompile(MVAR_DATA, font)
143        self.assertEqual(getXML(mvar.toXML), MVAR_XML)
144
145    def test_compile_fromXML(self):
146        mvar = newTable("MVAR")
147        font = TTFont()
148        for name, attrs, content in parseXML(MVAR_XML):
149            mvar.fromXML(name, attrs, content, font=font)
150        data = MVAR_DATA
151        self.assertEqual(hexStr(mvar.compile(font)), hexStr(data))
152
153
154if __name__ == "__main__":
155    import sys
156
157    sys.exit(unittest.main())
158