|
8 | 8 | from . import backend_agg, backend_gtk4
|
9 | 9 | from .backend_cairo import cairo
|
10 | 10 | from .backend_gtk4 import Gtk, _BackendGTK4
|
11 |
| -from matplotlib import transforms |
12 | 11 |
|
13 | 12 |
|
14 | 13 | class FigureCanvasGTK4Agg(backend_gtk4.FigureCanvasGTK4,
|
15 | 14 | backend_agg.FigureCanvasAgg):
|
16 | 15 | def __init__(self, figure):
|
17 | 16 | backend_gtk4.FigureCanvasGTK4.__init__(self, figure)
|
18 |
| - self._bbox_queue = [] |
19 | 17 |
|
20 | 18 | def on_draw_event(self, widget, ctx):
|
21 | 19 | scale = self.device_pixel_ratio
|
22 | 20 | allocation = self.get_allocation()
|
23 |
| - w = allocation.width * scale |
24 |
| - h = allocation.height * scale |
25 | 21 |
|
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 |
| 22 | + Gtk.render_background( |
| 23 | + self.get_style_context(), ctx, |
| 24 | + allocation.x, allocation.y, |
| 25 | + allocation.width, allocation.height) |
34 | 26 |
|
35 | 27 | ctx = backend_cairo._to_context(ctx)
|
36 | 28 |
|
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 = [] |
| 29 | + buf = cbook._unmultiplied_rgba8888_to_premultiplied_argb32( |
| 30 | + np.asarray(self.renderer.buffer_rgba())) |
| 31 | + height, width, _ = buf.shape |
| 32 | + image = cairo.ImageSurface.create_for_data( |
| 33 | + buf.ravel().data, cairo.FORMAT_ARGB32, width, height) |
| 34 | + image.set_device_scale(scale, scale) |
| 35 | + ctx.set_source_surface(image, 0, 0) |
| 36 | + ctx.paint() |
53 | 37 |
|
54 | 38 | return False
|
55 | 39 |
|
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 |
| - |
72 | 40 | def draw(self):
|
73 | 41 | backend_agg.FigureCanvasAgg.draw(self)
|
74 | 42 | super().draw()
|
|
0 commit comments