@@ -133,6 +133,9 @@ def __init__(self, dpi):
133133 cairo .ImageSurface (cairo .FORMAT_ARGB32 , 1 , 1 ))
134134 super ().__init__ ()
135135
136+ def set_context (self , ctx ):
137+ self .gc .ctx = _to_context (ctx )
138+
136139 def set_ctx_from_surface (self , surface ):
137140 self .gc .ctx = cairo .Context (surface )
138141 # Although it may appear natural to automatically call
@@ -414,6 +417,15 @@ def __init__(self, slices, data):
414417
415418
416419class FigureCanvasCairo (FigureCanvasBase ):
420+ @property
421+ def _renderer (self ):
422+ # In theory, _renderer should be set in __init__, but GUI canvas
423+ # subclasses (FigureCanvasFooCairo) don't always interact well with
424+ # multiple inheritance (FigureCanvasFoo inits but doesn't super-init
425+ # FigureCanvasCairo), so initialize it in the getter instead.
426+ if not hasattr (self , "_cached_renderer" ):
427+ self ._cached_renderer = RendererCairo (self .figure .dpi )
428+ return self ._cached_renderer
417429
418430 def copy_from_bbox (self , bbox ):
419431 surface = self ._renderer .gc .ctx .get_target ()
@@ -460,12 +472,12 @@ def print_rgba(self, fobj):
460472 print_raw = print_rgba
461473
462474 def _get_printed_image_surface (self ):
475+ self ._renderer .dpi = self .figure .dpi
463476 width , height = self .get_width_height ()
464- renderer = RendererCairo (self .figure .dpi )
465- renderer .set_width_height (width , height )
477+ self ._renderer .set_width_height (width , height )
466478 surface = cairo .ImageSurface (cairo .FORMAT_ARGB32 , width , height )
467- renderer .set_ctx_from_surface (surface )
468- self .figure .draw (renderer )
479+ self . _renderer .set_ctx_from_surface (surface )
480+ self .figure .draw (self . _renderer )
469481 return surface
470482
471483 def _save (self , fmt , fobj , * , orientation = 'portrait' ):
@@ -503,18 +515,17 @@ def _save(self, fmt, fobj, *, orientation='portrait'):
503515 else :
504516 raise ValueError ("Unknown format: {!r}" .format (fmt ))
505517
506- # surface.set_dpi() can be used
507- renderer = RendererCairo (self .figure .dpi )
508- renderer .set_width_height (width_in_points , height_in_points )
509- renderer .set_ctx_from_surface (surface )
510- ctx = renderer .gc .ctx
518+ self ._renderer .dpi = self .figure .dpi
519+ self ._renderer .set_width_height (width_in_points , height_in_points )
520+ self ._renderer .set_ctx_from_surface (surface )
521+ ctx = self ._renderer .gc .ctx
511522
512523 if orientation == 'landscape' :
513524 ctx .rotate (np .pi / 2 )
514525 ctx .translate (0 , - height_in_points )
515526 # Perhaps add an '%%Orientation: Landscape' comment?
516527
517- self .figure .draw (renderer )
528+ self .figure .draw (self . _renderer )
518529
519530 ctx .show_page ()
520531 surface .finish ()
0 commit comments