forked from fontra/black-renderer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpathCollector.py
More file actions
120 lines (92 loc) · 2.65 KB
/
Copy pathpathCollector.py
File metadata and controls
120 lines (92 loc) · 2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
from contextlib import contextmanager
from fontTools.misc.arrayTools import calcBounds
from fontTools.misc.transform import Identity
from fontTools.pens.recordingPen import RecordingPen
from fontTools.pens.transformPen import TransformPen
from .base import Canvas
class PathCollectorCanvas(Canvas):
def __init__(self):
self.init()
def init(self):
self.paths = []
self.currentTransform = Identity
def _addPath(self, path):
if self.currentTransform != Identity:
path = transformPath(path, self.currentTransform)
self.paths.append(path)
def newPath(self):
return RecordingPen()
@contextmanager
def savedState(self):
savedTransform = self.currentTransform
yield
self.currentTransform = savedTransform
@contextmanager
def compositeMode(self, compositeMode):
yield
def transform(self, transform):
self.currentTransform = self.currentTransform.transform(transform)
def clipPath(self, path):
pass
def drawPathSolid(self, path, color):
self._addPath(path)
def drawPathLinearGradient(
self, path, colorLine, pt1, pt2, extendMode, gradientTransform
):
self._addPath(path)
def drawPathRadialGradient(
self,
path,
colorLine,
startCenter,
startRadius,
endCenter,
endRadius,
extendMode,
gradientTransform,
):
self._addPath(path)
def drawPathSweepGradient(
self,
path,
colorLine,
center,
startAngle,
endAngle,
extendMode,
gradientTransform,
):
self._addPath(path)
class PointCollector:
def __init__(self):
self.points = []
def moveTo(self, pt):
self.points.append(pt)
def lineTo(self, pt):
self.points.append(pt)
def curveTo(self, *pts):
self.points.extend(pts)
qCurveTo = curveTo
def closePath(self):
pass
def endPath(self):
pass
class BoundsCanvas(PathCollectorCanvas):
def init(self):
self.points = []
self.currentTransform = Identity
@property
def bounds(self):
return calcBounds(self.points)
def _addPath(self, path):
points = path.points
if self.currentTransform != Identity:
points = self.currentTransform.transformPoints(points)
self.points.extend(points)
def newPath(self):
return PointCollector()
def transformPath(path, transform):
transformedPath = RecordingPen()
tpen = TransformPen(transformedPath, transform)
path.replay(tpen)
return transformedPath