@@ -71,7 +71,7 @@ def show(self):
7171 show ()
7272
7373 def draw (self ):
74- renderer = self .get_renderer ()
74+ renderer = self .get_renderer (cleared = True )
7575
7676 self ._png_is_old = True
7777
@@ -91,21 +91,25 @@ def get_diff_image(self):
9191 # The buffer is created as type uint32 so that entire
9292 # pixels can be compared in one numpy call, rather than
9393 # needing to compare each plane separately.
94- buff = np .frombuffer (
95- self .get_renderer ().buffer_rgba (), dtype = np .uint32 )
96- buff .shape = (
97- self ._renderer .height , self ._renderer .width )
94+ renderer = self .get_renderer ()
95+ buff = np .frombuffer (renderer .buffer_rgba (), dtype = np .uint32 )
9896
99- if not self ._force_full :
100- last_buffer = np .frombuffer (
101- self ._last_renderer .buffer_rgba (), dtype = np .uint32 )
102- last_buffer .shape = (
103- self ._renderer .height , self ._renderer .width )
97+ buff .shape = (renderer .height , renderer .width )
98+
99+ # If any pixels have transparency, we need to force a full draw
100+ # as we cannot overlay new on top of old.
101+ pixels = buff .view (dtype = np .uint8 ).reshape (buff .shape + (4 ,))
102+ some_transparency = np .any (pixels [:, :, 3 ] != 255 )
103+
104+ output = buff
105+
106+ if not self ._force_full and not some_transparency :
107+ last_buffer = np .frombuffer (self ._last_renderer .buffer_rgba (),
108+ dtype = np .uint32 )
109+ last_buffer .shape = (renderer .height , renderer .width )
104110
105111 diff = buff != last_buffer
106112 output = np .where (diff , buff , 0 )
107- else :
108- output = buff
109113
110114 # Clear out the PNG data buffer rather than recreating it
111115 # each time. This reduces the number of memory
@@ -122,7 +126,7 @@ def get_diff_image(self):
122126
123127 # Swap the renderer frames
124128 self ._renderer , self ._last_renderer = (
125- self ._last_renderer , self . _renderer )
129+ self ._last_renderer , renderer )
126130 self ._force_full = False
127131 self ._png_is_old = False
128132 return self ._png_buffer .getvalue ()
@@ -147,6 +151,9 @@ def get_renderer(self, cleared=None):
147151 w , h , self .figure .dpi )
148152 self ._lastKey = key
149153
154+ elif cleared :
155+ self ._renderer .clear ()
156+
150157 return self ._renderer
151158
152159 def handle_event (self , event ):
0 commit comments