@@ -108,22 +108,31 @@ def _convert_paths_slow(ctx, paths, transforms, clip=None):
108
108
109
109
110
110
def _convert_paths_fast (ctx , paths , transforms , clip = None ):
111
+ # We directly convert to the internal representation used by cairo, for
112
+ # which ABI compatibility is guaranteed. The layout is for each item is
113
+ # --CODE(4)-- -LENGTH(4)- ---------PAD(8)---------
114
+ # ----------X(8)---------- ----------Y(8)----------
115
+ # with the size in bytes in parentheses, and (X, Y) repeated as many times
116
+ # as there are points for the current code.
111
117
ffi = cairo .ffi
112
118
cleaneds = [path .cleaned (transform = transform , clip = clip )
113
119
for path , transform in zip (paths , transforms )]
114
120
vertices = np .concatenate ([cleaned .vertices for cleaned in cleaneds ])
115
121
codes = np .concatenate ([cleaned .codes for cleaned in cleaneds ])
116
122
117
- # TODO: Implement Bezier degree elevation formula. Note that the "slow"
118
- # implementation is, in fact, also incorrect...
123
+ # TODO: Implement Bezier degree elevation formula. For now, fall back to
124
+ # the "slow" implementation, though note that that implementation is, in
125
+ # fact, also incorrect...
119
126
if np .any (codes == Path .CURVE3 ):
120
127
raise NotImplementedError ("Quadratic Bezier curves are not supported" )
128
+
121
129
# Remove unused vertices and convert to cairo codes. Note that unlike
122
130
# cairo_close_path, we do not explicitly insert an extraneous MOVE_TO after
123
131
# CLOSE_PATH, so our resulting buffer may be smaller.
124
132
vertices = vertices [(codes != Path .STOP ) & (codes != Path .CLOSEPOLY )]
125
133
codes = codes [codes != Path .STOP ]
126
134
codes = _MPL_TO_CAIRO_PATH_TYPE [codes ]
135
+
127
136
# Where are the headers of each cairo portions?
128
137
cairo_type_sizes = _CAIRO_PATH_TYPE_SIZES [codes ]
129
138
cairo_type_positions = np .insert (np .cumsum (cairo_type_sizes ), 0 , 0 )
@@ -286,6 +295,7 @@ def _draw_paths():
286
295
return
287
296
gc_vars , rgb_fc = reuse_key
288
297
gc = copy .copy (gc0 )
298
+ # We actually need to call the setters to reset the internal state.
289
299
vars (gc ).update (gc_vars )
290
300
for k , v in gc_vars .items ():
291
301
try :
0 commit comments