8000 support blitting in webagg backend · ianhi/matplotlib@4b087e8 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4b087e8

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: matplotlib#9240 (comment) Also, did not need to implement copy_from_bbox as that is inherited from backend_agg.FigureCanvasAgg
1 parent 1c65075 commit 4b087e8

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

lib/matplotlib/backends/backend_webagg_core.py

Lines changed: 14 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)
@@ -141,6 +141,9 @@ def __init__(self, *args, **kwargs):
141141
# occurs automatically for all images on a HiDPI display.
142142
self._dpi_ratio = 1
143143

144+
# # Create a buffer to store the last image so we can compute a diff
145+
# self._last_buffer = None
146+
144147
def show(self):
145148
# show the figure window
146149
from matplotlib.pyplot import show
@@ -153,6 +156,10 @@ def draw(self):
153156
finally:
154157
self.manager.refresh_all() # Swap the frames.
155158

159+
def blit(self, bbox=None):
160+
self._png_is_old = True
161+
self.manager.refresh_all()
162+
156163
def draw_idle(self):
157164
self.send_event("draw")
158165

@@ -189,18 +196,14 @@ def get_diff_image(self):
189196
output = buff
190197
else:
191198
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
199+
diff = buff != self._last_buff
196200
output = np.where(diff, buff, 0)
197201

198202
buf = BytesIO()
199203
data = output.view(dtype=np.uint8).reshape((*output.shape, 4))
200204
Image.fromarray(data).save(buf, format="png")
201-
# Swap the renderer frames
202-
self._renderer, self._last_renderer = (
203-
self._last_renderer, renderer)
205+
# store the current buffer so we can compute the next diff
206+
np.copyto(self._last_buff, buff)
204207
self._force_full = False
205208
self._png_is_old = False
206209
return buf.getvalue()
@@ -220,9 +223,10 @@ def get_renderer(self, cleared=None):
220223
if need_new_renderer:
221224
self._renderer = backend_agg.RendererAgg(
222225
w, h, self.figure.dpi)
223-
self._last_renderer = backend_agg.RendererAgg(
224-
w, h, self.figure.dpi)
225226
self._lastKey = key
227+
self._last_buff = np.copy(np.frombuffer(
228+
self._renderer.buffer_rgba(), dtype=np.uint32
229+
).reshape((self._renderer.height, self._renderer.width)))
226230

227231
elif cleared:
228232
self._renderer.clear()

0 commit comments

Comments
 (0)
0