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