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