backend_wxagg.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import wx
  2. from .backend_agg import FigureCanvasAgg
  3. from .backend_wx import (
  4. _BackendWx, _FigureCanvasWxBase, FigureFrameWx,
  5. NavigationToolbar2Wx as NavigationToolbar2WxAgg)
  6. class FigureFrameWxAgg(FigureFrameWx):
  7. def get_canvas(self, fig):
  8. return FigureCanvasWxAgg(self, -1, fig)
  9. class FigureCanvasWxAgg(FigureCanvasAgg, _FigureCanvasWxBase):
  10. """
  11. The FigureCanvas contains the figure and does event handling.
  12. In the wxPython backend, it is derived from wxPanel, and (usually)
  13. lives inside a frame instantiated by a FigureManagerWx. The parent
  14. window probably implements a wxSizer to control the displayed
  15. control size - but we give a hint as to our preferred minimum
  16. size.
  17. """
  18. def draw(self, drawDC=None):
  19. """
  20. Render the figure using agg.
  21. """
  22. FigureCanvasAgg.draw(self)
  23. self.bitmap = _convert_agg_to_wx_bitmap(self.get_renderer(), None)
  24. self._isDrawn = True
  25. self.gui_repaint(drawDC=drawDC, origin='WXAgg')
  26. def blit(self, bbox=None):
  27. # docstring inherited
  28. if bbox is None:
  29. self.bitmap = _convert_agg_to_wx_bitmap(self.get_renderer(), None)
  30. self.gui_repaint()
  31. return
  32. srcBmp = _convert_agg_to_wx_bitmap(self.get_renderer(), None)
  33. srcDC = wx.MemoryDC()
  34. srcDC.SelectObject(srcBmp)
  35. destDC = wx.MemoryDC()
  36. destDC.SelectObject(self.bitmap)
  37. x = int(bbox.x0)
  38. y = int(self.bitmap.GetHeight() - bbox.y1)
  39. destDC.Blit(x, y, int(bbox.width), int(bbox.height), srcDC, x, y)
  40. destDC.SelectObject(wx.NullBitmap)
  41. srcDC.SelectObject(wx.NullBitmap)
  42. self.gui_repaint()
  43. def _convert_agg_to_wx_bitmap(agg, bbox):
  44. """
  45. Convert the region of the agg buffer bounded by bbox to a wx.Bitmap. If
  46. bbox is None, the entire buffer is converted.
  47. Note: agg must be a backend_agg.RendererAgg instance.
  48. """
  49. if bbox is None:
  50. # agg => rgba buffer -> bitmap
  51. return wx.Bitmap.FromBufferRGBA(int(agg.width), int(agg.height),
  52. agg.buffer_rgba())
  53. else:
  54. # agg => rgba buffer -> bitmap => clipped bitmap
  55. srcBmp = wx.Bitmap.FromBufferRGBA(int(agg.width), int(agg.height),
  56. agg.buffer_rgba())
  57. srcDC = wx.MemoryDC()
  58. srcDC.SelectObject(srcBmp)
  59. destBmp = wx.Bitmap(int(bbox.width), int(bbox.height))
  60. destDC = wx.MemoryDC()
  61. destDC.SelectObject(destBmp)
  62. x = int(bbox.x0)
  63. y = int(int(agg.height) - bbox.y1)
  64. destDC.Blit(0, 0, int(bbox.width), int(bbox.height), srcDC, x, y)
  65. srcDC.SelectObject(wx.NullBitmap)
  66. destDC.SelectObject(wx.NullBitmap)
  67. return destBmp
  68. @_BackendWx.export
  69. class _BackendWxAgg(_BackendWx):
  70. FigureCanvas = FigureCanvasWxAgg
  71. _frame_class = FigureFrameWxAgg