@@ -10,22 +10,30 @@ class FigureCanvasQTCairo(FigureCanvasQT, FigureCanvasCairo):
1010 def __init__ (self , figure ):
1111 super (FigureCanvasQTCairo , self ).__init__ (figure = figure )
1212 self ._renderer = RendererCairo (self .figure .dpi )
13+ self ._renderer .set_width_height (- 1 , - 1 ) # Invalid values.
14+
15+ def draw (self ):
16+ if hasattr (self ._renderer .gc , "ctx" ):
17+ self .figure .draw (self ._renderer )
18+ super (FigureCanvasQTCairo , self ).draw ()
1319
1420 def paintEvent (self , event ):
1521 self ._update_dpi ()
1622 dpi_ratio = self ._dpi_ratio
1723 width = dpi_ratio * self .width ()
1824 height = dpi_ratio * self .height ()
19- surface = cairo .ImageSurface (cairo .FORMAT_ARGB32 , width , height )
20- self ._renderer .set_ctx_from_surface (surface )
21- self ._renderer .set_width_height (width , height )
22- self .figure .draw (self ._renderer )
23- buf = surface .get_data ()
25+ if (width , height ) != self ._renderer .get_canvas_width_height ():
26+ surface = cairo .ImageSurface (cairo .FORMAT_ARGB32 , width , height )
27+ self ._renderer .set_ctx_from_surface (surface )
28+ self ._renderer .set_width_height (width , height )
29+ self .figure .draw (self ._renderer )
30+ buf = self ._renderer .gc .ctx .get_target ().get_data ()
2431 qimage = QtGui .QImage (buf , width , height ,
2532 QtGui .QImage .Format_ARGB32_Premultiplied )
2633 # Adjust the buf reference count to work around a memory leak bug in
2734 # QImage under PySide on Python 3.
2835 if QT_API == 'PySide' and six .PY3 :
36+ import ctypes
2937 ctypes .c_long .from_address (id (buf )).value = 1
3038 if hasattr (qimage , 'setDevicePixelRatio' ):
3139 # Not available on Qt4 or some older Qt5.
0 commit comments