[visitor] Add register_attr(s) example
This commit is contained in:
parent
9b0d0e7b56
commit
a0686e8d2e
@ -7,7 +7,7 @@ class Visitor(object):
|
|||||||
defaultStop = False
|
defaultStop = False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def register(celf, clazzes, attrs=(None,)):
|
def _register(celf, clazzes, attrs=(None,)):
|
||||||
assert celf != Visitor, "Subclass Visitor instead."
|
assert celf != Visitor, "Subclass Visitor instead."
|
||||||
if "_visitors" not in celf.__dict__:
|
if "_visitors" not in celf.__dict__:
|
||||||
celf._visitors = {}
|
celf._visitors = {}
|
||||||
@ -34,6 +34,20 @@ class Visitor(object):
|
|||||||
|
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def register(celf, clazzes):
|
||||||
|
return celf._register(clazzes)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def register_attr(celf, clazzes, attrs):
|
||||||
|
return celf._register(clazzes, attrs)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def register_attrs(celf, clazzes_attrs):
|
||||||
|
for clazz, attrs in clazzes_attrs:
|
||||||
|
celf._register(clazz, attrs)
|
||||||
|
return lambda _: None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _visitorsFor(celf, thing, _default={}):
|
def _visitorsFor(celf, thing, _default={}):
|
||||||
typ = type(thing)
|
typ = type(thing)
|
||||||
|
@ -1,31 +1,86 @@
|
|||||||
from fontTools.misc.visitor import TTVisitor
|
from fontTools.misc.visitor import TTVisitor
|
||||||
|
import fontTools.ttLib as ttLib
|
||||||
import fontTools.ttLib.tables.otBase as otBase
|
import fontTools.ttLib.tables.otBase as otBase
|
||||||
import fontTools.ttLib.tables.otTables as otTables
|
import fontTools.ttLib.tables.otTables as otTables
|
||||||
|
|
||||||
|
|
||||||
class ScalerVisitor(TTVisitor):
|
class ScalerVisitor(TTVisitor):
|
||||||
|
|
||||||
def scale(self, v):
|
def scale(self, v):
|
||||||
return v // 2
|
return v // 2
|
||||||
|
|
||||||
|
|
||||||
|
@ScalerVisitor.register_attrs(
|
||||||
|
(
|
||||||
|
(ttLib.getTableClass("head"), ("unitsPerEm", "xMin", "yMin", "xMax", "yMax")),
|
||||||
|
(
|
||||||
|
ttLib.getTableClass("hhea"),
|
||||||
|
(
|
||||||
|
"ascent",
|
||||||
|
"descent",
|
||||||
|
"lineGap",
|
||||||
|
"advanceWidthMax",
|
||||||
|
"minLeftSideBearing",
|
||||||
|
"minRightSideBearing",
|
||||||
|
"xMaxExtent",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
ttLib.getTableClass("OS/2"),
|
||||||
|
(
|
||||||
|
"xAvgCharWidth",
|
||||||
|
"ySubscriptXSize",
|
||||||
|
"ySubscriptYSize",
|
||||||
|
"ySubscriptXOffset",
|
||||||
|
"ySubscriptYOffset",
|
||||||
|
"ySuperscriptXSize",
|
||||||
|
"ySuperscriptYSize",
|
||||||
|
"ySuperscriptXOffset",
|
||||||
|
"ySuperscriptYOffset",
|
||||||
|
"yStrikeoutSize",
|
||||||
|
"yStrikeoutSize",
|
||||||
|
"yStrikeoutPosition",
|
||||||
|
"sTypoAscender",
|
||||||
|
"sTypoDescender",
|
||||||
|
"sTypoLineGap",
|
||||||
|
"usWinAscent",
|
||||||
|
"usWinDescent",
|
||||||
|
"sxHeight",
|
||||||
|
"sCapHeight",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
def visit(visitor, obj, attr, value):
|
||||||
|
setattr(obj, attr, visitor.scale(value))
|
||||||
|
|
||||||
|
|
||||||
|
@ScalerVisitor.register_attr(ttLib.getTableClass("hmtx"), "metrics")
|
||||||
|
def visit(visitor, obj, attr, metrics):
|
||||||
|
for g in metrics:
|
||||||
|
advance, lsb = metrics[g]
|
||||||
|
metrics[g] = visitor.scale(advance), visitor.scale(lsb)
|
||||||
|
|
||||||
|
|
||||||
|
# GPOS
|
||||||
|
|
||||||
|
|
||||||
@ScalerVisitor.register(otTables.ValueRecord)
|
@ScalerVisitor.register(otTables.ValueRecord)
|
||||||
def visit(visitor, obj):
|
def visit(visitor, obj):
|
||||||
attrs = ['XAdvance', 'YAdvance', 'XPlacement', 'YPlacement']
|
attrs = ["XAdvance", "YAdvance", "XPlacement", "YPlacement"]
|
||||||
for attr in attrs:
|
for attr in attrs:
|
||||||
v = getattr(obj, attr, None)
|
v = getattr(obj, attr, None)
|
||||||
if v is not None:
|
if v is not None:
|
||||||
v = visitor.scale(v)
|
v = visitor.scale(v)
|
||||||
setattr(obj, attr, v)
|
setattr(obj, attr, v)
|
||||||
return False
|
|
||||||
|
|
||||||
@ScalerVisitor.register(otTables.Anchor)
|
@ScalerVisitor.register(otTables.Anchor)
|
||||||
def visit(visitor, obj):
|
def visit(visitor, obj):
|
||||||
attrs = ['XCoordinate', 'YCoordinate']
|
attrs = ["XCoordinate", "YCoordinate"]
|
||||||
for attr in attrs:
|
for attr in attrs:
|
||||||
v = getattr(obj, attr)
|
v = getattr(obj, attr)
|
||||||
v = visitor.scale(v)
|
v = visitor.scale(v)
|
||||||
setattr(obj, attr, v)
|
setattr(obj, attr, v)
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
from fontTools.ttLib import TTFont
|
from fontTools.ttLib import TTFont
|
||||||
|
Loading…
x
Reference in New Issue
Block a user