More whitespace

This commit is contained in:
Behdad Esfahbod 2013-08-13 20:02:59 -04:00
parent e9f0b15d2e
commit 616d36e5cf

View File

@ -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]