[varLib] Update tests for VarStore optimization

Also, don't emit GDEF if VarStore is empty.
This commit is contained in:
Behdad Esfahbod 2018-02-21 01:08:29 -08:00
parent 398f7169c8
commit 1adf7fd2c0
5 changed files with 24 additions and 193 deletions

View File

@ -513,7 +513,11 @@ def _merge_OTL(font, model, master_fonts, axisTags):
merger = VariationMerger(model, axisTags, font) merger = VariationMerger(model, axisTags, font)
merger.mergeTables(font, master_fonts, ['GPOS']) merger.mergeTables(font, master_fonts, ['GPOS'])
# TODO Merge GSUB
# TODO Merge GDEF itself!
store = merger.store_builder.finish() store = merger.store_builder.finish()
if not store.VarData:
return
try: try:
GDEF = font['GDEF'].table GDEF = font['GDEF'].table
assert GDEF.Version <= 0x00010002 assert GDEF.Version <= 0x00010002
@ -527,6 +531,7 @@ def _merge_OTL(font, model, master_fonts, axisTags):
# Optimize # Optimize
varidx_map = store.optimize() varidx_map = store.optimize()
GDEF.remap_device_varidxes(varidx_map) GDEF.remap_device_varidxes(varidx_map)
if 'GPOS' in font:
font['GPOS'].table.remap_device_varidxes(varidx_map) font['GPOS'].table.remap_device_varidxes(varidx_map)

View File

@ -22,14 +22,24 @@ class OnlineVarStoreBuilder(object):
self._regionMap = {} self._regionMap = {}
self._regionList = buildVarRegionList([], axisTags) self._regionList = buildVarRegionList([], axisTags)
self._store = buildVarStore(self._regionList, []) self._store = buildVarStore(self._regionList, [])
self._data = None
def setModel(self, model): def setModel(self, model):
self._model = model self._model = model
def finish(self, optimize=True):
self._regionList.RegionCount = len(self._regionList.Region)
self._store.VarDataCount = len(self._store.VarData)
for data in self._store.VarData:
data.ItemCount = len(data.Item)
VarData_CalculateNumShorts(data, optimize)
return self._store
def _add_VarData(self):
regionMap = self._regionMap regionMap = self._regionMap
regionList = self._regionList regionList = self._regionList
regions = model.supports[1:] regions = self._model.supports[1:]
regionIndices = [] regionIndices = []
for region in regions: for region in regions:
key = _getLocationKey(region) key = _getLocationKey(region)
@ -44,21 +54,15 @@ class OnlineVarStoreBuilder(object):
self._outer = len(self._store.VarData) self._outer = len(self._store.VarData)
self._store.VarData.append(data) self._store.VarData.append(data)
def finish(self, optimize=True):
self._regionList.RegionCount = len(self._regionList.Region)
self._store.VarDataCount = len(self._store.VarData)
for data in self._store.VarData:
data.ItemCount = len(data.Item)
VarData_CalculateNumShorts(data, optimize)
return self._store
def storeMasters(self, master_values): def storeMasters(self, master_values):
if not self._data:
self._add_VarData()
deltas = [round(d) for d in self._model.getDeltas(master_values)] deltas = [round(d) for d in self._model.getDeltas(master_values)]
base = deltas.pop(0) base = deltas.pop(0)
inner = len(self._data.Item) inner = len(self._data.Item)
if inner == 0xFFFF: if inner == 0xFFFF:
# Full array. Start new one. # Full array. Start new one.
self.setModel(self._model) self._add_VarData()
return self.storeMasters(master_values) return self.storeMasters(master_values)
self._data.Item.append(deltas) self._data.Item.append(deltas)
return base, (self._outer << 16) + inner return base, (self._outer << 16) + inner

View File

@ -1,83 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.17"> <ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.17">
<GDEF>
<Version value="0x00010003"/>
<VarStore Format="1">
<Format value="1"/>
<VarRegionList>
<!-- RegionAxisCount=2 -->
<!-- RegionCount=5 -->
<Region index="0">
<VarRegionAxis index="0">
<StartCoord value="-1.0"/>
<PeakCoord value="-1.0"/>
<EndCoord value="0.0"/>
</VarRegionAxis>
<VarRegionAxis index="1">
<StartCoord value="0.0"/>
<PeakCoord value="0.0"/>
<EndCoord value="0.0"/>
</VarRegionAxis>
</Region>
<Region index="1">
<VarRegionAxis index="0">
<StartCoord value="0.0"/>
<PeakCoord value="1.0"/>
<EndCoord value="1.0"/>
</VarRegionAxis>
<VarRegionAxis index="1">
<StartCoord value="0.0"/>
<PeakCoord value="0.0"/>
<EndCoord value="0.0"/>
</VarRegionAxis>
</Region>
<Region index="2">
<VarRegionAxis index="0">
<StartCoord value="0.0"/>
<PeakCoord value="0.0"/>
<EndCoord value="0.0"/>
</VarRegionAxis>
<VarRegionAxis index="1">
<StartCoord value="0.0"/>
<PeakCoord value="1.0"/>
<EndCoord value="1.0"/>
</VarRegionAxis>
</Region>
<Region index="3">
<VarRegionAxis index="0">
<StartCoord value="-1.0"/>
<PeakCoord value="-1.0"/>
<EndCoord value="0.0"/>
</VarRegionAxis>
<VarRegionAxis index="1">
<StartCoord value="0.0"/>
<PeakCoord value="1.0"/>
<EndCoord value="1.0"/>
</VarRegionAxis>
</Region>
<Region index="4">
<VarRegionAxis index="0">
<StartCoord value="0.0"/>
<PeakCoord value="1.0"/>
<EndCoord value="1.0"/>
</VarRegionAxis>
<VarRegionAxis index="1">
<StartCoord value="0.0"/>
<PeakCoord value="1.0"/>
<EndCoord value="1.0"/>
</VarRegionAxis>
</Region>
</VarRegionList>
<!-- VarDataCount=1 -->
<VarData index="0">
<!-- ItemCount=0 -->
<NumShorts value="0"/>
<!-- VarRegionCount=0 -->
</VarData>
</VarStore>
</GDEF>
<HVAR> <HVAR>
<Version value="0x00010000"/> <Version value="0x00010000"/>
<VarStore Format="1"> <VarStore Format="1">

