diff --git a/lib/matplotlib/backends/backend_gtk4.py b/lib/matplotlib/backends/backend_gtk4.py index 3eb7735c1edb..2a589ee691a3 100644 --- a/lib/matplotlib/backends/backend_gtk4.py +++ b/lib/matplotlib/backends/backend_gtk4.py @@ -52,6 +52,7 @@ def _mpl_to_gtk_cursor(mpl_cursor): class FigureCanvasGTK4(Gtk.DrawingArea, FigureCanvasBase): required_interactive_framework = "gtk4" + supports_blit = False _timer_cls = TimerGTK4 _context_is_scaled = False diff --git a/lib/matplotlib/backends/backend_gtk4agg.py b/lib/matplotlib/backends/backend_gtk4agg.py index d47dd07fee3b..58f085e85d8f 100644 --- a/lib/matplotlib/backends/backend_gtk4agg.py +++ b/lib/matplotlib/backends/backend_gtk4agg.py @@ -8,67 +8,35 @@ from . import backend_agg, backend_gtk4 from .backend_cairo import cairo from .backend_gtk4 import Gtk, _BackendGTK4 -from matplotlib import transforms class FigureCanvasGTK4Agg(backend_gtk4.FigureCanvasGTK4, backend_agg.FigureCanvasAgg): def __init__(self, figure): backend_gtk4.FigureCanvasGTK4.__init__(self, figure) - self._bbox_queue = [] def on_draw_event(self, widget, ctx): scale = self.device_pixel_ratio allocation = self.get_allocation() - w = allocation.width * scale - h = allocation.height * scale - if not len(self._bbox_queue): - Gtk.render_background( - self.get_style_context(), ctx, - allocation.x, allocation.y, - allocation.width, allocation.height) - bbox_queue = [transforms.Bbox([[0, 0], [w, h]])] - else: - bbox_queue = self._bbox_queue + Gtk.render_background( + self.get_style_context(), ctx, + allocation.x, allocation.y, + allocation.width, allocation.height) ctx = backend_cairo._to_context(ctx) - for bbox in bbox_queue: - x = int(bbox.x0) - y = h - int(bbox.y1) - width = int(bbox.x1) - int(bbox.x0) - height = int(bbox.y1) - int(bbox.y0) - - buf = cbook._unmultiplied_rgba8888_to_premultiplied_argb32( - np.asarray(self.copy_from_bbox(bbox))) - image = cairo.ImageSurface.create_for_data( - buf.ravel().data, cairo.FORMAT_ARGB32, width, height) - image.set_device_scale(scale, scale) - ctx.set_source_surface(image, x / scale, y / scale) - ctx.paint() - - if len(self._bbox_queue): - self._bbox_queue = [] + buf = cbook._unmultiplied_rgba8888_to_premultiplied_argb32( + np.asarray(self.renderer.buffer_rgba())) + height, width, _ = buf.shape + image = cairo.ImageSurface.create_for_data( + buf.ravel().data, cairo.FORMAT_ARGB32, width, height) + image.set_device_scale(scale, scale) + ctx.set_source_surface(image, 0, 0) + ctx.paint() return False - def blit(self, bbox=None): - # If bbox is None, blit the entire canvas to gtk. Otherwise - # blit only the area defined by the bbox. - if bbox is None: - bbox = self.figure.bbox - - scale = self.device_pixel_ratio - allocation = self.get_allocation() - x = int(bbox.x0 / scale) - y = allocation.height - int(bbox.y1 / scale) - width = (int(bbox.x1) - int(bbox.x0)) // scale - height = (int(bbox.y1) - int(bbox.y0)) // scale - - self._bbox_queue.append(bbox) - self.queue_draw_area(x, y, width, height) - def draw(self): backend_agg.FigureCanvasAgg.draw(self) super().draw()