diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 854eae006e45..f2244c9bb453 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -1501,7 +1501,7 @@ def __init__(self, name, canvas, key, x=0, y=0, guiEvent=None): self.key = key -def _get_renderer(figure, print_method, *, draw_disabled=False): +def _get_renderer(figure, print_method=None, *, draw_disabled=False): """ Get the renderer that would be used to save a `~.Figure`, and cache it on the figure. @@ -1520,8 +1520,11 @@ class Done(Exception): def _draw(renderer): raise Done(renderer) with cbook._setattr_cm(figure, draw=_draw): + if print_method is None: + fmt = figure.canvas.get_default_filetype() + print_method = getattr(figure.canvas, f"print_{fmt}") try: - print_method(io.BytesIO()) + print_method(io.BytesIO(), dpi=figure.dpi) except Done as exc: renderer, = figure._cachedRenderer, = exc.args @@ -2089,7 +2092,7 @@ def print_figure( renderer = _get_renderer( self.figure, functools.partial( - print_method, dpi=dpi, orientation=orientation), + print_method, orientation=orientation), draw_disabled=True) self.figure.draw(renderer) bbox_inches = self.figure.get_tightbbox( diff --git a/lib/matplotlib/tests/test_tightlayout.py b/lib/matplotlib/tests/test_tightlayout.py index c73992c38c6d..9ad2e0a9a080 100644 --- a/lib/matplotlib/tests/test_tightlayout.py +++ b/lib/matplotlib/tests/test_tightlayout.py @@ -310,3 +310,18 @@ def test_suptitle(): t = ax.set_title("bar") fig.canvas.draw() assert st.get_window_extent().y0 > t.get_window_extent().y1 + + +@pytest.mark.backend("pdf") +def test_non_agg_renderer(monkeypatch, recwarn): + unpatched_init = mpl.backend_bases.RendererBase.__init__ + + def __init__(self, *args, **kwargs): + # Check that we don't instantiate any other renderer than a pdf + # renderer to perform pdf tight layout. + assert isinstance(self, mpl.backends.backend_pdf.RendererPdf) + unpatched_init(self, *args, **kwargs) + + monkeypatch.setattr(mpl.backend_bases.RendererBase, "__init__", __init__) + fig, ax = plt.subplots() + fig.tight_layout() diff --git a/lib/matplotlib/tight_layout.py b/lib/matplotlib/tight_layout.py index eddd0d678736..43b578fef625 100644 --- a/lib/matplotlib/tight_layout.py +++ b/lib/matplotlib/tight_layout.py @@ -166,19 +166,14 @@ def auto_adjust_subplotpars( def get_renderer(fig): if fig._cachedRenderer: - renderer = fig._cachedRenderer + return fig._cachedRenderer else: canvas = fig.canvas - if canvas and hasattr(canvas, "get_renderer"): - renderer = canvas.get_renderer() - else: # Some noninteractive backends have no renderer until draw time. - cbook._warn_external("tight_layout: falling back to Agg renderer") - from matplotlib.backends.backend_agg import FigureCanvasAgg - canvas = FigureCanvasAgg(fig) - renderer = canvas.get_renderer() - - return renderer + return canvas.get_renderer() + else: + from . import backend_bases + return backend_bases._get_renderer(fig, draw_disabled=True) def get_subplotspec_list(axes_list, grid_spec=None):