Skip to content

Commit a409c01

Browse files
authored
Merge pull request #10399 from anntzer/qt5cairo-doubledraw
PRF: Avoid double draw in qt5cairo.
2 parents fd4b541 + fd8e190 commit a409c01

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

lib/matplotlib/backends/backend_qt5cairo.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)