@@ -167,6 +167,49 @@ def draw_path(self, gc, path, transform, rgbFace=None):
167167
168168 self ._fill_and_stroke (ctx , rgbFace , gc .get_alpha (), gc .get_forced_alpha ())
169169
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+
170213 def draw_image (self , gc , x , y , im ):
171214 # bbox - not currently used
172215 if _debug : print ('%s.%s()' % (self .__class__ .__name__ , _fn_name ()))
0 commit comments