Merge pull request #2662 from fonttools/varstore-empty
[varLib.varStore] Support NO_VARIATION_INDEX
This commit is contained in:
commit
97958a95e1
@ -764,7 +764,7 @@ class Builder(object):
|
||||
gdef.Version = 0x00010002 if gdef.MarkGlyphSetsDef else 0x00010000
|
||||
if self.varstorebuilder:
|
||||
store = self.varstorebuilder.finish()
|
||||
if store.VarData:
|
||||
if store:
|
||||
gdef.Version = 0x00010003
|
||||
gdef.VarStore = store
|
||||
varidx_map = store.optimize()
|
||||
|
@ -486,7 +486,7 @@ def _get_advance_metrics(font, masterModel, master_ttfs,
|
||||
vOrigMap[glyphName] = storeBuilder.storeDeltas(deltas, round=noRound)
|
||||
|
||||
indirectStore = storeBuilder.finish()
|
||||
mapping2 = indirectStore.optimize()
|
||||
mapping2 = indirectStore.optimize(use_NO_VARIATION_INDEX=False)
|
||||
advMapping = [mapping2[advMapping[g]] for g in glyphOrder]
|
||||
advanceMapping = builder.buildVarIdxMap(advMapping, glyphOrder)
|
||||
|
||||
@ -606,7 +606,7 @@ def _add_BASE(font, masterModel, master_ttfs, axisTags):
|
||||
merger.mergeTables(font, master_ttfs, ['BASE'])
|
||||
store = merger.store_builder.finish()
|
||||
|
||||
if not store.VarData:
|
||||
if not store:
|
||||
return
|
||||
base = font['BASE'].table
|
||||
assert base.Version == 0x00010000
|
||||
@ -621,7 +621,7 @@ def _merge_OTL(font, model, master_fonts, axisTags):
|
||||
|
||||
merger.mergeTables(font, master_fonts, ['GSUB', 'GDEF', 'GPOS'])
|
||||
store = merger.store_builder.finish()
|
||||
if not store.VarData:
|
||||
if not store:
|
||||
return
|
||||
try:
|
||||
GDEF = font['GDEF'].table
|
||||
|
@ -633,6 +633,7 @@ def instantiateItemVariationStore(itemVarStore, fvarAxes, axisLimits):
|
||||
for major, deltas in enumerate(defaultDeltaArray)
|
||||
for minor, delta in enumerate(deltas)
|
||||
}
|
||||
defaultDeltas[itemVarStore.NO_VARIATION_INDEX] = 0
|
||||
return defaultDeltas
|
||||
|
||||
|
||||
|
@ -7,6 +7,10 @@ from functools import partial
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
NO_VARIATION_INDEX = 0xFFFFFFFF
|
||||
ot.VarStore.NO_VARIATION_INDEX = NO_VARIATION_INDEX
|
||||
|
||||
|
||||
def _getLocationKey(loc):
|
||||
return tuple(sorted(loc.items(), key=lambda kv: kv[0]))
|
||||
|
||||
@ -135,6 +139,11 @@ def VarRegion_get_support(self, fvar_axes):
|
||||
|
||||
ot.VarRegion.get_support = VarRegion_get_support
|
||||
|
||||
def VarStore___bool__(self):
|
||||
return bool(self.VarData)
|
||||
|
||||
ot.VarStore.__bool__ = VarStore___bool__
|
||||
|
||||
class VarStoreInstancer(object):
|
||||
|
||||
def __init__(self, varstore, fvar_axes, location={}):
|
||||
@ -169,6 +178,7 @@ class VarStoreInstancer(object):
|
||||
|
||||
def __getitem__(self, varidx):
|
||||
major, minor = varidx >> 16, varidx & 0xFFFF
|
||||
if varidx == NO_VARIATION_INDEX: return 0.
|
||||
varData = self._varData
|
||||
scalars = [self._getScalar(ri) for ri in varData[major].VarRegionIndex]
|
||||
deltas = varData[major].Item[minor]
|
||||
@ -431,7 +441,7 @@ class _EncodingDict(dict):
|
||||
return chars
|
||||
|
||||
|
||||
def VarStore_optimize(self):
|
||||
def VarStore_optimize(self, use_NO_VARIATION_INDEX=True):
|
||||
"""Optimize storage. Returns mapping from old VarIdxes to new ones."""
|
||||
|
||||
# TODO
|
||||
@ -455,6 +465,10 @@ def VarStore_optimize(self):
|
||||
row[regionIdx] += v
|
||||
row = tuple(row)
|
||||
|
||||
if use_NO_VARIATION_INDEX and not any(row):
|
||||
front_mapping[(major<<16)+minor] = None
|
||||
continue
|
||||
|
||||
encodings.add_row(row)
|
||||
front_mapping[(major<<16)+minor] = row
|
||||
|
||||
@ -537,9 +551,9 @@ def VarStore_optimize(self):
|
||||
back_mapping[item] = (major<<16)+minor
|
||||
|
||||
# Compile final mapping.
|
||||
varidx_map = {}
|
||||
varidx_map = {NO_VARIATION_INDEX:NO_VARIATION_INDEX}
|
||||
for k,v in front_mapping.items():
|
||||
varidx_map[k] = back_mapping[v]
|
||||
varidx_map[k] = back_mapping[v] if v is not None else NO_VARIATION_INDEX
|
||||
|
||||
# Remove unused regions.
|
||||
self.prune_regions()
|
||||
|
@ -360,7 +360,7 @@ class InstantiateHVARTest(object):
|
||||
assert support == pytest.approx(expectedRegion[axisTag])
|
||||
|
||||
assert len(varStore.VarData) == 1
|
||||
assert varStore.VarData[0].ItemCount == 2
|
||||
assert varStore.VarData[0].ItemCount == 1
|
||||
|
||||
assert hvar.AdvWidthMap is not None
|
||||
advWithMap = hvar.AdvWidthMap.mapping
|
||||
@ -368,9 +368,7 @@ class InstantiateHVARTest(object):
|
||||
assert advWithMap[".notdef"] == advWithMap["space"]
|
||||
varIdx = advWithMap[".notdef"]
|
||||
# these glyphs have no metrics variations in the test font
|
||||
assert varStore.VarData[varIdx >> 16].Item[varIdx & 0xFFFF] == (
|
||||
[0] * varStore.VarData[0].VarRegionCount
|
||||
)
|
||||
assert varIdx == varStore.NO_VARIATION_INDEX
|
||||
|
||||
varIdx = advWithMap["hyphen"]
|
||||
assert varStore.VarData[varIdx >> 16].Item[varIdx & 0xFFFF] == expectedDeltas
|
||||
@ -458,6 +456,8 @@ class InstantiateItemVariationStoreTest(object):
|
||||
|
||||
defaultDeltaArray = []
|
||||
for varidx, delta in sorted(defaultDeltas.items()):
|
||||
if varidx == varStore.NO_VARIATION_INDEX:
|
||||
continue
|
||||
major, minor = varidx >> 16, varidx & 0xFFFF
|
||||
if major == len(defaultDeltaArray):
|
||||
defaultDeltaArray.append([])
|
||||
|
@ -13,7 +13,7 @@ from fontTools.ttLib.tables.otTables import VarStore
|
||||
(
|
||||
[{}, {"a": 1}],
|
||||
[
|
||||
[10, 20],
|
||||
[10, 10], # Test NO_VARIATION_INDEX
|
||||
[100, 2000],
|
||||
[100, 22000],
|
||||
],
|
||||
|
Loading…
x
Reference in New Issue
Block a user