@@ -125,22 +125,31 @@ def _convert_paths_slow(ctx, paths, transforms, clip=None):
125
125
126
126
127
127
def _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.
128
134
ffi = cairo .ffi
129
135
cleaneds = [path .cleaned (transform = transform , clip = clip )
130
136
for path , transform in zip (paths , transforms )]
131
137
vertices = np .concatenate ([cleaned .vertices for cleaned in cleaneds ])
132
138
codes = np .concatenate ([cleaned .codes for cleaned in cleaneds ])
133
139
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...
136
143
if np .any (codes == Path .CURVE3 ):
137
144
raise NotImplementedError ("Quadratic Bezier curves are not supported" )
145
+
138
146
# Remove unused vertices and convert to cairo codes. Note that unlike
139
147
# cairo_close_path, we do not explicitly insert an extraneous MOVE_TO after
140
148
# CLOSE_PATH, so our resulting buffer may be smaller.
141
149
vertices = vertices [(codes != Path .STOP ) & (codes != Path .CLOSEPOLY )]
142
150
codes = codes [codes != Path .STOP ]
143
151
codes = _MPL_TO_CAIRO_PATH_TYPE [codes ]
152
+
144
153
# Where are the headers of each cairo portions?
145
154
cairo_type_sizes = _CAIRO_PATH_TYPE_SIZES [codes ]
146
155
cairo_type_positions = np .insert (np .cumsum (cairo_type_sizes ), 0 , 0 )
@@ -303,6 +312,7 @@ def _draw_paths():
303
312
return
304
313
gc_vars , rgb_fc = reuse_key
305
314
gc = copy .copy (gc0 )
315
+ # We actually need to call the setters to reset the internal state.
306
316
vars (gc ).update (gc_vars )
307
317
for k , v in gc_vars .items ():
308
318
try :
0 commit comments