Skip to content

Commit 71cb651

Browse files
authored
Merge pull request #22004 from anntzer/cairoinfersize
Make RendererCairo auto-infer surface size.
2 parents c19ffdf + 63aaf78 commit 71cb651

File tree

7 files changed

+29
-21
lines changed

7 files changed

+29
-21
lines changed
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
``RendererGTK3Cairo`` and ``RendererGTK4Cairo``
22
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3-
... have been deprecated. Use ``RendererCairo`` instead, which has gained the
4-
``set_context`` method.
3+
... have been deprecated. Use ``RendererCairo`` instead, which has gained
4+
the ``set_context`` method, which also auto-infers the size of the underlying
5+
surface.
6+
7+
``RendererCairo.set_ctx_from_surface`` and ``RendererCairo.set_width_height``
8+
have likewise been deprecated, in favor of ``set_context``.

lib/matplotlib/backends/backend_cairo.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,28 @@ def __init__(self, dpi):
132132
super().__init__()
133133

134134
def set_context(self, ctx):
135-
self.gc.ctx = _to_context(ctx)
135+
surface = ctx.get_target()
136+
if hasattr(surface, "get_width") and hasattr(surface, "get_height"):
137+
size = surface.get_width(), surface.get_height()
138+
elif hasattr(surface, "get_extents"): # GTK4 RecordingSurface.
139+
ext = surface.get_extents()
140+
size = ext.width, ext.height
141+
else: # vector surfaces.
142+
ctx.save()
143+
ctx.reset_clip()
144+
rect, *rest = ctx.copy_clip_rectangle_list()
145+
if rest:
146+
raise TypeError("Cannot infer surface size")
147+
size = rect.width, rect.height
148+
ctx.restore()
149+
self.gc.ctx = ctx
150+
self.width, self.height = size
136151

152+
@_api.deprecated("3.6", alternative="set_context")
137153
def set_ctx_from_surface(self, surface):
138154
self.gc.ctx = cairo.Context(surface)
139-
# Although it may appear natural to automatically call
140-
# `self.set_width_height(surface.get_width(), surface.get_height())`
141-
# here (instead of having the caller do so separately), this would fail
142-
# for PDF/PS/SVG surfaces, which have no way to report their extents.
143155

156+
@_api.deprecated("3.6")
144157
def set_width_height(self, width, height):
145158
self.width = width
146159
self.height = height
@@ -472,9 +485,8 @@ def print_rgba(self, fobj):
472485
def _get_printed_image_surface(self):
473486
self._renderer.dpi = self.figure.dpi
474487
width, height = self.get_width_height()
475-
self._renderer.set_width_height(width, height)
476488
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
477-
self._renderer.set_ctx_from_surface(surface)
489+
self._renderer.set_context(cairo.Context(surface))
478490
self.figure.draw(self._renderer)
479491
return surface
480492

@@ -514,8 +526,7 @@ def _save(self, fmt, fobj, *, orientation='portrait'):
514526
raise ValueError("Unknown format: {!r}".format(fmt))
515527

516528
self._renderer.dpi = self.figure.dpi
517-
self._renderer.set_width_height(width_in_points, height_in_points)
518-
self._renderer.set_ctx_from_surface(surface)
529+
self._renderer.set_context(cairo.Context(surface))
519530
ctx = self._renderer.gc.ctx
520531

521532
if orientation == 'landscape':

lib/matplotlib/backends/backend_gtk3cairo.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ def on_draw_event(self, widget, ctx):
2626
self.get_style_context(), ctx,
2727
allocation.x, allocation.y,
2828
allocation.width, allocation.height)
29-
self._renderer.set_width_height(
30-
allocation.width * scale, allocation.height * scale)
3129
self._renderer.dpi = self.figure.dpi
3230
self.figure.draw(self._renderer)
3331

lib/matplotlib/backends/backend_gtk4cairo.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ def on_draw_event(self, widget, ctx):
2727
self.get_style_context(), ctx,
2828
allocation.x, allocation.y,
2929
allocation.width, allocation.height)
30-
self._renderer.set_width_height(
31-
allocation.width * scale, allocation.height * scale)
3230
self._renderer.dpi = self.figure.dpi
3331
self.figure.draw(self._renderer)
3432

lib/matplotlib/backends/backend_qtcairo.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ def paintEvent(self, event):
1717
height = int(self.device_pixel_ratio * self.height())
1818
if (width, height) != self._renderer.get_canvas_width_height():
1919
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
20-
self._renderer.set_ctx_from_surface(surface)
21-
self._renderer.set_width_height(width, height)
20+
self._renderer.set_context(cairo.Context(surface))
2221
self._renderer.dpi = self.figure.dpi
2322
self.figure.draw(self._renderer)
2423
buf = self._renderer.gc.ctx.get_target().get_data()

lib/matplotlib/backends/backend_tkcairo.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ def draw(self):
1212
width = int(self.figure.bbox.width)
1313
height = int(self.figure.bbox.height)
1414
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
15-
self._renderer.set_ctx_from_surface(surface)
16-
self._renderer.set_width_height(width, height)
15+
self._renderer.set_context(cairo.Context(surface))
1716
self._renderer.dpi = self.figure.dpi
1817
self.figure.draw(self._renderer)
1918
buf = np.reshape(surface.get_data(), (height, width, 4))

lib/matplotlib/backends/backend_wxcairo.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ class FigureCanvasWxCairo(_FigureCanvasWxBase, FigureCanvasCairo):
2727
def draw(self, drawDC=None):
2828
size = self.figure.bbox.size.astype(int)
2929
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, *size)
30-
self._renderer.set_ctx_from_surface(surface)
31-
self._renderer.set_width_height(*size)
30+
self._renderer.set_context(cairo.Context(surface))
3231
self._renderer.dpi = self.figure.dpi
3332
self.figure.draw(self._renderer)
3433
self.bitmap = wxcairo.BitmapFromImageSurface(surface)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy