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

View File

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

View File

@ -1,83 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<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>
<Version value="0x00010000"/>
<VarStore Format="1">

View File

@ -1,30 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<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>
<Version value="0x00010000"/>
<VarStore Format="1">
@ -92,17 +68,17 @@
<NumShorts value="0"/>
<!-- VarRegionCount=1 -->
<VarRegionIndex index="0" value="0"/>
<Item index="0" value="[22]"/>
<Item index="1" value="[13]"/>
<Item index="0" value="[13]"/>
<Item index="1" value="[22]"/>
</VarData>
</VarStore>
<ValueRecord index="0">
<ValueTag value="stro"/>
<VarIdx value="1"/>
<VarIdx value="0"/>
</ValueRecord>
<ValueRecord index="1">
<ValueTag value="xhgt"/>
<VarIdx value="0"/>
<VarIdx value="1"/>
</ValueRecord>
</MVAR>

View File

@ -616,83 +616,6 @@
</extraNames>
</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>
<Version value="0x00010000"/>
<VarStore Format="1">