@@ -1369,6 +1369,7 @@ def notify_axes_change(fig):
13691369
13701370 def show (self ):
13711371 self .frame .Show ()
1372+ self .canvas .draw ()
13721373
13731374 def destroy (self , * args ):
13741375 DEBUG_MSG ("destroy()" , 1 , self )
@@ -1573,6 +1574,12 @@ def __init__(self, canvas):
15731574 self .canvas = canvas
15741575 self ._idle = True
15751576 self .statbar = None
1577+ self .prevZoomRect = None
1578+ # for now, use alternate zoom-rectangle drawing on all
1579+ # Macs. N.B. In future versions of wx it may be possible to
1580+ # detect Retina displays with window.GetContentScaleFactor()
1581+ # and/or dc.GetContentScaleFactor()
1582+ self .retinaFix = 'wxMac' in wx .PlatformInfo
15761583
15771584 def get_canvas (self , frame , fig ):
15781585 return FigureCanvasWx (frame , - 1 , fig )
@@ -1674,16 +1681,44 @@ def dynamic_update(self):
16741681
16751682 def press (self , event ):
16761683 if self ._active == 'ZOOM' :
1677- self .wxoverlay = wx .Overlay ()
1684+ if not self .retinaFix :
1685+ self .wxoverlay = wx .Overlay ()
1686+ else :
1687+ self .savedRetinaImage = self .canvas .copy_from_bbox (
1688+ self .canvas .figure .gca ().bbox )
1689+ self .zoomStartX = event .xdata
1690+ self .zoomStartY = event .ydata
16781691
16791692 def release (self , event ):
16801693 if self ._active == 'ZOOM' :
16811694 # When the mouse is released we reset the overlay and it
16821695 # restores the former content to the window.
1683- self .wxoverlay .Reset ()
1684- del self .wxoverlay
1696+ if not self .retinaFix :
1697+ self .wxoverlay .Reset ()
1698+ del self .wxoverlay
1699+ else :
1700+ del self .savedRetinaImage
1701+ if self .prevZoomRect :
1702+ self .prevZoomRect .pop (0 ).remove ()
1703+ self .prevZoomRect = None
16851704
16861705 def draw_rubberband (self , event , x0 , y0 , x1 , y1 ):
1706+ if self .retinaFix : # On Macs, use the following code
1707+ # wx.DCOverlay does not work properly on Retina displays.
1708+ rubberBandColor = '#C0C0FF'
1709+ if self .prevZoomRect :
1710+ self .prevZoomRect .pop (0 ).remove ()
1711+ self .canvas .restore_region (self .savedRetinaImage )
1712+ X0 , X1 = self .zoomStartX , event .xdata
1713+ Y0 , Y1 = self .zoomStartY , event .ydata
1714+ lineX = (X0 , X0 , X1 , X1 , X0 )
1715+ lineY = (Y0 , Y1 , Y1 , Y0 , Y0 )
1716+ self .prevZoomRect = self .canvas .figure .gca ().plot (
1717+ lineX , lineY , '-' , color = rubberBandColor )
1718+ self .canvas .figure .gca ().draw_artist (self .prevZoomRect [0 ])
1719+ self .canvas .blit (self .canvas .figure .gca ().bbox )
1720+ return
1721+
16871722 # Use an Overlay to draw a rubberband-like bounding box.
16881723
16891724 dc = wx .ClientDC (self .canvas )
0 commit comments