Merge pull request #2662 from fonttools/varstore-empty

[varLib.varStore] Support NO_VARIATION_INDEX
This commit is contained in:
Behdad Esfahbod 2022-06-23 12:02:00 -06:00 committed by GitHub
commit 97958a95e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 27 additions and 12 deletions

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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([])

View File

@ -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],
],