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

Skip to content

Commit 78c182d

Browse files
committed
support blitting in webagg backend
Replaced the second Agg renderer by storing the previous buffer in a private attribute. Removing the second renderer eliminates the the flickering issues noted in: #9240 (comment) Also, did not need to implement copy_from_bbox as that is inherited from backend_agg.FigureCanvasAgg
1 parent 1c65075 commit 78c182d

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

lib/matplotlib/backends/backend_webagg_core.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def _handle_key(key):
118118

119119

120120
class FigureCanvasWebAggCore(backend_agg.FigureCanvasAgg):
121-
supports_blit = False
121+
supports_blit = True
122122

123123
def __init__(self, *args, **kwargs):
124124
super().__init__(*args, **kwargs)
@@ -153,6 +153,10 @@ def draw(self):
153153
finally:
154154
self.manager.refresh_all() # Swap the frames.
155155

156+
def blit(self, bbox=None):
157+
self._png_is_old = True
158+
self.manager.refresh_all()
159+
156160
def draw_idle(self):
157161
self.send_event("draw")
158162

@@ -189,18 +193,14 @@ def get_diff_image(self):
189193
output = buff
190194
else:
191195
self.set_image_mode('diff')
192-
last_buffer = (np.frombuffer(self._last_renderer.buffer_rgba(),
193-
dtype=np.uint32)
194-
.reshape((renderer.height, renderer.width)))
195-
diff = buff != last_buffer
196+
diff = buff != self._last_buff
196197
output = np.where(diff, buff, 0)
197198

198199
buf = BytesIO()
199200
data = output.view(dtype=np.uint8).reshape((*output.shape, 4))
200201
Image.fromarray(data).save(buf, format="png")
201-
# Swap the renderer frames
202-
self._renderer, self._last_renderer = (
203-
self._last_renderer, renderer)
202+
# store the current buffer so we can compute the next diff
203+
np.copyto(self._last_buff, buff)
204204
self._force_full = False
205205
self._png_is_old = False
206206
return buf.getvalue()
@@ -220,9 +220,10 @@ def get_renderer(self, cleared=None):
220220
if need_new_renderer:
221221
self._renderer = backend_agg.RendererAgg(
222222
w, h, self.figure.dpi)
223-
self._last_renderer = backend_agg.RendererAgg(
224-
w, h, self.figure.dpi)
225223
self._lastKey = key
224+
self._last_buff = np.copy(np.frombuffer(
225+
self._renderer.buffer_rgba(), dtype=np.uint32
226+
).reshape((self._renderer.height, self._renderer.width)))
226227

227228
elif cleared:
228229
self._renderer.clear()

0 commit comments

Comments
 (0)