Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5312461

Browse files
committed
Document a bit the cairo fast path.
1 parent 52ed746 commit 5312461

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

lib/matplotlib/backends/backend_cairo.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,22 +125,31 @@ def _convert_paths_slow(ctx, paths, transforms, clip=None):
125125

126126

127127
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.
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

Comments
 (0)