diff --git a/Lib/ufo2ft/filters/__init__.py b/Lib/ufo2ft/filters/__init__.py index e43223c98..174368e3b 100644 --- a/Lib/ufo2ft/filters/__init__.py +++ b/Lib/ufo2ft/filters/__init__.py @@ -11,6 +11,7 @@ from .decomposeTransformedComponents import DecomposeTransformedComponentsFilter from .explodeColorLayerGlyphs import ExplodeColorLayerGlyphsFilter from .flattenComponents import FlattenComponentsFilter +from .optimizeAnchors import OptimizeAnchorsFilter from .propagateAnchors import PropagateAnchorsFilter from .removeOverlaps import RemoveOverlapsFilter from .sortContours import SortContoursFilter @@ -23,6 +24,7 @@ "DecomposeTransformedComponentsFilter", "ExplodeColorLayerGlyphsFilter", "FlattenComponentsFilter", + "OptimizeAnchorsFilter", "PropagateAnchorsFilter", "RemoveOverlapsFilter", "SortContoursFilter", diff --git a/Lib/ufo2ft/filters/optimizeAnchors.py b/Lib/ufo2ft/filters/optimizeAnchors.py new file mode 100644 index 000000000..773216b8d --- /dev/null +++ b/Lib/ufo2ft/filters/optimizeAnchors.py @@ -0,0 +1,27 @@ +from ufo2ft.filters.transformations import TransformationsFilter +from fontTools.misc.transform import Identity, Transform +import logging + +log = logging.getLogger(__name__) + + +class OptimizeAnchorsFilter(TransformationsFilter): + def set_context(self, font, glyphSet): + # Skip over transformations filter to base filter + return super(TransformationsFilter, self).set_context(font, glyphSet) + + def filter(self, glyph): + if len(glyph.anchors) == 0 or any( + not (a.name.startswith("_")) for a in glyph.anchors + ): + # We're a base! + return False + + # We are a mark glyph with (at least) one attachment point. + theanchor = glyph.anchors[0] + self.context.matrix = Identity.translate(-theanchor.x, -theanchor.y) + log.warn( + "Transforming glyph %s to zero anchor %s: %s" + % (glyph.name, theanchor.name, self.context.matrix) + ) + return super().filter(glyph)