View File

@ -1,30 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.14"> <ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.14">
<GDEF>
<Version value="0x00010003"/>
<VarStore Format="1">
<Format value="1"/>
<VarRegionList>
<!-- RegionAxisCount=1 -->
<!-- RegionCount=1 -->
<Region index="0">
<VarRegionAxis index="0">
<StartCoord value="0.0"/>
<PeakCoord value="1.0"/>
<EndCoord value="1.0"/>
</VarRegionAxis>
</Region>
</VarRegionList>
<!-- VarDataCount=1 -->
<VarData index="0">
<!-- ItemCount=0 -->
<NumShorts value="0"/>
<!-- VarRegionCount=0 -->
</VarData>
</VarStore>
</GDEF>
<HVAR> <HVAR>
<Version value="0x00010000"/> <Version value="0x00010000"/>
<VarStore Format="1"> <VarStore Format="1">
@ -92,17 +68,17 @@
<NumShorts value="0"/> <NumShorts value="0"/>
<!-- VarRegionCount=1 --> <!-- VarRegionCount=1 -->
<VarRegionIndex index="0" value="0"/> <VarRegionIndex index="0" value="0"/>
<Item index="0" value="[22]"/> <Item index="0" value="[13]"/>
<Item index="1" value="[13]"/> <Item index="1" value="[22]"/>
</VarData> </VarData>
</VarStore> </VarStore>
<ValueRecord index="0"> <ValueRecord index="0">
<ValueTag value="stro"/> <ValueTag value="stro"/>
<VarIdx value="1"/> <VarIdx value="0"/>
</ValueRecord> </ValueRecord>
<ValueRecord index="1"> <ValueRecord index="1">
<ValueTag value="xhgt"/> <ValueTag value="xhgt"/>
<VarIdx value="0"/> <VarIdx value="1"/>
</ValueRecord> </ValueRecord>
</MVAR> </MVAR>

View File

@ -616,83 +616,6 @@
</extraNames> </extraNames>
</post> </post>
<GDEF>
<Version value="0x00010003"/>
<VarStore Format="1">
<Format value="1"/>
<VarRegionList>
<!-- RegionAxisCount=2 -->
<!-- RegionCount=5 -->
<Region index="0">
<VarRegionAxis index="0">
<StartCoord value="-1.0"/>
<PeakCoord value="-1.0"/>
<EndCoord value="0.0"/>
</VarRegionAxis>
<VarRegionAxis index="1">
<StartCoord value="0.0"/>
<PeakCoord value="0.0"/>
<EndCoord value="0.0"/>
</VarRegionAxis>
</Region>
<Region index="1">
<VarRegionAxis index="0">
<StartCoord value="0.0"/>
<PeakCoord value="1.0"/>
<EndCoord value="1.0"/>
</VarRegionAxis>
<VarRegionAxis index="1">
<StartCoord value="0.0"/>
<PeakCoord value="0.0"/>
<EndCoord value="0.0"/>
</VarRegionAxis>
</Region>
<Region index="2">
<VarRegionAxis index="0">
<StartCoord value="0.0"/>
<PeakCoord value="0.0"/>
<EndCoord value="0.0"/>
</VarRegionAxis>
<VarRegionAxis index="1">
<StartCoord value="0.0"/>
<PeakCoord value="1.0"/>
<EndCoord value="1.0"/>
</VarRegionAxis>
</Region>
<Region index="3">
<VarRegionAxis index="0">
<StartCoord value="-1.0"/>
<PeakCoord value="-1.0"/>
<EndCoord value="0.0"/>
</VarRegionAxis>
<VarRegionAxis index="1">
<StartCoord value="0.0"/>
<PeakCoord value="1.0"/>
<EndCoord value="1.0"/>
</VarRegionAxis>
</Region>
<Region index="4">
<VarRegionAxis index="0">
<StartCoord value="0.0"/>
<PeakCoord value="1.0"/>
<EndCoord value="1.0"/>
</VarRegionAxis>
<VarRegionAxis index="1">
<StartCoord value="0.0"/>
<PeakCoord value="1.0"/>
<EndCoord value="1.0"/>
</VarRegionAxis>
</Region>
</VarRegionList>
<!-- VarDataCount=1 -->
<VarData index="0">
<!-- ItemCount=0 -->
<NumShorts value="0"/>
<!-- VarRegionCount=0 -->
</VarData>
</VarStore>
</GDEF>
<HVAR> <HVAR>
<Version value="0x00010000"/> <Version value="0x00010000"/>
<VarStore Format="1"> <VarStore Format="1">