@@ -1416,10 +1416,11 @@ def finalize_offset(self):
14161416 the normalized axes coordinate and set a relavant attribute.
14171417
14181418 """
1419- def __init__ (self , ref_artist ):
1419+ def __init__ (self , ref_artist , use_blit = False ):
14201420 self .ref_artist = ref_artist
14211421 self .got_artist = False
1422-
1422+ self ._use_blit = use_blit
1423+
14231424 self .canvas = self .ref_artist .figure .canvas
14241425 c2 = self .canvas .mpl_connect ('pick_event' , self .on_pick )
14251426 c3 = self .canvas .mpl_connect ('button_release_event' , self .on_release )
@@ -1432,23 +1433,44 @@ def on_motion(self, evt):
14321433 dx = evt .x - self .mouse_x
14331434 dy = evt .y - self .mouse_y
14341435 self .update_offset (dx , dy )
1436+ self .canvas .draw ()
1437+
1438+ def on_motion_blit (self , evt ):
1439+ if self .got_artist :
1440+ dx = evt .x - self .mouse_x
1441+ dy = evt .y - self .mouse_y
1442+ self .update_offset (dx , dy )
1443+ self .canvas .restore_region (self .background )
1444+ self .ref_artist .draw (self .ref_artist .figure ._cachedRenderer )
1445+ self .canvas .blit (self .ref_artist .figure .bbox )
14351446
14361447 def on_pick (self , evt ):
14371448 if evt .artist == self .ref_artist :
14381449
1439- self .save_offset ()
14401450 self .mouse_x = evt .mouseevent .x
14411451 self .mouse_y = evt .mouseevent .y
14421452 self .got_artist = True
14431453
1444- self ._c1 = self .canvas .mpl_connect ('motion_notify_event' , self .on_motion )
1454+ if self ._use_blit :
1455+ self .ref_artist .set_animated (True )
1456+ self .canvas .draw ()
1457+ self .background = self .canvas .copy_from_bbox (self .ref_artist .figure .bbox )
1458+ self .ref_artist .draw (self .ref_artist .figure ._cachedRenderer )
1459+ self .canvas .blit (self .ref_artist .figure .bbox )
1460+ self ._c1 = self .canvas .mpl_connect ('motion_notify_event' , self .on_motion_blit )
1461+ else :
1462+ self ._c1 = self .canvas .mpl_connect ('motion_notify_event' , self .on_motion )
1463+ self .save_offset ()
14451464
14461465 def on_release (self , event ):
14471466 if self .got_artist :
14481467 self .finalize_offset ()
14491468 self .got_artist = False
14501469 self .canvas .mpl_disconnect (self ._c1 )
14511470
1471+ if self ._use_blit :
1472+ self .ref_artist .set_animated (False )
1473+
14521474 def disconnect (self ):
14531475 'disconnect the callbacks'
14541476 for cid in self .cids :
@@ -1468,8 +1490,8 @@ def finalize_offset(self):
14681490
14691491
14701492class DraggableOffsetBox (DraggableBase ):
1471- def __init__ (self , ref_artist , offsetbox ):
1472- DraggableBase .__init__ (self , ref_artist )
1493+ def __init__ (self , ref_artist , offsetbox , use_blit = False ):
1494+ DraggableBase .__init__ (self , ref_artist , use_blit = use_blit )
14731495 self .offsetbox = offsetbox
14741496
14751497 def save_offset (self ):
@@ -1482,7 +1504,6 @@ def save_offset(self):
14821504 def update_offset (self , dx , dy ):
14831505 loc_in_canvas = self .offsetbox_x + dx , self .offsetbox_y + dy
14841506 self .offsetbox .set_offset (loc_in_canvas )
1485- self .offsetbox .figure .canvas .draw ()
14861507
14871508 def get_loc_in_canvas (self ):
14881509
@@ -1496,8 +1517,8 @@ def get_loc_in_canvas(self):
14961517
14971518
14981519class DraggableAnnotation (DraggableBase ):
1499- def __init__ (self , annotation ):
1500- DraggableBase .__init__ (self , annotation )
1520+ def __init__ (self , annotation , use_blit = False ):
1521+ DraggableBase .__init__ (self , annotation , use_blit = use_blit )
15011522 self .annotation = annotation
15021523
15031524 def save_offset (self ):
@@ -1519,7 +1540,6 @@ def update_offset(self, dx, dy):
15191540 ann .xytext = self .ox + dx , self .oy + dy
15201541 x , y = ann .xytext
15211542 xy = ann ._get_xy (x , y , ann .textcoords )
1522- self .canvas .draw ()
15231543
15241544 def finalize_offset (self ):
15251545 loc_in_canvas = self .annotation .xytext
0 commit comments