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

Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Make animation work in OSX backend
  • Loading branch information
mdboom committed Mar 21, 2016
commit 142d9fc1053f3345e5d6af13eca9acc2cda8a2b2
3 changes: 2 additions & 1 deletion lib/matplotlib/animation.py
Original file line number Diff line number Diff line change
Expand Up @@ -998,7 +998,8 @@ def _blit_clear(self, artists, bg_cache):
# cache and restore.
axes = set(a.axes for a in artists)
for a in axes:
a.figure.canvas.restore_region(bg_cache[a])
if a in bg_cache:
a.figure.canvas.restore_region(bg_cache[a])

def _setup_blit(self):
# Setting up the blit requires: a cache of the background for the
Expand Down
12 changes: 7 additions & 5 deletions lib/matplotlib/backends/backend_agg.py
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,7 @@ def print_raw(self, filename_or_obj, *args, **kwargs):
finally:
if close:
filename_or_obj.close()
renderer.dpi = original_dpi
renderer.dpi = original_dpi
print_rgba = print_raw

def print_png(self, filename_or_obj, *args, **kwargs):
Expand All @@ -529,16 +529,18 @@ def print_png(self, filename_or_obj, *args, **kwargs):
finally:
if close:
filename_or_obj.close()
renderer.dpi = original_dpi
renderer.dpi = original_dpi

def print_to_buffer(self):
FigureCanvasAgg.draw(self)
renderer = self.get_renderer()
original_dpi = renderer.dpi
renderer.dpi = self.figure.dpi
result = (renderer._renderer.buffer_rgba(),
(int(renderer.width), int(renderer.height)))
renderer.dpi = original_dpi
try:
result = (renderer._renderer.buffer_rgba(),
(int(renderer.width), int(renderer.height)))
finally:
renderer.dpi = original_dpi
return result

if _has_pil:
Expand Down
78 changes: 31 additions & 47 deletions lib/matplotlib/backends/backend_macosx.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import matplotlib
from matplotlib.backends import _macosx

from .backend_agg import RendererAgg
from .backend_agg import RendererAgg, FigureCanvasAgg


class Show(ShowBase):
Expand Down Expand Up @@ -83,7 +83,7 @@ class TimerMac(_macosx.Timer, TimerBase):
# completely implemented at the C-level (in _macosx.Timer)


class FigureCanvasMac(_macosx.FigureCanvas, FigureCanvasBase):
class FigureCanvasMac(_macosx.FigureCanvas, FigureCanvasAgg):
"""
The canvas the figure renders into. Calls the draw and print fig
methods, creates the renderers, etc...
Expand All @@ -98,21 +98,19 @@ class FigureCanvasMac(_macosx.FigureCanvas, FigureCanvasBase):
key_press_event, and key_release_event are called from there.
"""

filetypes = FigureCanvasBase.filetypes.copy()
filetypes['bmp'] = 'Windows bitmap'
filetypes['jpeg'] = 'JPEG'
filetypes['jpg'] = 'JPEG'
filetypes['gif'] = 'Graphics Interchange Format'
filetypes['tif'] = 'Tagged Image Format File'
filetypes['tiff'] = 'Tagged Image Format File'

def __init__(self, figure):
FigureCanvasBase.__init__(self, figure)
width, height = self.get_width_height()
_macosx.FigureCanvas.__init__(self, width, height)
self._needs_draw = True
self._device_scale = 1.0

def _set_device_scale(self, value):
if self._device_scale != value:
self.figure.dpi = self.figure.dpi / self._device_scale * value
self._device_scale = value

@property
def renderer(self):
def get_renderer(self, cleared=False):
l, b, w, h = self.figure.bbox.bounds
key = w, h, self.figure.dpi
try:
Expand All @@ -125,62 +123,48 @@ def renderer(self):
if need_new_renderer:
self._renderer = RendererAgg(w, h, self.figure.dpi)
self._lastKey = key
elif cleared:
self._renderer.clear()

return self._renderer

def _draw(self, device_scale):
def _draw(self):
renderer = self.get_renderer()

if not self._needs_draw:
return renderer

figure = self.figure

orig_dpi = figure.dpi
try:
figure.dpi *= device_scale
renderer = self.renderer
figure.draw(renderer)
finally:
figure.dpi = orig_dpi

self._needs_draw = False

return renderer

def draw(self):
self._draw()
self.invalidate()

def draw_idle(self, *args, **kwargs):
self._needs_draw = True
self.invalidate()

def blit(self, bbox):
self.invalidate()

def resize(self, width, height):
dpi = self.figure.dpi
width /= dpi
height /= dpi
self.figure.set_size_inches(width, height)
self.figure.set_size_inches(width * self._device_scale,
height * self._device_scale)
FigureCanvasBase.resize_event(self)

def _print_bitmap(self, filename, *args, **kwargs):
# In backend_bases.py, print_figure changes the dpi of the figure.
# But since we are essentially redrawing the picture, we need the
# original dpi. Pick it up from the renderer.
dpi = kwargs['dpi']
old_dpi = self.figure.dpi
self.figure.dpi = self.renderer.dpi
width, height = self.figure.get_size_inches()
width, height = width*dpi, height*dpi
filename = six.text_type(filename)
self.write_bitmap(filename, width, height, dpi)
self.figure.dpi = old_dpi

def print_bmp(self, filename, *args, **kwargs):
self._print_bitmap(filename, *args, **kwargs)

def print_jpg(self, filename, *args, **kwargs):
self._print_bitmap(filename, *args, **kwargs)

def print_jpeg(self, filename, *args, **kwargs):
self._print_bitmap(filename, *args, **kwargs)

def print_tif(self, filename, *args, **kwargs):
self._print_bitmap(filename, *args, **kwargs)

def print_tiff(self, filename, *args, **kwargs):
self._print_bitmap(filename, *args, **kwargs)

def print_gif(self, filename, *args, **kwargs):
self._print_bitmap(filename, *args, **kwargs)
self.draw_idle()

def new_timer(self, *args, **kwargs):
"""
Expand Down
13 changes: 9 additions & 4 deletions src/_macosx.m
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ - (int)index;

static CGFloat _get_device_scale(CGContextRef cr)
{
CGSize pixelSize = CGContextConvertSizeToDeviceSpace(cr, CGSizeMake(1,1));
CGSize pixelSize = CGContextConvertSizeToDeviceSpace(cr, CGSizeMake(1, 1));
return pixelSize.width;
}

Expand Down Expand Up @@ -2194,12 +2194,10 @@ - (void)setCanvas: (PyObject*)newCanvas
canvas = newCanvas;
}


static void _buffer_release(void* info, const void* data, size_t size) {
PyBuffer_Release((Py_buffer *)info);
}


static int _copy_agg_buffer(CGContextRef cr, PyObject *renderer)
{
Py_buffer buffer;
Expand Down Expand Up @@ -2276,7 +2274,14 @@ -(void)drawRect:(NSRect)rect

CGContextRef cr = [[NSGraphicsContext currentContext] graphicsPort];

renderer = PyObject_CallMethod(canvas, "_draw", "d", _get_device_scale(cr));
double device_scale = _get_device_scale(cr);

if (!PyObject_CallMethod(canvas, "_set_device_scale", "d", device_scale, NULL)) {
PyErr_Print();
goto exit;
}

renderer = PyObject_CallMethod(canvas, "_draw", "", NULL);
if (!renderer)
{
PyErr_Print();
Expand Down