From 2b50a5cafba16c0636b666284e1aaeddc0d6080e Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Fri, 16 Sep 2022 11:29:51 +0200 Subject: [PATCH] Inherit OffsetBox.get_window_extent. Adjust OffsetBox.get_window_extent to use get_extent (which is typically redefined in subclasses) instead of get_extent_offsets (which is not), and make it check whether the current class' get_offset takes any arguments or not (which is not consistent, but fixing that requires some backcompat work). Also set the offset-getter of AnchoredOffsetbox as a fixed method on the class, rather than dynamicaly setting in that class' get_extent_offset. These changes then let us inherit the implementation of OffsetBox.get_window_extent across most subclasses instead of having to copy-paste it again and again. --- lib/matplotlib/offsetbox.py | 67 +++++++------------------------------ 1 file changed, 13 insertions(+), 54 deletions(-) diff --git a/lib/matplotlib/offsetbox.py b/lib/matplotlib/offsetbox.py index 25cab904b77c..89bd3550f3a6 100644 --- a/lib/matplotlib/offsetbox.py +++ b/lib/matplotlib/offsetbox.py @@ -350,8 +350,12 @@ def get_window_extent(self, renderer=None): # docstring inherited if renderer is None: renderer = self.figure._get_renderer() - w, h, xd, yd, offsets = self.get_extent_offsets(renderer) - px, py = self.get_offset(w, h, xd, yd, renderer) + w, h, xd, yd = self.get_extent(renderer) + # Some subclasses redefine get_offset to take no args. + try: + px, py = self.get_offset(w, h, xd, yd, renderer) + except TypeError: + px, py = self.get_offset() return mtransforms.Bbox.from_bounds(px - xd, py - yd, w, h) def draw(self, renderer): @@ -636,15 +640,6 @@ def get_offset(self): """Return offset of the container.""" return self._offset - def get_window_extent(self, renderer=None): - # docstring inherited - if renderer is None: - renderer = self.figure._get_renderer() - w, h, xd, yd = self.get_extent(renderer) - ox, oy = self.get_offset() # w, h, xd, yd) - - return mtransforms.Bbox.from_bounds(ox - xd, oy - yd, w, h) - def get_extent(self, renderer): """Return width, height, xdescent, ydescent of box.""" dpi_cor = renderer.points_to_pixels(1.) @@ -773,14 +768,6 @@ def get_offset(self): """Return offset of the container.""" return self._offset - def get_window_extent(self, renderer=None): - # docstring inherited - if renderer is None: - renderer = self.figure._get_renderer() - w, h, xd, yd = self.get_extent(renderer) - ox, oy = self.get_offset() - return mtransforms.Bbox.from_bounds(ox - xd, oy - yd, w, h) - def get_extent(self, renderer): _, h_, d_ = renderer.get_text_width_height_descent( "lp", self._text._fontproperties, @@ -876,14 +863,6 @@ def get_offset(self): """Return offset of the container.""" return self._offset - def get_window_extent(self, renderer=None): - # docstring inherited - if renderer is None: - renderer = self.figure._get_renderer() - w, h, xd, yd = self.get_extent(renderer) - ox, oy = self.get_offset() # w, h, xd, yd) - return mtransforms.Bbox.from_bounds(ox - xd, oy - yd, w, h) - def get_extent(self, renderer): # clear the offset transforms _off = self.offset_transform.get_matrix() # to be restored later @@ -1061,26 +1040,14 @@ def set_bbox_to_anchor(self, bbox, transform=None): self._bbox_to_anchor_transform = transform self.stale = True - def get_window_extent(self, renderer=None): + def get_offset(self, width, height, xdescent, ydescent, renderer): # docstring inherited - if renderer is None: - renderer = self.figure._get_renderer() - - # Update the offset func, which depends on the dpi of the renderer - # (because of the padding). - fontsize = renderer.points_to_pixels(self.prop.get_size_in_points()) - - def _offset(w, h, xd, yd, renderer): - bbox = Bbox.from_bounds(0, 0, w, h) - pad = self.borderpad * fontsize - bbox_to_anchor = self.get_bbox_to_anchor() - x0, y0 = _get_anchored_bbox(self.loc, bbox, bbox_to_anchor, pad) - return x0 + xd, y0 + yd - - self.set_offset(_offset) - w, h, xd, yd = self.get_extent(renderer) - ox, oy = self.get_offset(w, h, xd, yd, renderer) - return Bbox.from_bounds(ox - xd, oy - yd, w, h) + bbox = Bbox.from_bounds(0, 0, width, height) + pad = (self.borderpad + * renderer.points_to_pixels(self.prop.get_size_in_points())) + bbox_to_anchor = self.get_bbox_to_anchor() + x0, y0 = _get_anchored_bbox(self.loc, bbox, bbox_to_anchor, pad) + return x0 + xdescent, y0 + ydescent def update_frame(self, bbox, fontsize=None): self.patch.set_bounds(bbox.bounds) @@ -1220,14 +1187,6 @@ def get_offset(self): def get_children(self): return [self.image] - def get_window_extent(self, renderer=None): - # docstring inherited - if renderer is None: - renderer = self.figure._get_renderer() - w, h, xd, yd = self.get_extent(renderer) - ox, oy = self.get_offset() - return mtransforms.Bbox.from_bounds(ox - xd, oy - yd, w, h) - def get_extent(self, renderer): if self._dpi_cor: # True, do correction dpi_cor = renderer.points_to_pixels(1.)