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

Skip to content

Commit ebab29a

Browse files
committed
Disable blitting on GTK4 backends
It is not possible to queue a draw for a subregion of a widget, so this crashes. Since 3.5 is feature frozen, disable blitting for now to make animations work.
1 parent 7fa4c7f commit ebab29a

File tree

2 files changed

+14
-43
lines changed

2 files changed

+14
-43
lines changed

lib/matplotlib/backends/backend_gtk4.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def _mpl_to_gtk_cursor(mpl_cursor):
5151

5252
class FigureCanvasGTK4(Gtk.DrawingArea, FigureCanvasBase):
5353
required_interactive_framework = "gtk4"
54+
supports_blit = False
5455
_timer_cls = TimerGTK4
5556
_context_is_scaled = False
5657

lib/matplotlib/backends/backend_gtk4agg.py

Lines changed: 13 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -15,60 +15,30 @@ class FigureCanvasGTK4Agg(backend_gtk4.FigureCanvasGTK4,
1515
backend_agg.FigureCanvasAgg):
1616
def __init__(self, figure):
1717
backend_gtk4.FigureCanvasGTK4.__init__(self, figure)
18-
self._bbox_queue = []
1918

2019
def on_draw_event(self, widget, ctx):
2120
scale = self.device_pixel_ratio
2221
allocation = self.get_allocation()
23-
w = allocation.width * scale
24-
h = allocation.height * scale
22+
width = int(allocation.width * scale)
23+
height = int(allocation.height * scale)
2524

26-
if not len(self._bbox_queue):
27-
Gtk.render_background(
28-
self.get_style_context(), ctx,
29-
allocation.x, allocation.y,
30-
allocation.width, allocation.height)
31-
bbox_queue = [transforms.Bbox([[0, 0], [w, h]])]
32-
else:
33-
bbox_queue = self._bbox_queue
25+
Gtk.render_background(
26+
self.get_style_context(), ctx,
27+
allocation.x, allocation.y,
28+
allocation.width, allocation.height)
3429

3530
ctx = backend_cairo._to_context(ctx)
3631

37-
for bbox in bbox_queue:
38-
x = int(bbox.x0)
39-
y = h - int(bbox.y1)
40-
width = int(bbox.x1) - int(bbox.x0)
41-
height = int(bbox.y1) - int(bbox.y0)
42-
43-
buf = cbook._unmultiplied_rgba8888_to_premultiplied_argb32(
44-
np.asarray(self.copy_from_bbox(bbox)))
45-
image = cairo.ImageSurface.create_for_data(
46-
buf.ravel().data, cairo.FORMAT_ARGB32, width, height)
47-
image.set_device_scale(scale, scale)
48-
ctx.set_source_surface(image, x / scale, y / scale)
49-
ctx.paint()
50-
51-
if len(self._bbox_queue):
52-
self._bbox_queue = []
32+
buf = cbook._unmultiplied_rgba8888_to_premultiplied_argb32(
33+
np.asarray(self.copy_from_bbox([[0, 0], [width, height]])))
34+
image = cairo.ImageSurface.create_for_data(
35+
buf.ravel().data, cairo.FORMAT_ARGB32, width, height)
36+
image.set_device_scale(scale, scale)
37+
ctx.set_source_surface(image, 0, 0)
38+
ctx.paint()
5339

5440
return False
5541

56-
def blit(self, bbox=None):
57-
# If bbox is None, blit the entire canvas to gtk. Otherwise
58-
# blit only the area defined by the bbox.
59-
if bbox is None:
60-
bbox = self.figure.bbox
61-
62-
scale = self.device_pixel_ratio
63-
allocation = self.get_allocation()
64-
x = int(bbox.x0 / scale)
65-
y = allocation.height - int(bbox.y1 / scale)
66-
width = (int(bbox.x1) - int(bbox.x0)) // scale
67-
height = (int(bbox.y1) - int(bbox.y0)) // scale
68-
69-
self._bbox_queue.append(bbox)
70-
self.queue_draw_area(x, y, width, height)
71-
7242
def draw(self):
7343
backend_agg.FigureCanvasAgg.draw(self)
7444
super().draw()

0 commit comments

Comments
 (0)