Prune Context Format2 rules!
This commit is contained in:
parent
3108430c3c
commit
e9a3bd61eb
39
pyotlss.py
39
pyotlss.py
@ -432,10 +432,41 @@ def subset_glyphs (self, glyphs):
|
|||||||
setattr (self, c.RuleSetCount, len (rss))
|
setattr (self, c.RuleSetCount, len (rss))
|
||||||
return bool (rss)
|
return bool (rss)
|
||||||
elif self.Format == 2:
|
elif self.Format == 2:
|
||||||
# TODO Renumber classes then prune rules that can't apply
|
if not self.Coverage.subset_glyphs (glyphs):
|
||||||
# But then I first need to find fonts that use this type. D'oh!
|
return False
|
||||||
return self.Coverage.subset_glyphs (glyphs) and \
|
indices = getattr (self, c.ClassDef).intersect_glyphs (glyphs)
|
||||||
all (x.subset_glyphs (glyphs) for x in c.ContextData (self))
|
rss = getattr (self, c.ClassRuleSet)
|
||||||
|
rss = [rss[i] for i in indices]
|
||||||
|
ContextData = c.ContextData (self)
|
||||||
|
klass_maps = [x.subset_glyphs (glyphs) for x in ContextData]
|
||||||
|
for cd,m in zip (ContextData, klass_maps):
|
||||||
|
cd.remap (m)
|
||||||
|
for rs in rss:
|
||||||
|
if rs:
|
||||||
|
ss = getattr (rs, c.ClassRule)
|
||||||
|
ss = [r for r in ss \
|
||||||
|
if r and all (k in klass_map \
|
||||||
|
for klass_map,k in zip (klass_maps, c.RuleData (r, self.Format)))]
|
||||||
|
setattr (rs, c.ClassRule, ss)
|
||||||
|
setattr (rs, c.ClassRuleCount, len (ss))
|
||||||
|
|
||||||
|
# Remap rule classes
|
||||||
|
for r in ss:
|
||||||
|
# Kludge; RuleData can't be used for assignment
|
||||||
|
if c.Chain:
|
||||||
|
r.LookAhead = klass_maps[0].index (r.LookAhead)
|
||||||
|
r.Input = klass_maps[1].index (r.Input)
|
||||||
|
r.Backtrack = klass_maps[2].index (r.Backtrack)
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
r.Class = klass_maps[0].index (r.Class)
|
||||||
|
# Prune empty subrulesets
|
||||||
|
rss = [rs for rs in rss if rs and getattr (rs, c.ClassRule)]
|
||||||
|
setattr (self, c.ClassRuleSet, rss)
|
||||||
|
setattr (self, c.ClassRuleSetCount, len (rss))
|
||||||
|
return bool (rss)
|
||||||
|
|
||||||
|
return all (x.subset_glyphs (glyphs) for x in c.ContextData (self))
|
||||||
elif self.Format == 3:
|
elif self.Format == 3:
|
||||||
return all (x.subset_glyphs (glyphs) for x in c.RuleData (self, self.Format))
|
return all (x.subset_glyphs (glyphs) for x in c.RuleData (self, self.Format))
|
||||||
else:
|
else:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user