@@ -1516,10 +1516,15 @@ def __init__(self, name, canvas, key, x=0, y=0, guiEvent=None):
1516
1516
self .key = key
1517
1517
1518
1518
1519
- def _get_renderer (figure , print_method ):
1519
+ def _get_renderer (figure , print_method , * , draw_disabled = False ):
1520
1520
"""
1521
1521
Get the renderer that would be used to save a `~.Figure`, and cache it on
1522
1522
the figure.
1523
+
1524
+ If *draw_disabled* is True, additionally replace draw_foo methods on
1525
+ *renderer* by no-ops. This is used by the tight-bbox-saving renderer,
1526
+ which needs to walk through the artist tree to compute the tight-bbox, but
1527
+ for which the output file may be closed early.
1523
1528
"""
1524
1529
# This is implemented by triggering a draw, then immediately jumping out of
1525
1530
# Figure.draw() by raising an exception.
@@ -1533,8 +1538,14 @@ def _draw(renderer): raise Done(renderer)
1533
1538
try :
1534
1539
print_method (io .BytesIO ())
1535
1540
except Done as exc :
1536
- figure ._cachedRenderer , = exc .args
1537
- return figure ._cachedRenderer
1541
+ renderer , = figure ._cachedRenderer , = exc .args
1542
+
1543
+ if draw_disabled :
1544
+ for meth_name in dir (RendererBase ):
1545
+ if meth_name .startswith ("draw_" ):
1546
+ setattr (renderer , meth_name , lambda * args , ** kwargs : None )
1547
+
1548
+ return renderer
1538
1549
1539
1550
1540
1551
def _is_non_interactive_terminal_ipython (ip ):
@@ -2063,7 +2074,8 @@ def print_figure(self, filename, dpi=None, facecolor=None, edgecolor=None,
2063
2074
renderer = _get_renderer (
2064
2075
self .figure ,
2065
2076
functools .partial (
2066
- print_method , dpi = dpi , orientation = orientation ))
2077
+ print_method , dpi = dpi , orientation = orientation ),
2078
+ draw_disabled = True )
2067
2079
self .figure .draw (renderer )
2068
2080
bbox_artists = kwargs .pop ("bbox_extra_artists" , None )
2069
2081
bbox_inches = self .figure .get_tightbbox (renderer ,
0 commit comments