[varLib.merger] Really recombine multiple PairPosFormat2 subtables...
Fixup for 49d311550c29f7501dd4bc91cb24074e3d607b77 Previous try was completely dropping the ParPosFormat2 subtables. Ouch! Fixes https://github.com/fonttools/fonttools/issues/888
This commit is contained in:
parent
e2d4fe9da8
commit
9798c30d57
@ -157,9 +157,7 @@ def _merge_GlyphOrders(font, lst, values_lst=None, default=None):
|
|||||||
for dict_set in dict_sets]
|
for dict_set in dict_sets]
|
||||||
return order, padded
|
return order, padded
|
||||||
|
|
||||||
def _Lookup_SinglePos_get_effective_value(self, glyph):
|
def _Lookup_SinglePos_get_effective_value(subtables, glyph):
|
||||||
if self is None: return None
|
|
||||||
subtables = self.SubTable
|
|
||||||
for self in subtables:
|
for self in subtables:
|
||||||
if self is None or \
|
if self is None or \
|
||||||
type(self) != ot.SinglePos or \
|
type(self) != ot.SinglePos or \
|
||||||
@ -174,9 +172,7 @@ def _Lookup_SinglePos_get_effective_value(self, glyph):
|
|||||||
assert 0
|
assert 0
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _Lookup_PairPos_get_effective_value_pair(self, firstGlyph, secondGlyph):
|
def _Lookup_PairPos_get_effective_value_pair(subtables, firstGlyph, secondGlyph):
|
||||||
if self is None: return None
|
|
||||||
subtables = self.SubTable
|
|
||||||
for self in subtables:
|
for self in subtables:
|
||||||
if self is None or \
|
if self is None or \
|
||||||
type(self) != ot.PairPos or \
|
type(self) != ot.PairPos or \
|
||||||
@ -226,7 +222,7 @@ def merge(merger, self, lst):
|
|||||||
for j,glyph in enumerate(glyphs):
|
for j,glyph in enumerate(glyphs):
|
||||||
if values[j] is not None: continue
|
if values[j] is not None: continue
|
||||||
# Fill in value from other subtables
|
# Fill in value from other subtables
|
||||||
v = _Lookup_SinglePos_get_effective_value(merger.lookups[i], glyph)
|
v = _Lookup_SinglePos_get_effective_value(merger.lookup_subtables[i], glyph)
|
||||||
if v is None:
|
if v is None:
|
||||||
v = otBase.ValueRecord(valueFormat)
|
v = otBase.ValueRecord(valueFormat)
|
||||||
values[j] = v
|
values[j] = v
|
||||||
@ -261,7 +257,7 @@ def merge(merger, self, lst):
|
|||||||
if values[j] is not None:
|
if values[j] is not None:
|
||||||
vpair = values[j]
|
vpair = values[j]
|
||||||
else:
|
else:
|
||||||
vpair = _Lookup_PairPos_get_effective_value_pair(merger.lookups[i], self._firstGlyph, glyph)
|
vpair = _Lookup_PairPos_get_effective_value_pair(merger.lookup_subtables[i], self._firstGlyph, glyph)
|
||||||
if vpair is None:
|
if vpair is None:
|
||||||
v1, v2 = None, None
|
v1, v2 = None, None
|
||||||
else:
|
else:
|
||||||
@ -376,9 +372,9 @@ def _PairPosFormat2_merge(self, lst, merger):
|
|||||||
# so in reality this might not be common.
|
# so in reality this might not be common.
|
||||||
#
|
#
|
||||||
# TODO: Remove this requirement
|
# TODO: Remove this requirement
|
||||||
for l,lookup in zip(lst,merger.lookups):
|
for l,subtables in zip(lst,merger.lookup_subtables):
|
||||||
if l.Coverage.glyphs != glyphs:
|
if l.Coverage.glyphs != glyphs:
|
||||||
assert l == lookup.SubTable[-1]
|
assert l == subtables[-1]
|
||||||
|
|
||||||
matrices = [l.Class1Record for l in lst]
|
matrices = [l.Class1Record for l in lst]
|
||||||
|
|
||||||
@ -550,7 +546,7 @@ def _Lookup_PairPosFormat2_subtables_recombine(a, b, font):
|
|||||||
for g in s:
|
for g in s:
|
||||||
classDefs[g] = i
|
classDefs[g] = i
|
||||||
|
|
||||||
records = ot.Class1Record = []
|
records = self.Class1Record = []
|
||||||
assert a.Class1Count == len(a.Class1Record)
|
assert a.Class1Count == len(a.Class1Record)
|
||||||
assert b.Class1Count == len(b.Class1Record)
|
assert b.Class1Count == len(b.Class1Record)
|
||||||
records.extend(a.Class1Record)
|
records.extend(a.Class1Record)
|
||||||
@ -559,6 +555,8 @@ def _Lookup_PairPosFormat2_subtables_recombine(a, b, font):
|
|||||||
for name in ('Class2Count', 'ClassDef2', 'ValueFormat1', 'ValueFormat2'):
|
for name in ('Class2Count', 'ClassDef2', 'ValueFormat1', 'ValueFormat2'):
|
||||||
setattr(self, name, getattr(a, name))
|
setattr(self, name, getattr(a, name))
|
||||||
|
|
||||||
|
return self
|
||||||
|
|
||||||
def _Lookup_PairPos_subtables_canonicalize(lst, font):
|
def _Lookup_PairPos_subtables_canonicalize(lst, font):
|
||||||
"""Merge multiple Format1 subtables at the beginning of lst,
|
"""Merge multiple Format1 subtables at the beginning of lst,
|
||||||
and merge multiple consecutive Format2 subtables that have the same
|
and merge multiple consecutive Format2 subtables that have the same
|
||||||
@ -591,7 +589,7 @@ def _Lookup_PairPos_subtables_canonicalize(lst, font):
|
|||||||
|
|
||||||
@AligningMerger.merger(ot.Lookup)
|
@AligningMerger.merger(ot.Lookup)
|
||||||
def merge(merger, self, lst):
|
def merge(merger, self, lst):
|
||||||
merger.lookups = lst
|
merger.lookup_subtables = [l.SubTable for l in lst]
|
||||||
|
|
||||||
exclude = []
|
exclude = []
|
||||||
if self.SubTable and isinstance(self.SubTable[0], ot.PairPos):
|
if self.SubTable and isinstance(self.SubTable[0], ot.PairPos):
|
||||||
@ -602,6 +600,7 @@ def merge(merger, self, lst):
|
|||||||
self.SubTable = _Lookup_PairPos_subtables_canonicalize(self.SubTable, merger.font)
|
self.SubTable = _Lookup_PairPos_subtables_canonicalize(self.SubTable, merger.font)
|
||||||
subtables = [_Lookup_PairPos_subtables_canonicalize(l.SubTable, merger.font) for l in lst]
|
subtables = [_Lookup_PairPos_subtables_canonicalize(l.SubTable, merger.font) for l in lst]
|
||||||
|
|
||||||
|
merger.lookup_subtables = subtables
|
||||||
merger.mergeLists(self.SubTable, subtables)
|
merger.mergeLists(self.SubTable, subtables)
|
||||||
|
|
||||||
# If format-1 subtable created during canonicalization is empty, remove it.
|
# If format-1 subtable created during canonicalization is empty, remove it.
|
||||||
@ -614,7 +613,7 @@ def merge(merger, self, lst):
|
|||||||
|
|
||||||
merger.mergeObjects(self, lst, exclude=exclude)
|
merger.mergeObjects(self, lst, exclude=exclude)
|
||||||
|
|
||||||
del merger.lookups
|
del merger.lookup_subtables
|
||||||
|
|
||||||
#
|
#
|
||||||
# InstancerMerger
|
# InstancerMerger
|
||||||
|
Loading…
x
Reference in New Issue
Block a user