Spaces:
Runtime error
Runtime error
from fontTools.pens.transformPen import TransformPen | |
from fontTools.misc import etree | |
from fontTools.misc.textTools import tostr | |
from .parser import parse_path | |
from .shapes import PathBuilder | |
__all__ = [tostr(s) for s in ("SVGPath", "parse_path")] | |
class SVGPath(object): | |
"""Parse SVG ``path`` elements from a file or string, and draw them | |
onto a glyph object that supports the FontTools Pen protocol. | |
For example, reading from an SVG file and drawing to a Defcon Glyph: | |
import defcon | |
glyph = defcon.Glyph() | |
pen = glyph.getPen() | |
svg = SVGPath("path/to/a.svg") | |
svg.draw(pen) | |
Or reading from a string containing SVG data, using the alternative | |
'fromstring' (a class method): | |
data = '<?xml version="1.0" ...' | |
svg = SVGPath.fromstring(data) | |
svg.draw(pen) | |
Both constructors can optionally take a 'transform' matrix (6-float | |
tuple, or a FontTools Transform object) to modify the draw output. | |
""" | |
def __init__(self, filename=None, transform=None): | |
if filename is None: | |
self.root = etree.ElementTree() | |
else: | |
tree = etree.parse(filename) | |
self.root = tree.getroot() | |
self.transform = transform | |
def fromstring(cls, data, transform=None): | |
self = cls(transform=transform) | |
self.root = etree.fromstring(data) | |
return self | |
def draw(self, pen): | |
if self.transform: | |
pen = TransformPen(pen, self.transform) | |
pb = PathBuilder() | |
# xpath | doesn't seem to reliable work so just walk it | |
for el in self.root.iter(): | |
pb.add_path_from_element(el) | |
original_pen = pen | |
for path, transform in zip(pb.paths, pb.transforms): | |
if transform: | |
pen = TransformPen(original_pen, transform) | |
else: | |
pen = original_pen | |
parse_path(path, pen) | |