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

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)