8000 Make RendererCairo auto-infer surface size. · matplotlib/matplotlib@63aaf78 · GitHub
[go: up one dir, main page]

Skip to content

Commit 63aaf78

Browse files
committed
Make RendererCairo auto-infer surface size.
This avoids a redundant set_width_height on the caller side, and prevents the width/height from getting out of sync from the actual surface size.
1 parent ec99c15 commit 63aaf78

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
@@ -134,15 +134,28 @@ def __init__(self, dpi):
134134
super().__init__()
135135

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

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

158+
@_api.deprecated("3.6")
146159
def set_width_height(self, width, height):
147160
self.width = width
148161
self.height = height
@@ -474,9 +487,8 @@ def print_rgba(self, fobj):
474487
def _get_printed_image_surface(self):
475488
self._renderer.dpi = self.figure.dpi
476489
width, height = self.get_width_height()
477-
self._renderer.set_width_height(width, height)
478490
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
479-
self._renderer.set_ctx_from_surface(surface)
491+
self._renderer.set_context(cairo.Context(surface))
480492
self.figure.draw(self._renderer)
481493
return surface
482494

@@ -516,8 +528,7 @@ def _save(self, fmt, fobj, *, orientation='portrait'):
516528
raise ValueError("Unknown format: {!r}".format(fmt))
517529

518530
self._renderer.dpi = self.figure.dpi
519-
self._renderer.set_width_height(width_in_points, height_in_points)
520-
self._renderer.set_ctx_from_surface(surface)
531+
self._renderer.set_context(cairo.Context(surface))
521532
ctx = self._renderer.gc.ctx
522533

523534
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
@@ -21,8 +21,7 @@ def paintEvent(self, event):
2121
height = int(self.device_pixel_ratio * self.height())
2222
if (width, height) != self._renderer.get_canvas_width_height():
2323
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
24-
self._renderer.set_ctx_from_surface(surface)
25-
self._renderer.set_width_height(width, height)
24+
self._renderer.set_context(cairo.Context(surface))
2625
self._renderer.dpi = self.figure.dpi
2726
self.figure.draw(self._renderer)
2827
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
@@ -24,8 +24,7 @@ class FigureCanvasWxCairo(_FigureCanvasWxBase, FigureCanvasCairo):
2424
def draw(self, drawDC=None):
2525
size = self.figure.bbox.size.astype(int)
2626
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, *size)
27-
self._renderer.set_ctx_from_surface(surface)
28-
self._renderer.set_width_height(*size)
27+
self._renderer.set_context(cairo.Context(surface))
2928
self._renderer.dpi = self.figure.dpi
3029
self.figure.draw(self._renderer)
3130
self.bitmap = wxcairo.BitmapFromImageSurface(surface)

0 commit comments

Comments
 (0)
0