1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- import numpy as np
- from .. import cbook
- try:
- from . import backend_cairo
- except ImportError as e:
- raise ImportError('backend Gtk3Agg requires cairo') from e
- from . import backend_agg, backend_gtk3
- from .backend_cairo import cairo
- from .backend_gtk3 import Gtk, _BackendGTK3
- from matplotlib import transforms
- class FigureCanvasGTK3Agg(backend_gtk3.FigureCanvasGTK3,
- backend_agg.FigureCanvasAgg):
- def __init__(self, figure):
- backend_gtk3.FigureCanvasGTK3.__init__(self, figure)
- self._bbox_queue = []
- def _renderer_init(self):
- pass
- def _render_figure(self, width, height):
- backend_agg.FigureCanvasAgg.draw(self)
- def on_draw_event(self, widget, ctx):
- """GtkDrawable draw event, like expose_event in GTK 2.X.
- """
- allocation = self.get_allocation()
- w, h = allocation.width, allocation.height
- 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
- 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)
- ctx.set_source_surface(image, x, y)
- ctx.paint()
- if len(self._bbox_queue):
- self._bbox_queue = []
- 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
- allocation = self.get_allocation()
- x = int(bbox.x0)
- y = allocation.height - int(bbox.y1)
- width = int(bbox.x1) - int(bbox.x0)
- height = int(bbox.y1) - int(bbox.y0)
- self._bbox_queue.append(bbox)
- self.queue_draw_area(x, y, width, height)
- def draw(self):
- if self.get_visible() and self.get_mapped():
- allocation = self.get_allocation()
- self._render_figure(allocation.width, allocation.height)
- super().draw()
- def print_png(self, filename, *args, **kwargs):
- # Do this so we can save the resolution of figure in the PNG file
- agg = self.switch_backends(backend_agg.FigureCanvasAgg)
- return agg.print_png(filename, *args, **kwargs)
- class FigureManagerGTK3Agg(backend_gtk3.FigureManagerGTK3):
- pass
- @_BackendGTK3.export
- class _BackendGTK3Cairo(_BackendGTK3):
- FigureCanvas = FigureCanvasGTK3Agg
- FigureManager = FigureManagerGTK3Agg
|