More whitespace
This commit is contained in:
parent
e9f0b15d2e
commit
616d36e5cf
284
pyotlss.py
284
pyotlss.py
@ -1,8 +1,5 @@
|
||||
#!/usr/bin/python
|
||||
#
|
||||
# Python OpenType Layout Subsetter
|
||||
# Later grown into a full OpenType subsetter...
|
||||
#
|
||||
|
||||
# Copyright 2013 Google, Inc. All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0(the "License");
|
||||
@ -18,7 +15,12 @@
|
||||
# limitations under the License.
|
||||
#
|
||||
# Google Author(s): Behdad Esfahbod
|
||||
#
|
||||
|
||||
"""Python OpenType Layout Subsetter.
|
||||
|
||||
Later grown into full OpenType subsetter, supporting all standard tables.
|
||||
"""
|
||||
|
||||
|
||||
# Try running on PyPy
|
||||
try:
|
||||
@ -30,9 +32,9 @@ import fontTools.ttx
|
||||
import struct
|
||||
|
||||
|
||||
def add_method(*clazzes):
|
||||
"""A decorator-returning function to add a new method to one or
|
||||
more classes."""
|
||||
def __add_method(*clazzes):
|
||||
"""Returns a decorator function that adds a new method to one or
|
||||
more classes."""
|
||||
def wrapper(method):
|
||||
for clazz in clazzes:
|
||||
assert clazz.__name__ != 'DefaultTable', 'Oops, table class not found.'
|
||||
@ -44,36 +46,36 @@ def unique_sorted(l):
|
||||
return sorted(set(l))
|
||||
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.Coverage)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.Coverage)
|
||||
def intersect(self, glyphs):
|
||||
"Returns ascending list of matching coverage values."
|
||||
return [i for(i,g) in enumerate(self.glyphs) if g in glyphs]
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.Coverage)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.Coverage)
|
||||
def intersect_glyphs(self, glyphs):
|
||||
"Returns set of intersecting glyphs."
|
||||
return set(g for g in self.glyphs if g in glyphs)
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.Coverage)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.Coverage)
|
||||
def subset(self, glyphs):
|
||||
"Returns ascending list of remaining coverage values."
|
||||
indices = self.intersect(glyphs)
|
||||
self.glyphs = [g for g in self.glyphs if g in glyphs]
|
||||
return indices
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.Coverage)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.Coverage)
|
||||
def remap(self, coverage_map):
|
||||
"Remaps coverage."
|
||||
self.glyphs = [self.glyphs[i] for i in coverage_map]
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ClassDef)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ClassDef)
|
||||
def intersect(self, glyphs):
|
||||
"Returns ascending list of matching class values."
|
||||
return unique_sorted(
|
||||
([0] if any(g not in self.classDefs for g in glyphs) else []) +
|
||||
[v for g,v in self.classDefs.iteritems() if g in glyphs])
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ClassDef)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ClassDef)
|
||||
def intersect_class(self, glyphs, klass):
|
||||
"Returns set of glyphs matching class."
|
||||
if klass == 0:
|
||||
@ -81,7 +83,7 @@ def intersect_class(self, glyphs, klass):
|
||||
return set(g for g,v in self.classDefs.iteritems()
|
||||
if v == klass and g in glyphs)
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ClassDef)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ClassDef)
|
||||
def subset(self, glyphs, remap=False):
|
||||
"Returns ascending list of remaining classes."
|
||||
self.classDefs = {g:v for g,v in self.classDefs.iteritems() if g in glyphs}
|
||||
@ -94,13 +96,13 @@ def subset(self, glyphs, remap=False):
|
||||
self.remap(indices)
|
||||
return indices
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ClassDef)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ClassDef)
|
||||
def remap(self, class_map):
|
||||
"Remaps classes."
|
||||
self.classDefs = {g:class_map.index(v)
|
||||
for g,v in self.classDefs.iteritems()}
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.SingleSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.SingleSubst)
|
||||
def closure_glyphs(self, s, cur_glyphs=None):
|
||||
if cur_glyphs == None: cur_glyphs = s.glyphs
|
||||
if self.Format in [1, 2]:
|
||||
@ -108,7 +110,7 @@ def closure_glyphs(self, s, cur_glyphs=None):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.SingleSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.SingleSubst)
|
||||
def subset_glyphs(self, s):
|
||||
if self.Format in [1, 2]:
|
||||
self.mapping = {g:v for g,v in self.mapping.iteritems()
|
||||
@ -117,7 +119,7 @@ def subset_glyphs(self, s):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.MultipleSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.MultipleSubst)
|
||||
def closure_glyphs(self, s, cur_glyphs=None):
|
||||
if cur_glyphs == None: cur_glyphs = s.glyphs
|
||||
if self.Format == 1:
|
||||
@ -126,7 +128,7 @@ def closure_glyphs(self, s, cur_glyphs=None):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.MultipleSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.MultipleSubst)
|
||||
def subset_glyphs(self, s):
|
||||
if self.Format == 1:
|
||||
indices = self.Coverage.subset(s.glyphs)
|
||||
@ -141,7 +143,7 @@ def subset_glyphs(self, s):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.AlternateSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.AlternateSubst)
|
||||
def closure_glyphs(self, s, cur_glyphs=None):
|
||||
if cur_glyphs == None: cur_glyphs = s.glyphs
|
||||
if self.Format == 1:
|
||||
@ -150,7 +152,7 @@ def closure_glyphs(self, s, cur_glyphs=None):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.AlternateSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.AlternateSubst)
|
||||
def subset_glyphs(self, s):
|
||||
if self.Format == 1:
|
||||
self.alternates = {g:vlist for g,vlist in self.alternates.iteritems()
|
||||
@ -159,7 +161,7 @@ def subset_glyphs(self, s):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.LigatureSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.LigatureSubst)
|
||||
def closure_glyphs(self, s, cur_glyphs=None):
|
||||
if cur_glyphs == None: cur_glyphs = s.glyphs
|
||||
if self.Format == 1:
|
||||
@ -170,7 +172,7 @@ def closure_glyphs(self, s, cur_glyphs=None):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.LigatureSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.LigatureSubst)
|
||||
def subset_glyphs(self, s):
|
||||
if self.Format == 1:
|
||||
self.ligatures = {g:v for g,v in self.ligatures.iteritems()
|
||||
@ -184,7 +186,7 @@ def subset_glyphs(self, s):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ReverseChainSingleSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ReverseChainSingleSubst)
|
||||
def closure_glyphs(self, s, cur_glyphs=None):
|
||||
if cur_glyphs == None: cur_glyphs = s.glyphs
|
||||
if self.Format == 1:
|
||||
@ -197,7 +199,7 @@ def closure_glyphs(self, s, cur_glyphs=None):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ReverseChainSingleSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ReverseChainSingleSubst)
|
||||
def subset_glyphs(self, s):
|
||||
if self.Format == 1:
|
||||
indices = self.Coverage.subset(s.glyphs)
|
||||
@ -214,7 +216,7 @@ def subset_glyphs(self, s):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.SinglePos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.SinglePos)
|
||||
def subset_glyphs(self, s):
|
||||
if self.Format == 1:
|
||||
return len(self.Coverage.subset(s.glyphs))
|
||||
@ -226,7 +228,7 @@ def subset_glyphs(self, s):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.PairPos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.PairPos)
|
||||
def subset_glyphs(self, s):
|
||||
if self.Format == 1:
|
||||
indices = self.Coverage.subset(s.glyphs)
|
||||
@ -252,7 +254,7 @@ def subset_glyphs(self, s):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.CursivePos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.CursivePos)
|
||||
def subset_glyphs(self, s):
|
||||
if self.Format == 1:
|
||||
indices = self.Coverage.subset(s.glyphs)
|
||||
@ -262,7 +264,7 @@ def subset_glyphs(self, s):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.MarkBasePos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.MarkBasePos)
|
||||
def subset_glyphs(self, s):
|
||||
if self.Format == 1:
|
||||
mark_indices = self.MarkCoverage.subset(s.glyphs)
|
||||
@ -286,7 +288,7 @@ def subset_glyphs(self, s):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.MarkLigPos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.MarkLigPos)
|
||||
def subset_glyphs(self, s):
|
||||
if self.Format == 1:
|
||||
mark_indices = self.MarkCoverage.subset(s.glyphs)
|
||||
@ -311,7 +313,7 @@ def subset_glyphs(self, s):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.MarkMarkPos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.MarkMarkPos)
|
||||
def subset_glyphs(self, s):
|
||||
if self.Format == 1:
|
||||
mark1_indices = self.Mark1Coverage.subset(s.glyphs)
|
||||
@ -335,51 +337,51 @@ def subset_glyphs(self, s):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.SingleSubst,
|
||||
fontTools.ttLib.tables.otTables.MultipleSubst,
|
||||
fontTools.ttLib.tables.otTables.AlternateSubst,
|
||||
fontTools.ttLib.tables.otTables.LigatureSubst,
|
||||
fontTools.ttLib.tables.otTables.ReverseChainSingleSubst,
|
||||
fontTools.ttLib.tables.otTables.SinglePos,
|
||||
fontTools.ttLib.tables.otTables.PairPos,
|
||||
fontTools.ttLib.tables.otTables.CursivePos,
|
||||
fontTools.ttLib.tables.otTables.MarkBasePos,
|
||||
fontTools.ttLib.tables.otTables.MarkLigPos,
|
||||
fontTools.ttLib.tables.otTables.MarkMarkPos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.SingleSubst,
|
||||
fontTools.ttLib.tables.otTables.MultipleSubst,
|
||||
fontTools.ttLib.tables.otTables.AlternateSubst,
|
||||
fontTools.ttLib.tables.otTables.LigatureSubst,
|
||||
fontTools.ttLib.tables.otTables.ReverseChainSingleSubst,
|
||||
fontTools.ttLib.tables.otTables.SinglePos,
|
||||
fontTools.ttLib.tables.otTables.PairPos,
|
||||
fontTools.ttLib.tables.otTables.CursivePos,
|
||||
fontTools.ttLib.tables.otTables.MarkBasePos,
|
||||
fontTools.ttLib.tables.otTables.MarkLigPos,
|
||||
fontTools.ttLib.tables.otTables.MarkMarkPos)
|
||||
def subset_lookups(self, lookup_indices):
|
||||
pass
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.SingleSubst,
|
||||
fontTools.ttLib.tables.otTables.MultipleSubst,
|
||||
fontTools.ttLib.tables.otTables.AlternateSubst,
|
||||
fontTools.ttLib.tables.otTables.LigatureSubst,
|
||||
fontTools.ttLib.tables.otTables.ReverseChainSingleSubst,
|
||||
fontTools.ttLib.tables.otTables.SinglePos,
|
||||
fontTools.ttLib.tables.otTables.PairPos,
|
||||
fontTools.ttLib.tables.otTables.CursivePos,
|
||||
fontTools.ttLib.tables.otTables.MarkBasePos,
|
||||
fontTools.ttLib.tables.otTables.MarkLigPos,
|
||||
fontTools.ttLib.tables.otTables.MarkMarkPos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.SingleSubst,
|
||||
fontTools.ttLib.tables.otTables.MultipleSubst,
|
||||
fontTools.ttLib.tables.otTables.AlternateSubst,
|
||||
fontTools.ttLib.tables.otTables.LigatureSubst,
|
||||
fontTools.ttLib.tables.otTables.ReverseChainSingleSubst,
|
||||
fontTools.ttLib.tables.otTables.SinglePos,
|
||||
fontTools.ttLib.tables.otTables.PairPos,
|
||||
fontTools.ttLib.tables.otTables.CursivePos,
|
||||
fontTools.ttLib.tables.otTables.MarkBasePos,
|
||||
fontTools.ttLib.tables.otTables.MarkLigPos,
|
||||
fontTools.ttLib.tables.otTables.MarkMarkPos)
|
||||
def collect_lookups(self):
|
||||
return []
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.SingleSubst,
|
||||
fontTools.ttLib.tables.otTables.AlternateSubst,
|
||||
fontTools.ttLib.tables.otTables.ReverseChainSingleSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.SingleSubst,
|
||||
fontTools.ttLib.tables.otTables.AlternateSubst,
|
||||
fontTools.ttLib.tables.otTables.ReverseChainSingleSubst)
|
||||
def may_have_non_1to1(self):
|
||||
return False
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.MultipleSubst,
|
||||
fontTools.ttLib.tables.otTables.LigatureSubst,
|
||||
fontTools.ttLib.tables.otTables.ContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ChainContextSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.MultipleSubst,
|
||||
fontTools.ttLib.tables.otTables.LigatureSubst,
|
||||
fontTools.ttLib.tables.otTables.ContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ChainContextSubst)
|
||||
def may_have_non_1to1(self):
|
||||
return True
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ChainContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ContextPos,
|
||||
fontTools.ttLib.tables.otTables.ChainContextPos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ChainContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ContextPos,
|
||||
fontTools.ttLib.tables.otTables.ChainContextPos)
|
||||
def __classify_context(self):
|
||||
|
||||
class ContextHelper:
|
||||
@ -472,8 +474,8 @@ def __classify_context(self):
|
||||
self.__class__.__ContextHelpers[self.Format] = helper
|
||||
return self.__class__.__ContextHelpers[self.Format]
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ChainContextSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ChainContextSubst)
|
||||
def closure_glyphs(self, s, cur_glyphs=None):
|
||||
if cur_glyphs == None: cur_glyphs = s.glyphs
|
||||
c = self.__classify_context()
|
||||
@ -553,10 +555,10 @@ def closure_glyphs(self, s, cur_glyphs=None):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ContextPos,
|
||||
fontTools.ttLib.tables.otTables.ChainContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ChainContextPos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ContextPos,
|
||||
fontTools.ttLib.tables.otTables.ChainContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ChainContextPos)
|
||||
def subset_glyphs(self, s):
|
||||
c = self.__classify_context()
|
||||
|
||||
@ -609,10 +611,10 @@ def subset_glyphs(self, s):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ChainContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ContextPos,
|
||||
fontTools.ttLib.tables.otTables.ChainContextPos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ChainContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ContextPos,
|
||||
fontTools.ttLib.tables.otTables.ChainContextPos)
|
||||
def subset_lookups(self, lookup_indices):
|
||||
c = self.__classify_context()
|
||||
|
||||
@ -637,10 +639,10 @@ def subset_lookups(self, lookup_indices):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ChainContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ContextPos,
|
||||
fontTools.ttLib.tables.otTables.ChainContextPos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ChainContextSubst,
|
||||
fontTools.ttLib.tables.otTables.ContextPos,
|
||||
fontTools.ttLib.tables.otTables.ChainContextPos)
|
||||
def collect_lookups(self):
|
||||
c = self.__classify_context()
|
||||
|
||||
@ -655,76 +657,76 @@ def collect_lookups(self):
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ExtensionSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ExtensionSubst)
|
||||
def closure_glyphs(self, s, cur_glyphs=None):
|
||||
if self.Format == 1:
|
||||
self.ExtSubTable.closure_glyphs(s, cur_glyphs)
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ExtensionSubst)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ExtensionSubst)
|
||||
def may_have_non_1to1(self):
|
||||
if self.Format == 1:
|
||||
return self.ExtSubTable.may_have_non_1to1()
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ExtensionSubst,
|
||||
fontTools.ttLib.tables.otTables.ExtensionPos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ExtensionSubst,
|
||||
fontTools.ttLib.tables.otTables.ExtensionPos)
|
||||
def subset_glyphs(self, s):
|
||||
if self.Format == 1:
|
||||
return self.ExtSubTable.subset_glyphs(s)
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ExtensionSubst,
|
||||
fontTools.ttLib.tables.otTables.ExtensionPos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ExtensionSubst,
|
||||
fontTools.ttLib.tables.otTables.ExtensionPos)
|
||||
def subset_lookups(self, lookup_indices):
|
||||
if self.Format == 1:
|
||||
return self.ExtSubTable.subset_lookups(lookup_indices)
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ExtensionSubst,
|
||||
fontTools.ttLib.tables.otTables.ExtensionPos)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ExtensionSubst,
|
||||
fontTools.ttLib.tables.otTables.ExtensionPos)
|
||||
def collect_lookups(self):
|
||||
if self.Format == 1:
|
||||
return self.ExtSubTable.collect_lookups()
|
||||
else:
|
||||
assert 0, "unknown format: %s" % self.Format
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.Lookup)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.Lookup)
|
||||
def closure_glyphs(self, s, cur_glyphs=None):
|
||||
for st in self.SubTable:
|
||||
if not st: continue
|
||||
st.closure_glyphs(s, cur_glyphs)
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.Lookup)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.Lookup)
|
||||
def subset_glyphs(self, s):
|
||||
self.SubTable = [st for st in self.SubTable if st and st.subset_glyphs(s)]
|
||||
self.SubTableCount = len(self.SubTable)
|
||||
return bool(self.SubTableCount)
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.Lookup)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.Lookup)
|
||||
def subset_lookups(self, lookup_indices):
|
||||
for s in self.SubTable:
|
||||
s.subset_lookups(lookup_indices)
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.Lookup)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.Lookup)
|
||||
def collect_lookups(self):
|
||||
return unique_sorted(sum((st.collect_lookups() for st in self.SubTable
|
||||
if st), []))
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.Lookup)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.Lookup)
|
||||
def may_have_non_1to1(self):
|
||||
return any(st.may_have_non_1to1() for st in self.SubTable if st)
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.LookupList)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.LookupList)
|
||||
def subset_glyphs(self, s):
|
||||
"Returns the indices of nonempty lookups."
|
||||
return [i for(i,l) in enumerate(self.Lookup) if l and l.subset_glyphs(s)]
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.LookupList)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.LookupList)
|
||||
def subset_lookups(self, lookup_indices):
|
||||
self.Lookup = [self.Lookup[i] for i in lookup_indices
|
||||
if i < self.LookupCount]
|
||||
@ -732,7 +734,7 @@ def subset_lookups(self, lookup_indices):
|
||||
for l in self.Lookup:
|
||||
l.subset_lookups(lookup_indices)
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.LookupList)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.LookupList)
|
||||
def closure_lookups(self, lookup_indices):
|
||||
lookup_indices = unique_sorted(lookup_indices)
|
||||
recurse = lookup_indices
|
||||
@ -747,7 +749,7 @@ def closure_lookups(self, lookup_indices):
|
||||
lookup_indices.extend(recurse_lookups)
|
||||
recurse = recurse_lookups
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.Feature)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.Feature)
|
||||
def subset_lookups(self, lookup_indices):
|
||||
self.LookupListIndex = [l for l in self.LookupListIndex
|
||||
if l in lookup_indices]
|
||||
@ -757,11 +759,11 @@ def subset_lookups(self, lookup_indices):
|
||||
self.LookupCount = len(self.LookupListIndex)
|
||||
return self.LookupCount
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.Feature)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.Feature)
|
||||
def collect_lookups(self):
|
||||
return self.LookupListIndex[:]
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.FeatureList)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.FeatureList)
|
||||
def subset_lookups(self, lookup_indices):
|
||||
"Returns the indices of nonempty features."
|
||||
feature_indices = [i for(i,f) in enumerate(self.FeatureRecord)
|
||||
@ -769,20 +771,20 @@ def subset_lookups(self, lookup_indices):
|
||||
self.subset_features(feature_indices)
|
||||
return feature_indices
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.FeatureList)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.FeatureList)
|
||||
def collect_lookups(self, feature_indices):
|
||||
return unique_sorted(sum((self.FeatureRecord[i].Feature.collect_lookups()
|
||||
for i in feature_indices
|
||||
if i < self.FeatureCount), []))
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.FeatureList)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.FeatureList)
|
||||
def subset_features(self, feature_indices):
|
||||
self.FeatureRecord = [self.FeatureRecord[i] for i in feature_indices]
|
||||
self.FeatureCount = len(self.FeatureRecord)
|
||||
return bool(self.FeatureCount)
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.DefaultLangSys,
|
||||
fontTools.ttLib.tables.otTables.LangSys)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.DefaultLangSys,
|
||||
fontTools.ttLib.tables.otTables.LangSys)
|
||||
def subset_features(self, feature_indices):
|
||||
if self.ReqFeatureIndex in feature_indices:
|
||||
self.ReqFeatureIndex = feature_indices.index(self.ReqFeatureIndex)
|
||||
@ -795,15 +797,15 @@ def subset_features(self, feature_indices):
|
||||
self.FeatureCount = len(self.FeatureIndex)
|
||||
return bool(self.FeatureCount or self.ReqFeatureIndex != 65535)
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.DefaultLangSys,
|
||||
fontTools.ttLib.tables.otTables.LangSys)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.DefaultLangSys,
|
||||
fontTools.ttLib.tables.otTables.LangSys)
|
||||
def collect_features(self):
|
||||
feature_indices = self.FeatureIndex[:]
|
||||
if self.ReqFeatureIndex != 65535:
|
||||
feature_indices.append(self.ReqFeatureIndex)
|
||||
return unique_sorted(feature_indices)
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.Script)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.Script)
|
||||
def subset_features(self, feature_indices):
|
||||
if(self.DefaultLangSys and
|
||||
not self.DefaultLangSys.subset_features(feature_indices)):
|
||||
@ -813,26 +815,26 @@ def subset_features(self, feature_indices):
|
||||
self.LangSysCount = len(self.LangSysRecord)
|
||||
return bool(self.LangSysCount or self.DefaultLangSys)
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.Script)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.Script)
|
||||
def collect_features(self):
|
||||
feature_indices = [l.LangSys.collect_features() for l in self.LangSysRecord]
|
||||
if self.DefaultLangSys:
|
||||
feature_indices.append(self.DefaultLangSys.collect_features())
|
||||
return unique_sorted(sum(feature_indices, []))
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ScriptList)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ScriptList)
|
||||
def subset_features(self, feature_indices):
|
||||
self.ScriptRecord = [s for s in self.ScriptRecord
|
||||
if s.Script.subset_features(feature_indices)]
|
||||
self.ScriptCount = len(self.ScriptRecord)
|
||||
return bool(self.ScriptCount)
|
||||
|
||||
@add_method(fontTools.ttLib.tables.otTables.ScriptList)
|
||||
@__add_method(fontTools.ttLib.tables.otTables.ScriptList)
|
||||
def collect_features(self):
|
||||
return unique_sorted(sum((s.Script.collect_features()
|
||||
for s in self.ScriptRecord), []))
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('GSUB'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('GSUB'))
|
||||
def closure_glyphs(self, s):
|
||||
s.table = self.table
|
||||
feature_indices = self.table.ScriptList.collect_features()
|
||||
@ -847,8 +849,8 @@ def closure_glyphs(self, s):
|
||||
break
|
||||
del s.table
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('GSUB'),
|
||||
fontTools.ttLib.getTableClass('GPOS'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('GSUB'),
|
||||
fontTools.ttLib.getTableClass('GPOS'))
|
||||
def subset_glyphs(self, s):
|
||||
s.glyphs = s.glyphs_gsubed
|
||||
lookup_indices = self.table.LookupList.subset_glyphs(s)
|
||||
@ -856,8 +858,8 @@ def subset_glyphs(self, s):
|
||||
self.prune_lookups()
|
||||
return True
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('GSUB'),
|
||||
fontTools.ttLib.getTableClass('GPOS'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('GSUB'),
|
||||
fontTools.ttLib.getTableClass('GPOS'))
|
||||
def subset_lookups(self, lookup_indices):
|
||||
"""Retrains specified lookups, then removes empty features, language
|
||||
systems, and scripts."""
|
||||
@ -865,8 +867,8 @@ def subset_lookups(self, lookup_indices):
|
||||
feature_indices = self.table.FeatureList.subset_lookups(lookup_indices)
|
||||
self.table.ScriptList.subset_features(feature_indices)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('GSUB'),
|
||||
fontTools.ttLib.getTableClass('GPOS'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('GSUB'),
|
||||
fontTools.ttLib.getTableClass('GPOS'))
|
||||
def prune_lookups(self):
|
||||
"Remove unreferenced lookups"
|
||||
feature_indices = self.table.ScriptList.collect_features()
|
||||
@ -874,8 +876,8 @@ def prune_lookups(self):
|
||||
lookup_indices = self.table.LookupList.closure_lookups(lookup_indices)
|
||||
self.subset_lookups(lookup_indices)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('GSUB'),
|
||||
fontTools.ttLib.getTableClass('GPOS'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('GSUB'),
|
||||
fontTools.ttLib.getTableClass('GPOS'))
|
||||
def subset_feature_tags(self, feature_tags):
|
||||
feature_indices = [i for(i,f) in
|
||||
enumerate(self.table.FeatureList.FeatureRecord)
|
||||
@ -883,15 +885,15 @@ def subset_feature_tags(self, feature_tags):
|
||||
self.table.FeatureList.subset_features(feature_indices)
|
||||
self.table.ScriptList.subset_features(feature_indices)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('GSUB'),
|
||||
fontTools.ttLib.getTableClass('GPOS'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('GSUB'),
|
||||
fontTools.ttLib.getTableClass('GPOS'))
|
||||
def prune_pre_subset(self, options):
|
||||
if options.layout_features and '*' not in options.layout_features:
|
||||
self.subset_feature_tags(options.layout_features)
|
||||
self.prune_lookups()
|
||||
return True
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('GDEF'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('GDEF'))
|
||||
def subset_glyphs(self, s):
|
||||
glyphs = s.glyphs_gsubed
|
||||
table = self.table
|
||||
@ -926,13 +928,13 @@ def subset_glyphs(self, s):
|
||||
table.GlyphClassDef or
|
||||
table.AttachList)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('kern'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('kern'))
|
||||
def prune_pre_subset(self, options):
|
||||
# Prune unknown kern table types
|
||||
self.kernTables = [t for t in self.kernTables if hasattr(t, 'kernTable')]
|
||||
return bool(self.kernTables)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('kern'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('kern'))
|
||||
def subset_glyphs(self, s):
|
||||
glyphs = s.glyphs_gsubed
|
||||
for t in self.kernTables:
|
||||
@ -941,32 +943,32 @@ def subset_glyphs(self, s):
|
||||
self.kernTables = [t for t in self.kernTables if t.kernTable]
|
||||
return bool(self.kernTables)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('hmtx'),
|
||||
fontTools.ttLib.getTableClass('vmtx'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('hmtx'),
|
||||
fontTools.ttLib.getTableClass('vmtx'))
|
||||
def subset_glyphs(self, s):
|
||||
self.metrics = {g:v for g,v in self.metrics.iteritems() if g in s.glyphs}
|
||||
return bool(self.metrics)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('hdmx'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('hdmx'))
|
||||
def subset_glyphs(self, s):
|
||||
self.hdmx = {sz:{g:v for g,v in l.iteritems() if g in s.glyphs}
|
||||
for(sz,l) in self.hdmx.iteritems()}
|
||||
return bool(self.hdmx)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('VORG'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('VORG'))
|
||||
def subset_glyphs(self, s):
|
||||
self.VOriginRecords = {g:v for g,v in self.VOriginRecords.iteritems()
|
||||
if g in s.glyphs}
|
||||
self.numVertOriginYMetrics = len(self.VOriginRecords)
|
||||
return True # Never drop; has default metrics
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('post'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('post'))
|
||||
def prune_pre_subset(self, options):
|
||||
if not options.glyph_names:
|
||||
self.formatType = 3.0
|
||||
return True
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('post'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('post'))
|
||||
def subset_glyphs(self, s):
|
||||
self.extraNames = [] # This seems to do it
|
||||
return True
|
||||
@ -986,7 +988,7 @@ OVERLAP_COMPOUND = 0x0400 # used by Apple in GX fonts
|
||||
SCALED_COMPONENT_OFFSET = 0x0800 # composite designed to have the component offset scaled(designed for Apple)
|
||||
UNSCALED_COMPONENT_OFFSET = 0x1000 # composite designed not to have the component offset scaled(designed for MS)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableModule('glyf').Glyph)
|
||||
@__add_method(fontTools.ttLib.getTableModule('glyf').Glyph)
|
||||
def getComponentNamesFast(self, glyfTable):
|
||||
if struct.unpack(">h", self.data[:2])[0] >= 0:
|
||||
return [] # Not composite
|
||||
@ -1008,7 +1010,7 @@ def getComponentNamesFast(self, glyfTable):
|
||||
more = flags & MORE_COMPONENTS
|
||||
return components
|
||||
|
||||
@add_method(fontTools.ttLib.getTableModule('glyf').Glyph)
|
||||
@__add_method(fontTools.ttLib.getTableModule('glyf').Glyph)
|
||||
def remapComponentsFast(self, indices):
|
||||
if struct.unpack(">h", self.data[:2])[0] >= 0:
|
||||
return # Not composite
|
||||
@ -1033,7 +1035,7 @@ def remapComponentsFast(self, indices):
|
||||
more = flags & MORE_COMPONENTS
|
||||
self.data = str(data)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableModule('glyf').Glyph)
|
||||
@__add_method(fontTools.ttLib.getTableModule('glyf').Glyph)
|
||||
def dropInstructionsFast(self):
|
||||
numContours = struct.unpack(">h", self.data[:2])[0]
|
||||
data = bytearray(self.data)
|
||||
@ -1073,7 +1075,7 @@ def dropInstructionsFast(self):
|
||||
data.append(0)
|
||||
self.data = str(data)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('glyf'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('glyf'))
|
||||
def closure_glyphs(self, s):
|
||||
decompose = s.glyphs
|
||||
# I don't know if component glyphs can be composite themselves.
|
||||
@ -1100,7 +1102,7 @@ def closure_glyphs(self, s):
|
||||
decompose = components
|
||||
s.glyphs.update(components)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('glyf'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('glyf'))
|
||||
def subset_glyphs(self, s):
|
||||
self.glyphs = {g:v for g,v in self.glyphs.iteritems() if g in s.glyphs}
|
||||
indices = [i for i,g in enumerate(self.glyphOrder) if g in s.glyphs]
|
||||
@ -1112,7 +1114,7 @@ def subset_glyphs(self, s):
|
||||
self.glyphOrder = [g for g in self.glyphOrder if g in s.glyphs]
|
||||
return bool(self.glyphs)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('glyf'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('glyf'))
|
||||
def prune_post_subset(self, options):
|
||||
if not options.hinting:
|
||||
for v in self.glyphs.itervalues():
|
||||
@ -1123,14 +1125,14 @@ def prune_post_subset(self, options):
|
||||
v.program.fromBytecode([])
|
||||
return True
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('CFF '))
|
||||
@__add_method(fontTools.ttLib.getTableClass('CFF '))
|
||||
def prune_pre_subset(self, s):
|
||||
cff = self.cff
|
||||
# CFF table should have one font only
|
||||
cff.fontNames = cff.fontNames[:1]
|
||||
return bool(cff.fontNames)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('CFF '))
|
||||
@__add_method(fontTools.ttLib.getTableClass('CFF '))
|
||||
def subset_glyphs(self, s):
|
||||
cff = self.cff
|
||||
for fontname in cff.keys():
|
||||
@ -1160,13 +1162,13 @@ def subset_glyphs(self, s):
|
||||
font.numGlyphs = len(font.charset)
|
||||
return any(cff[fontname].numGlyphs for fontname in cff.keys())
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('glyf'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('glyf'))
|
||||
def prune_post_subset(self, options):
|
||||
if not options.hinting:
|
||||
pass # Drop hints
|
||||
return True
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('cmap'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('cmap'))
|
||||
def closure_glyphs(self, s):
|
||||
tables = [t for t in self.tables
|
||||
if t.platformID == 3 and t.platEncID in [1, 10]]
|
||||
@ -1180,7 +1182,7 @@ def closure_glyphs(self, s):
|
||||
if not found:
|
||||
s.log("No glyph for Unicode value %s; skipping." % u)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('cmap'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('cmap'))
|
||||
def prune_pre_subset(self, options):
|
||||
if not options.legacy_cmap:
|
||||
# Drop non-Unicode / non-Symbol cmaps
|
||||
@ -1194,7 +1196,7 @@ def prune_pre_subset(self, options):
|
||||
self.tables = [t for t in self.tables if t.format != 0]
|
||||
return bool(self.tables)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('cmap'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('cmap'))
|
||||
def subset_glyphs(self, s):
|
||||
s.glyphs = s.glyphs_cmaped
|
||||
for t in self.tables:
|
||||
@ -1220,7 +1222,7 @@ def subset_glyphs(self, s):
|
||||
# to format=4 if there's not one.
|
||||
return bool(self.tables)
|
||||
|
||||
@add_method(fontTools.ttLib.getTableClass('name'))
|
||||
@__add_method(fontTools.ttLib.getTableClass('name'))
|
||||
def prune_pre_subset(self, options):
|
||||
if '*' not in options.name_IDs:
|
||||
self.names = [n for n in self.names if n.nameID in options.name_IDs]
|
||||
|
Loading…
x
Reference in New Issue
Block a user