|
1 | 1 | from matplotlib.backends.backend_macosx import _BackendMac, FigureCanvasMac
|
2 | 2 |
|
3 | 3 | from . import _mplcairo
|
4 |
| -from .base import FigureCanvasCairo |
| 4 | +from .base import FigureCanvasCairo, _LOCK |
5 | 5 |
|
6 | 6 |
|
7 | 7 | class FigureCanvasMacCairo(FigureCanvasCairo, FigureCanvasMac):
|
8 | 8 |
|
9 |
| - def _draw(self): |
10 |
| - renderer = self.get_renderer() |
11 |
| - renderer.clear() |
12 |
| - self.figure.draw(renderer) |
13 |
| - # A bit hackish, but that's what _macosx.FigureCanvas wants... |
14 |
| - self._renderer = _mplcairo.cairo_to_straight_rgba8888( |
15 |
| - renderer._get_buffer()) |
16 |
| - return self |
| 9 | + if hasattr(FigureCanvasMac, "_draw"): |
| 10 | + # Matplotlib<3.6. |
| 11 | + |
| 12 | + def _draw(self): |
| 13 | + renderer = self.get_renderer() |
| 14 | + renderer.clear() |
| 15 | + self.figure.draw(renderer) |
| 16 | + # A bit hackish, but that's what _macosx.FigureCanvas wants... |
| 17 | + self._renderer = _mplcairo.cairo_to_straight_rgba8888( |
| 18 | + renderer._get_buffer()) |
| 19 | + return self |
| 20 | + |
| 21 | + else: |
| 22 | + # Matplotlib>=3.6: just a copy-paste of FigureCanvasMac.draw, but the |
| 23 | + # copy ensures that super() correctly refers to FigureCanvasCairo, not |
| 24 | + # FigureCanvasAgg. |
| 25 | + |
| 26 | + def draw(self): |
| 27 | + if self._is_drawing: |
| 28 | + return |
| 29 | + self._is_drawing = True |
| 30 | + try: |
| 31 | + super().draw() |
| 32 | + finally: |
| 33 | + self._is_drawing = False |
| 34 | + self.update() |
| 35 | + |
| 36 | + # Inheriting from FigureCanvasCairo.restore_region would call |
| 37 | + # super().draw() which would incorrectly refer to FigureCanvasAgg; |
| 38 | + # directly call self.update() instead. |
| 39 | + |
| 40 | + def restore_region(self, region): |
| 41 | + with _LOCK: |
| 42 | + self.get_renderer().restore_region(region) |
| 43 | + self.update() |
17 | 44 |
|
18 | 45 |
|
19 | 46 | @_BackendMac.export
|
|
0 commit comments