|
6 | 6 | import logging
|
7 | 7 | import math
|
8 | 8 | import weakref
|
| 9 | +try: |
| 10 | + from contextlib import nullcontext |
| 11 | +except ImportError: |
| 12 | + from contextlib import ExitStack as nullcontext # Py 3.6. |
9 | 13 |
|
10 | 14 | import numpy as np
|
11 | 15 |
|
@@ -891,21 +895,26 @@ def get_window_extent(self, renderer=None, dpi=None):
|
891 | 895 | #return _unit_box
|
892 | 896 | if not self.get_visible():
|
893 | 897 | return Bbox.unit()
|
894 |
| - if dpi is None: |
895 |
| - dpi = self.figure.dpi |
896 |
| - if self.get_text() == '': |
897 |
| - with cbook._setattr_cm(self.figure, dpi=dpi): |
| 898 | + if dpi is not None: |
| 899 | + dpi_context = cbook._setattr_cm(self.figure, dpi=dpi) |
| 900 | + else: |
| 901 | + # This should not be necessary, but causes subtle bugs with some |
| 902 | + # backends. |
| 903 | + # See https://github.com/matplotlib/matplotlib/issues/16926 |
| 904 | + dpi_context = contextlib.nullcontext() |
| 905 | + |
| 906 | + with dpi_context: |
| 907 | + if self.get_text() == '': |
898 | 908 | tx, ty = self._get_xy_display()
|
899 | 909 | return Bbox.from_bounds(tx, ty, 0, 0)
|
900 | 910 |
|
901 |
| - if renderer is not None: |
902 |
| - self._renderer = renderer |
903 |
| - if self._renderer is None: |
904 |
| - self._renderer = self.figure._cachedRenderer |
905 |
| - if self._renderer is None: |
906 |
| - raise RuntimeError('Cannot get window extent w/o renderer') |
| 911 | + if renderer is not None: |
| 912 | + self._renderer = renderer |
| 913 | + if self._renderer is None: |
| 914 | + self._renderer = self.figure._cachedRenderer |
| 915 | + if self._renderer is None: |
| 916 | + raise RuntimeError('Cannot get window extent w/o renderer') |
907 | 917 |
|
908 |
| - with cbook._setattr_cm(self.figure, dpi=dpi): |
909 | 918 | bbox, info, descent = self._get_layout(self._renderer)
|
910 | 919 | x, y = self.get_unitless_position()
|
911 | 920 | x, y = self.get_transform().transform((x, y))
|
|
0 commit comments