@@ -167,6 +167,49 @@ def draw_path(self, gc, path, transform, rgbFace=None):
167
167
168
168
self ._fill_and_stroke (ctx , rgbFace , gc .get_alpha (), gc .get_forced_alpha ())
169
169
170
+ def draw_markers (self , gc , marker_path , marker_trans , path , transform , rgbFace = None ):
171
+ ctx = gc .ctx
172
+
173
+ ctx .new_path ()
174
+ # Create the path for the marker; it needs to be flipped here already!
175
+ self .convert_path (ctx , marker_path , marker_trans + Affine2D ().scale (1.0 , - 1.0 ))
176
+ marker_path = ctx .copy_path_flat ()
177
+
178
+ # Figure out whether the path has a fill
179
+ x1 , y1 , x2 , y2 = ctx .fill_extents ()
180
+ if x1 == 0 and y1 == 0 and x2 == 0 and y2 == 0 :
181
+ filled = False
182
+ # No fill, just unset this (so we don't try to fill it later on)
183
+ rgbFace = None
184
+ else :
185
+ filled = True
186
+
187
+ transform = transform + \
188
+ Affine2D ().scale (1.0 , - 1.0 ).translate (0 , self .height )
189
+
190
+ ctx .new_path ()
191
+ for i , (vertices , codes ) in enumerate (path .iter_segments (transform , simplify = False )):
192
+ if len (vertices ):
193
+ x , y = vertices [- 2 :]
194
+ ctx .save ()
195
+
196
+ # Translate and apply path
197
+ ctx .translate (x , y )
198
+ ctx .append_path (marker_path )
199
+
200
+ ctx .restore ()
201
+
202
+ # Slower code path if there is a fill; we need to draw
203
+ # the fill and stroke for each marker at the same time.
204
+ # Also flush out the drawing every once in a while to
205
+ # prevent the paths from getting way too long.
206
+ if filled or i % 1000 == 0 :
207
+ self ._fill_and_stroke (ctx , rgbFace , gc .get_alpha (), gc .get_forced_alpha ())
208
+
209
+ # Fast path, if there is no fill, draw everything in one step
210
+ if not filled :
211
+ self ._fill_and_stroke (ctx , rgbFace , gc .get_alpha (), gc .get_forced_alpha ())
212
+
170
213
def draw_image (self , gc , x , y , im ):
171
214
# bbox - not currently used
172
215
if _debug : print ('%s.%s()' % (self .__class__ .__name__ , _fn_name ()))
0 commit comments