@@ -125,22 +125,31 @@ def _convert_paths_slow(ctx, paths, transforms, clip=None):
125125
126126
127127def _convert_paths_fast (ctx , paths , transforms , clip = None ):
128+ # We directly convert to the internal representation used by cairo, for
129+ # which ABI compatibility is guaranteed. The layout is for each item is
130+ # --CODE(4)-- -LENGTH(4)- ---------PAD(8)---------
131+ # ----------X(8)---------- ----------Y(8)----------
132+ # with the size in bytes in parentheses, and (X, Y) repeated as many times
133+ # as there are points for the current code.
128134 ffi = cairo .ffi
129135 cleaneds = [path .cleaned (transform = transform , clip = clip )
130136 for path , transform in zip (paths , transforms )]
131137 vertices = np .concatenate ([cleaned .vertices for cleaned in cleaneds ])
132138 codes = np .concatenate ([cleaned .codes for cleaned in cleaneds ])
133139
134- # TODO: Implement Bezier degree elevation formula. Note that the "slow"
135- # implementation is, in fact, also incorrect...
140+ # TODO: Implement Bezier degree elevation formula. For now, fall back to
141+ # the "slow" implementation, though note that that implementation is, in
142+ # fact, also incorrect...
136143 if np .any (codes == Path .CURVE3 ):
137144 raise NotImplementedError ("Quadratic Bezier curves are not supported" )
145+
138146 # Remove unused vertices and convert to cairo codes. Note that unlike
139147 # cairo_close_path, we do not explicitly insert an extraneous MOVE_TO after
140148 # CLOSE_PATH, so our resulting buffer may be smaller.
141149 vertices = vertices [(codes != Path .STOP ) & (codes != Path .CLOSEPOLY )]
142150 codes = codes [codes != Path .STOP ]
143151 codes = _MPL_TO_CAIRO_PATH_TYPE [codes ]
152+
144153 # Where are the headers of each cairo portions?
145154 cairo_type_sizes = _CAIRO_PATH_TYPE_SIZES [codes ]
146155 cairo_type_positions = np .insert (np .cumsum (cairo_type_sizes ), 0 , 0 )
@@ -303,6 +312,7 @@ def _draw_paths():
303312 return
304313 gc_vars , rgb_fc = reuse_key
305314 gc = copy .copy (gc0 )
315+ # We actually need to call the setters to reset the internal state.
306316 vars (gc ).update (gc_vars )
307317 for k , v in gc_vars .items ():
308318 try :
0 commit comments