[subset] Fix renumbering of (Chain)ContextFormat2

Jonathan says: "It was broken."
This commit is contained in:
Behdad Esfahbod 2013-10-14 17:49:19 +02:00
parent 3977d3e9e2
commit 98b60757ab

View File

@ -557,6 +557,7 @@ def __classify_context(self):
self.Intersect = lambda glyphs, c, r: c.intersect_class(glyphs, r) self.Intersect = lambda glyphs, c, r: c.intersect_class(glyphs, r)
self.ClassDef = 'InputClassDef' if Chain else 'ClassDef' self.ClassDef = 'InputClassDef' if Chain else 'ClassDef'
self.ClassDefIndex = 1 if Chain else 0
self.Input = 'Input' if Chain else 'Class' self.Input = 'Input' if Chain else 'Class'
if self.Format not in [1, 2, 3]: if self.Format not in [1, 2, 3]:
@ -676,12 +677,21 @@ def subset_glyphs(self, s):
elif self.Format == 2: elif self.Format == 2:
if not self.Coverage.subset(s.glyphs): if not self.Coverage.subset(s.glyphs):
return False return False
indices = getattr(self, c.ClassDef).subset(self.Coverage.glyphs,
remap=False)
rss = getattr(self, c.RuleSet)
rss = [rss[i] for i in indices]
ContextData = c.ContextData(self) ContextData = c.ContextData(self)
klass_maps = [x.subset(s.glyphs, remap=True) for x in ContextData] klass_maps = [x.subset(s.glyphs, remap=True) for x in ContextData]
# Keep rulesets for class numbers that survived.
indices = klass_maps[c.ClassDefIndex]
rss = getattr(self, c.RuleSet)
rssCount = getattr(self, c.RuleSetCount)
rss = [rss[i] for i in indices if i < rssCount]
del rssCount
# Delete, but not renumber, unreachable rulesets.
indices = getattr(self, c.ClassDef).intersect(self.Coverage.glyphs)
rss = [rss if i in indices else None for i,rss in enumerate(rss)]
while rss and rss[-1] == None:
del rss[-1]
for rs in rss: for rs in rss:
if not rs: continue if not rs: continue
ss = getattr(rs, c.Rule) ss = getattr(rs, c.Rule)
@ -695,10 +705,6 @@ def subset_glyphs(self, s):
for r in ss: for r in ss:
c.SetRuleData(r, [[klass_map.index(k) for k in klist] c.SetRuleData(r, [[klass_map.index(k) for k in klist]
for klass_map,klist in zip(klass_maps, c.RuleData(r))]) for klass_map,klist in zip(klass_maps, c.RuleData(r))])
# Prune empty subrulesets
rss = [rs for rs in rss if rs and getattr(rs, c.Rule)]
setattr(self, c.RuleSet, rss)
setattr(self, c.RuleSetCount, len(rss))
return bool(rss) return bool(rss)
elif self.Format == 3: elif self.Format == 3:
return all(x.subset(s.glyphs) for x in c.RuleData(self)) return all(x.subset(s.glyphs) for x in c.RuleData(self))