@@ -122,22 +122,31 @@ def _convert_paths_slow(ctx, paths, transforms, clip=None):
122
122
123
123
124
124
def _convert_paths_fast (ctx , paths , transforms , clip = None ):
125
+ # We directly convert to the internal representation used by cairo, for
126
+ # which ABI compatibility is guaranteed. The layout is for each item is
127
+ # --CODE(4)-- -LENGTH(4)- ---------PAD(8)---------
128
+ # ----------X(8)---------- ----------Y(8)----------
129
+ # with the size in bytes in parentheses, and (X, Y) repeated as many times
130
+ # as there are points for the current code.
125
131
ffi = cairo .ffi
126
132
cleaneds = [path .cleaned (transform = transform , clip = clip )
127
133
for path , transform in zip (paths , transforms )]
128
134
vertices = np .concatenate ([cleaned .vertices for cleaned in cleaneds ])
129
135
codes = np .concatenate ([cleaned .codes for cleaned in cleaneds ])
130
136
131
- # TODO: Implement Bezier degree elevation formula. Note that the "slow"
132
- # implementation is, in fact, also incorrect...
137
+ # TODO: Implement Bezier degree elevation formula. For now, fall back to
138
+ # the "slow" implementation, though note that that implementation is, in
139
+ # fact, also incorrect...
133
140
if np .any (codes == Path .CURVE3 ):
134
141
raise NotImplementedError ("Quadratic Bezier curves are not supported" )
142
+
135
143
# Remove unused vertices and convert to cairo codes. Note that unlike
136
144
# cairo_close_path, we do not explicitly insert an extraneous MOVE_TO after
137
145
# CLOSE_PATH, so our resulting buffer may be smaller.
138
146
vertices = vertices [(codes != Path .STOP ) & (codes != Path .CLOSEPOLY )]
139
147
codes = codes [codes != Path .STOP ]
140
148
codes = _MPL_TO_CAIRO_PATH_TYPE [codes ]
149
+
141
150
# Where are the headers of each cairo portions?
142
151
cairo_type_sizes = _CAIRO_PATH_TYPE_SIZES [codes ]
143
152
cairo_type_positions = np .insert (np .cumsum (cairo_type_sizes ), 0 , 0 )
@@ -300,6 +309,7 @@ def _draw_paths():
300
309
return
301
310
gc_vars , rgb_fc = reuse_key
302
311
gc = copy .copy (gc0 )
312
+ # We actually need to call the setters to reset the internal state.
303
313
vars (gc ).update (gc_vars )
304
314
for k , v in gc_vars .items ():
305
315
try :
0 commit comments