@@ -133,6 +133,9 @@ def __init__(self, dpi):
133
133
cairo .ImageSurface (cairo .FORMAT_ARGB32 , 1 , 1 ))
134
134
super ().__init__ ()
135
135
136
+ def set_context (self , ctx ):
137
+ self .gc .ctx = _to_context (ctx )
138
+
136
139
def set_ctx_from_surface (self , surface ):
137
140
self .gc .ctx = cairo .Context (surface )
138
141
# Although it may appear natural to automatically call
@@ -414,6 +417,15 @@ def __init__(self, slices, data):
414
417
415
418
416
419
class 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
417
429
418
430
def copy_from_bbox (self , bbox ):
419
431
surface = self ._renderer .gc .ctx .get_target ()
@@ -460,12 +472,12 @@ def print_rgba(self, fobj):
460
472
print_raw = print_rgba
461
473
462
474
def _get_printed_image_surface (self ):
475
+ self ._renderer .dpi = self .figure .dpi
463
476
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 )
466
478
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 )
469
481
return surface
470
482
471
483
def _save (self , fmt , fobj , * , orientation = 'portrait' ):
@@ -503,18 +515,17 @@ def _save(self, fmt, fobj, *, orientation='portrait'):
503
515
else :
504
516
raise ValueError ("Unknown format: {!r}" .format (fmt ))
505
517
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
511
522
512
523
if orientation == 'landscape' :
513
524
ctx .rotate (np .pi / 2 )
514
525
ctx .translate (0 , - height_in_points )
515
526
# Perhaps add an '%%Orientation: Landscape' comment?
516
527
517
- self .figure .draw (renderer )
528
+ self .figure .draw (self . _renderer )
518
529
519
530
ctx .show_page ()
520
531
surface .finish ()
0 commit comments