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

Skip to content

Commit b391f08

Browse files
committed
Refactor image compositing logic into a single function
1 parent 0469ab7 commit b391f08

File tree

3 files changed

+59
-73
lines changed

3 files changed

+59
-73
lines changed

lib/matplotlib/axes/_base.py

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2352,38 +2352,7 @@ def draw(self, renderer=None, inframe=False):
23522352
a.draw(renderer)
23532353
renderer.stop_rasterizing()
23542354

2355-
has_images = np.any(isinstance(x[1], mimage._ImageBase) for x in dsu)
2356-
2357-
if renderer.option_image_nocomposite() or not has_images:
2358-
for zorder, a in dsu:
2359-
a.draw(renderer)
2360-
else:
2361-
# Composite any adjacent images together
2362-
image_group = []
2363-
mag = renderer.get_image_magnification()
2364-
2365-
def flush_images():
2366-
if len(image_group) == 1:
2367-
image_group[0].draw(renderer)
2368-
elif len(image_group) > 1:
2369-
data, l, b = mimage.composite_images(
2370-
image_group, renderer, mag)
2371-
gc = renderer.new_gc()
2372-
gc.set_clip_rectangle(self.bbox)
2373-
gc.set_clip_path(mtransforms.TransformedPath(
2374-
self.patch.get_path(),
2375-
self.patch.get_transform()))
2376-
renderer.draw_image(gc, round(l), round(b), data)
2377-
gc.restore()
2378-
del image_group[:]
2379-
2380-
for zorder, a in dsu:
2381-
if isinstance(a, mimage._ImageBase) and a.can_composite():
2382-
image_group.append(a)
2383-
else:
2384-
flush_images()
2385-
a.draw(renderer)
2386-
flush_images()
2355+
mimage._draw_list_compositing_images(renderer, self, dsu)
23872356

23882357
renderer.close_group('axes')
23892358
self._cachedRenderer = renderer

lib/matplotlib/figure.py

Lines changed: 9 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,65 +1233,33 @@ def draw(self, renderer):
12331233
dsu = []
12341234

12351235
for a in self.patches:
1236-
dsu.append((a.get_zorder(), a, a.draw, [renderer]))
1236+
dsu.append((a.get_zorder(), a))
12371237

12381238
for a in self.lines:
1239-
dsu.append((a.get_zorder(), a, a.draw, [renderer]))
1239+
dsu.append((a.get_zorder(), a))
12401240

12411241
for a in self.artists:
1242-
dsu.append((a.get_zorder(), a, a.draw, [renderer]))
1243-
1244-
# override the renderer default if self.suppressComposite
1245-
# is not None
1246-
not_composite = renderer.option_image_nocomposite()
1247-
if self.suppressComposite is not None:
1248-
not_composite = self.suppressComposite
1242+
dsu.append((a.get_zorder(), a))
12491243

12501244
for a in self.images:
1251-
dsu.append((a.get_zorder(), a, a.draw, [renderer]))
1245+
dsu.append((a.get_zorder(), a))
12521246

12531247
# render the axes
12541248
for a in self.axes:
1255-
dsu.append((a.get_zorder(), a, a.draw, [renderer]))
1249+
dsu.append((a.get_zorder(), a))
12561250

12571251
# render the figure text
12581252
for a in self.texts:
1259-
dsu.append((a.get_zorder(), a, a.draw, [renderer]))
1253+
dsu.append((a.get_zorder(), a))
12601254

12611255
for a in self.legends:
1262-
dsu.append((a.get_zorder(), a, a.draw, [renderer]))
1256+
dsu.append((a.get_zorder(), a))
12631257

12641258
dsu = [row for row in dsu if not row[1].get_animated()]
12651259
dsu.sort(key=itemgetter(0))
12661260

1267-
if not_composite or len(self.images) == 0:
1268-
for zorder, a, func, args in dsu:
1269-
func(*args)
1270-
else:
1271-
# Composite any adjacent images together
1272-
image_group = []
1273-
mag = renderer.get_image_magnification()
1274-
1275-
def flush_images():
1276-
if len(image_group) == 1:
1277-
image_group[0].draw(renderer)
1278-
elif len(image_group) > 1:
1279-
data, l, b = mimage.composite_images(
1280-
image_group, renderer, mag)
1281-
gc = renderer.new_gc()
1282-
gc.set_clip_rectangle(self.bbox)
1283-
gc.set_clip_path(self.get_clip_path())
1284-
renderer.draw_image(gc, l, b, data)
1285-
gc.restore()
1286-
del image_group[:]
1287-
1288-
for zorder, a, func, args in dsu:
1289-
if isinstance(a, mimage._ImageBase) and a.can_composite():
1290-
image_group.append(a)
1291-
else:
1292-
flush_images()
1293-
func(*args)
1294-
flush_images()
1261+
mimage._draw_list_compositing_images(
1262+
renderer, self, dsu, self.suppressComposite)
12951263

12961264
renderer.close_group('figure')
12971265
self.stale = False

lib/matplotlib/image.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,55 @@ def composite_images(images, renderer, magnification=1.0):
117117
return output, bbox.x0 / magnification, bbox.y0 / magnification
118118

119119

120+
def _draw_list_compositing_images(
121+
renderer, parent, dsu, suppress_composite=None):
122+
"""
123+
Draw a sorted list of artists, compositing images into a single
124+
image where possible.
125+
126+
For internal matplotlib use only: It is here to reduce duplication
127+
between `Figure.draw` and `Axes.draw`, but otherwise should not be
128+
generally useful.
129+
"""
130+
has_images = np.any(isinstance(x[1], _ImageBase) for x in dsu)
131+
132+
# override the renderer default if self.suppressComposite
133+
# is not None
134+
not_composite = renderer.option_image_nocomposite()
135+
if suppress_composite is not None:
136+
not_composite = suppress_composite
137+
138+
if not_composite or not has_images:
139+
for zorder, a in dsu:
140+
a.draw(renderer)
141+
else:
142+
# Composite any adjacent images together
143+
image_group = []
144+
mag = renderer.get_image_magnification()
145+
146+
def flush_images():
147+
if len(image_group) == 1:
148+
image_group[0].draw(renderer)
149+
elif len(image_group) > 1:
150+
data, l, b = composite_images(
151+
image_group, renderer, mag)
152+
gc = renderer.new_gc()
153+
gc.set_clip_rectangle(parent.bbox)
154+
gc.set_clip_path(parent.get_clip_path())
155+
renderer.draw_image(gc, round(l), round(b), data)
156+
gc.restore()
157+
del image_group[:]
158+
159+
for zorder, a in dsu:
160+
if isinstance(a, _ImageBase) and a.can_composite():
161+
image_group.append(a)
162+
else:
163+
flush_images()
164+
a.draw(renderer)
165+
flush_images()
166+
167+
168+
120169
def _rgb_to_rgba(A):
121170
"""
122171
Convert an RGB image to RGBA, as required by the image resample C++

0 commit comments

Comments
 (0)