Skip to content

Commit de1a72f

Browse files
committed
FigureCanvasCairo can init RendererCairo; kill RendererCairo subclasses.
Initialization of RendererCairo is duplicated across all FigureCanvasCairo subclasses (and also in FigureCanvasCairo itself), so just move it to a single place (in a delayed-init property to avoid having to play around multiple inheritance and GUI frameworks). RendererCairoGTK{3,4} simply add a set_context method, which can just as well be defined on the base RendererCairo class (which after all already defines set_ctx_from_surface for the benefit of {qt,tk,wx}cairo).
1 parent 3773128 commit de1a72f

File tree

8 files changed

+33
-38
lines changed

8 files changed

+33
-38
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
``RendererGTK3Cairo`` and ``RendererGTK4Cairo``
2+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3+
... have been deprecated. Use ``RendererCairo`` instead, which has gained the
4+
``set_context`` method.

lib/matplotlib/backends/backend_cairo.py

+21-10
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ def __init__(self, dpi):
133133
cairo.ImageSurface(cairo.FORMAT_ARGB32, 1, 1))
134134
super().__init__()
135135

136+
def set_context(self, ctx):
137+
self.gc.ctx = _to_context(ctx)
138+
136139
def set_ctx_from_surface(self, surface):
137140
self.gc.ctx = cairo.Context(surface)
138141
# Although it may appear natural to automatically call
@@ -414,6 +417,15 @@ def __init__(self, slices, data):
414417

415418

416419
class FigureCanvasCairo(FigureCanvasBase):
420+
@property
421+
def _renderer(self):
422+
# In theory, _renderer should be set in __init__, but GUI canvas
423+
# subclasses (FigureCanvasFooCairo) don't always interact well with
424+
# multiple inheritance (FigureCanvasFoo inits but doesn't super-init
425+
# FigureCanvasCairo), so initialize it in the getter instead.
426+
if not hasattr(self, "_cached_renderer"):
427+
self._cached_renderer = RendererCairo(self.figure.dpi)
428+
return self._cached_renderer
417429

418430
def copy_from_bbox(self, bbox):
419431
surface = self._renderer.gc.ctx.get_target()
@@ -462,12 +474,12 @@ def print_rgba(self, fobj):
462474
print_raw = print_rgba
463475

464476
def _get_printed_image_surface(self):
477+
self._renderer.dpi = self.figure.dpi
465478
width, height = self.get_width_height()
466-
renderer = RendererCairo(self.figure.dpi)
467-
renderer.set_width_height(width, height)
479+
self._renderer.set_width_height(width, height)
468480
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
469-
renderer.set_ctx_from_surface(surface)
470-
self.figure.draw(renderer)
481+
self._renderer.set_ctx_from_surface(surface)
482+
self.figure.draw(self._renderer)
471483
return surface
472484

473485
@_check_savefig_extra_args
@@ -506,18 +518,17 @@ def _save(self, fmt, fobj, *, orientation='portrait'):
506518
else:
507519
raise ValueError("Unknown format: {!r}".format(fmt))
508520

509-
# surface.set_dpi() can be used
510-
renderer = RendererCairo(self.figure.dpi)
511-
renderer.set_width_height(width_in_points, height_in_points)
512-
renderer.set_ctx_from_surface(surface)
513-
ctx = renderer.gc.ctx
521+
self._renderer.dpi = self.figure.dpi
522+
self._renderer.set_width_height(width_in_points, height_in_points)
523+
self._renderer.set_ctx_from_surface(surface)
524+
ctx = self._renderer.gc.ctx
514525

515526
if orientation == 'landscape':
516527
ctx.rotate(np.pi / 2)
517528
ctx.translate(0, -height_in_points)
518529
# Perhaps add an '%%Orientation: Landscape' comment?
519530

520-
self.figure.draw(renderer)
531+
self.figure.draw(self._renderer)
521532

522533
ctx.show_page()
523534
surface.finish()

lib/matplotlib/backends/backend_gtk3cairo.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from contextlib import nullcontext
22

3+
from .. import _api
34
from . import backend_cairo, backend_gtk3
45
from .backend_gtk3 import Gtk, _BackendGTK3
56

67

8+
@_api.deprecated("3.6")
79
class RendererGTK3Cairo(backend_cairo.RendererCairo):
810
def set_context(self, ctx):
911
self.gc.ctx = backend_cairo._to_context(ctx)
@@ -12,10 +14,6 @@ def set_context(self, ctx):
1214
class FigureCanvasGTK3Cairo(backend_gtk3.FigureCanvasGTK3,
1315
backend_cairo.FigureCanvasCairo):
1416

