@@ -10,22 +10,30 @@ class FigureCanvasQTCairo(FigureCanvasQT, FigureCanvasCairo):
10
10
def __init__ (self , figure ):
11
11
super (FigureCanvasQTCairo , self ).__init__ (figure = figure )
12
12
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 ()
13
19
14
20
def paintEvent (self , event ):
15
21
self ._update_dpi ()
16
22
dpi_ratio = self ._dpi_ratio
17
23
width = dpi_ratio * self .width ()
18
24
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 ()
24
31
qimage = QtGui .QImage (buf , width , height ,
25
32
QtGui .QImage .Format_ARGB32_Premultiplied )
26
33
# Adjust the buf reference count to work around a memory leak bug in
27
34
# QImage under PySide on Python 3.
28
35
if QT_API == 'PySide' and six .PY3 :
36
+ import ctypes
29
37
ctypes .c_long .from_address (id (buf )).value = 1
30
38
if hasattr (qimage , 'setDevicePixelRatio' ):
31
39
# Not available on Qt4 or some older Qt5.
0 commit comments