[varLib.cff] Fix merging bug when there are no blends or marking glyphs.
If the CFF2 VF has no blends, or no marking glyphs, the default variation table does not get built; this can be needed later for the PrivateDict.
This commit is contained in:
parent
a56b1af2f6
commit
ec54541e30
@ -161,7 +161,7 @@ def merge_PrivateDicts(top_dicts, vsindex_dict, var_model, fd_map):
|
||||
For each key, step through each relevant source font Private dict, and
|
||||
build a list of values to blend.
|
||||
The 'relevant' source fonts are selected by first getting the right
|
||||
submodel using model_keys[vsindex]. The indices of the
|
||||
submodel using vsindex_dict[vsindex]. The indices of the
|
||||
subModel.locations are mapped to source font list indices by
|
||||
assuming the latter order is the same as the order of the
|
||||
var_model.locations. I can then get the index of each subModel
|
||||
@ -180,7 +180,7 @@ def merge_PrivateDicts(top_dicts, vsindex_dict, var_model, fd_map):
|
||||
# At the moment, no PrivateDict has a vsindex key, but let's support
|
||||
# how it should work. See comment at end of
|
||||
# merge_charstrings() - still need to optimize use of vsindex.
|
||||
sub_model, model_keys = vsindex_dict[vsindex]
|
||||
sub_model, _ = vsindex_dict[vsindex]
|
||||
master_indices = []
|
||||
for loc in sub_model.locations[1:]:
|
||||
i = var_model.locations.index(loc) - 1
|
||||
@ -317,6 +317,19 @@ def _get_cs(charstrings, glyphName):
|
||||
return None
|
||||
return charstrings[glyphName]
|
||||
|
||||
def _add_new_vsindex(model, key, masterSupports, vsindex_dict,
|
||||
vsindex_by_key, varDataList):
|
||||
varTupleIndexes = []
|
||||
for support in model.supports[1:]:
|
||||
if support not in masterSupports:
|
||||
masterSupports.append(support)
|
||||
varTupleIndexes.append(masterSupports.index(support))
|
||||
var_data = varLib.builder.buildVarData(varTupleIndexes, None, False)
|
||||
vsindex = len(vsindex_dict)
|
||||
vsindex_by_key[key] = vsindex
|
||||
vsindex_dict[vsindex] = (model, [key])
|
||||
varDataList.append(var_data)
|
||||
return vsindex
|
||||
|
||||
def merge_charstrings(glyphOrder, num_masters, top_dicts, masterModel):
|
||||
|
||||
@ -365,24 +378,24 @@ def merge_charstrings(glyphOrder, num_masters, top_dicts, masterModel):
|
||||
|
||||
# If the charstring required a new model, create
|
||||
# a VarData table to go with, and set vsindex.
|
||||
key = tuple(v is not None for v in all_cs)
|
||||
try:
|
||||
key = tuple(v is not None for v in all_cs)
|
||||
vsindex = vsindex_by_key[key]
|
||||
except KeyError:
|
||||
varTupleIndexes = []
|
||||
for support in model.supports[1:]:
|
||||
if support not in masterSupports:
|
||||
masterSupports.append(support)
|
||||
varTupleIndexes.append(masterSupports.index(support))
|
||||
var_data = varLib.builder.buildVarData(varTupleIndexes, None, False)
|
||||
vsindex = len(vsindex_dict)
|
||||
vsindex_by_key[key] = vsindex
|
||||
vsindex_dict[vsindex] = (model, [key])
|
||||
varDataList.append(var_data)
|
||||
vsindex = _add_new_vsindex(model, key,masterSupports, vsindex_dict,
|
||||
vsindex_by_key, varDataList)
|
||||
# We do not need to check for an existing new_cs.private.vsindex,
|
||||
# as we know it doesn't exist yet.
|
||||
if vsindex != 0:
|
||||
new_cs.program[:0] = [vsindex, 'vsindex']
|
||||
|
||||
# If there is no variation in any of the charstrings, then vsindex_dict
|
||||
# never gets built. This is could still be needed if there is variation
|
||||
# in the PrivatDict, so we will build the default data for vsindex = 0.
|
||||
if not vsindex_dict:
|
||||
key = (True)*num_masters
|
||||
_add_new_vsindex(model, key, masterSupports, vsindex_dict,
|
||||
vsindex_by_key, varDataList)
|
||||
cvData = CVarData(varDataList=varDataList, masterSupports=masterSupports,
|
||||
vsindex_dict=vsindex_dict)
|
||||
# XXX To do: optimize use of vsindex between the PrivateDicts and
|
||||
|
Loading…
x
Reference in New Issue
Block a user