15-
def __init__(self, figure):
16-
super().__init__(figure)
17-
self._renderer = RendererGTK3Cairo(self.figure.dpi)
18-
1917
def on_draw_event(self, widget, ctx):
2018
with (self.toolbar._wait_cursor_for_draw_cm() if self.toolbar
2119
else nullcontext()):

lib/matplotlib/backends/backend_gtk4cairo.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from contextlib import nullcontext
22

3+
from .. import _api
34
from . import backend_cairo, backend_gtk4
45
from .backend_gtk4 import Gtk, _BackendGTK4
56

67

8+
@_api.deprecated("3.6")
79
class RendererGTK4Cairo(backend_cairo.RendererCairo):
810
def set_context(self, ctx):
911
self.gc.ctx = backend_cairo._to_context(ctx)
@@ -13,10 +15,6 @@ class FigureCanvasGTK4Cairo(backend_gtk4.FigureCanvasGTK4,
1315
backend_cairo.FigureCanvasCairo):
1416
_context_is_scaled = True
1517

16-
def __init__(self, figure):
17-
super().__init__(figure)
18-
self._renderer = RendererGTK4Cairo(self.figure.dpi)
19-
2018
def on_draw_event(self, widget, ctx):
2119
with (self.toolbar._wait_cursor_for_draw_cm() if self.toolbar
2220
else nullcontext()):

lib/matplotlib/backends/backend_qt5cairo.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
from .backend_qtcairo import (
2-
_BackendQTCairo, FigureCanvasQTCairo,
3-
FigureCanvasCairo, FigureCanvasQT,
4-
RendererCairo
5-
)
2+
_BackendQTCairo, FigureCanvasQTCairo, FigureCanvasCairo, FigureCanvasQT)
63

74

85
@_BackendQTCairo.export

lib/matplotlib/backends/backend_qtcairo.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import ctypes
22

3-
from .backend_cairo import cairo, FigureCanvasCairo, RendererCairo
3+
from .backend_cairo import cairo, FigureCanvasCairo
44
from .backend_qt import QtCore, QtGui, _BackendQT, FigureCanvasQT
55
from .qt_compat import QT_API, _enum, _setDevicePixelRatio
66

77

88
class FigureCanvasQTCairo(FigureCanvasQT, FigureCanvasCairo):
99
def __init__(self, figure=None):
1010
super().__init__(figure=figure)
11-
self._renderer = RendererCairo(self.figure.dpi)
1211
self._renderer.set_width_height(-1, -1) # Invalid values.
1312

1413
def draw(self):

lib/matplotlib/backends/backend_tkcairo.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,11 @@
33
import numpy as np
44

55
from . import _backend_tk
6-
from .backend_cairo import cairo, FigureCanvasCairo, RendererCairo
6+
from .backend_cairo import cairo, FigureCanvasCairo
77
from ._backend_tk import _BackendTk, FigureCanvasTk
88

99

1010
class FigureCanvasTkCairo(FigureCanvasCairo, FigureCanvasTk):
11-
def __init__(self, *args, **kwargs):
12-
super().__init__(*args, **kwargs)
13-
self._renderer = RendererCairo(self.figure.dpi)
14-
1511
def draw(self):
1612
width = int(self.figure.bbox.width)
1713
height = int(self.figure.bbox.height)

lib/matplotlib/backends/backend_wxcairo.py

+1-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import wx.lib.wxcairo as wxcairo
22

3-
from .backend_cairo import cairo, FigureCanvasCairo, RendererCairo
3+
from .backend_cairo import cairo, FigureCanvasCairo
44
from .backend_wx import (
55
_BackendWx, _FigureCanvasWxBase, FigureFrameWx,
66
NavigationToolbar2Wx as NavigationToolbar2WxCairo)
@@ -21,14 +21,6 @@ class FigureCanvasWxCairo(_FigureCanvasWxBase, FigureCanvasCairo):
2121
we give a hint as to our preferred minimum size.
2222
"""
2323

24-
def __init__(self, parent, id, figure):
25-
# _FigureCanvasWxBase should be fixed to have the same signature as
26-
# every other FigureCanvas and use cooperative inheritance, but in the
27-
# meantime the following will make do.
28-
_FigureCanvasWxBase.__init__(self, parent, id, figure)
29-
FigureCanvasCairo.__init__(self, figure)
30-
self._renderer = RendererCairo(self.figure.dpi)
31-
3224
def draw(self, drawDC=None):
3325
size = self.figure.bbox.size.astype(int)
3426
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, *size)

0 commit comments

Comments
 (0)