@@ -118,7 +118,7 @@ def _handle_key(key):
118118
119119
120120class 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