Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f107fae

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 f107fae

File tree

8 files changed

+31
-30
lines changed

8 files changed

+31
-30
lines changed
Lines changed: 4 additions & 0 deletions
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

Lines changed: 19 additions & 9 deletions
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()
@@ -463,11 +475,10 @@ def print_rgba(self, fobj):
463475

464476
def _get_printed_image_surface(self):
465477
width, height = self.get_width_height()
466-
renderer = RendererCairo(self.figure.dpi)
467-
renderer.set_width_height(width, height)
478+
self._renderer.set_width_height(width, height)
468479
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
469-
renderer.set_ctx_from_surface(surface)
470-
self.figure.draw(renderer)
480+
self._renderer.set_ctx_from_surface(surface)
481+
self.figure.draw(self._renderer)
471482
return surface
472483

473484
@_check_savefig_extra_args
@@ -507,17 +518,16 @@ def _save(self, fmt, fobj, *, orientation='portrait'):
507518
raise ValueError("Unknown format: {!r}".format(fmt))
508519

509520
# 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.set_width_height(width_in_points, height_in_points)
522+
self._renderer.set_ctx_from_surface(surface)
523+
ctx = self._renderer.gc.ctx
514524

515525
if orientation == 'landscape':
516526
ctx.rotate(np.pi / 2)
517527
ctx.translate(0, -height_in_points)
518528
# Perhaps add an '%%Orientation: Landscape' comment?
519529

520-
self.figure.draw(renderer)
530+
self.figure.draw(self._renderer)
521531

522532
ctx.show_page()
523533
surface.finish()

lib/matplotlib/backends/backend_gtk3cairo.py

Lines changed: 2 additions & 4 deletions
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

Lines changed: 2 additions & 4 deletions
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

Lines changed: 1 addition & 4 deletions
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

Lines changed: 1 addition & 2 deletions
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

Lines changed: 1 addition & 5 deletions
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

Lines changed: 1 addition & 2 deletions
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)
@@ -27,7 +27,6 @@ def __init__(self, parent, id, figure):
2727
# meantime the following will make do.
2828
_FigureCanvasWxBase.__init__(self, parent, id, figure)
2929
FigureCanvasCairo.__init__(self, figure)
30-
self._renderer = RendererCairo(self.figure.dpi)
3130

3231
def draw(self, drawDC=None):
3332
size = self.figure.bbox.size.astype(int)

0 commit comments

Comments
 (0)