From 406fe59242ad288bcd9f9fe663b227620eacd344 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 May 2022 01:57:13 +0100 Subject: [PATCH] deprecate font.getsize and related functions --- src/PIL/ImageDraw.py | 66 +++++++++++++++++++++++++++++++++++--------- src/PIL/ImageFont.py | 27 +++++++++++++++--- 2 files changed, 76 insertions(+), 17 deletions(-) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 3824626bd..4e5ee24b7 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -34,6 +34,7 @@ import math import numbers from . import Image, ImageColor +from ._deprecate import deprecate """ A simple 2D drawing interface for PIL images. @@ -372,6 +373,18 @@ class ImageDraw: return text.split(split_character) + def _multiline_spacing(self, font, spacing, stroke_width): + # this can be replaced with self.textbbox(...)[3] when textsize is removed + return ( + self.textsize( + "A", + font=font, + stroke_width=stroke_width, + __internal__=True, + )[1] + + spacing + ) + def text( self, xy, @@ -511,9 +524,7 @@ class ImageDraw: widths = [] max_width = 0 lines = self._multiline_split(text) - line_spacing = ( - self.textsize("A", font=font, stroke_width=stroke_width)[1] + spacing - ) + line_spacing = self._multiline_spacing(font, spacing, stroke_width) for line in lines: line_width = self.textlength( line, font, direction=direction, features=features, language=language @@ -571,16 +582,33 @@ class ImageDraw: features=None, language=None, stroke_width=0, + __internal__=False, ): """Get the size of a given string, in pixels.""" + if not __internal__: + deprecate("textsize", 10, "textbbox or textlength") if self._multiline_check(text): return self.multiline_textsize( - text, font, spacing, direction, features, language, stroke_width + text, + font, + spacing, + direction, + features, + language, + stroke_width, + __internal__=True, ) if font is None: font = self.getfont() - return font.getsize(text, direction, features, language, stroke_width) + return font.getsize( + text, + direction, + features, + language, + stroke_width, + __internal__=True, + ) def multiline_textsize( self, @@ -591,15 +619,23 @@ class ImageDraw: features=None, language=None, stroke_width=0, + __internal__=False, ): + if not __internal__: + deprecate("multiline_textsize", 10, "multiline_textbbox") max_width = 0 lines = self._multiline_split(text) - line_spacing = ( - self.textsize("A", font=font, stroke_width=stroke_width)[1] + spacing - ) + line_spacing = self._multiline_spacing(font, spacing, stroke_width) for line in lines: line_width, line_height = self.textsize( - line, font, spacing, direction, features, language, stroke_width + line, + font, + spacing, + direction, + features, + language, + stroke_width, + __internal__=True, ) max_width = max(max_width, line_width) return max_width, len(lines) * line_spacing - spacing @@ -625,8 +661,14 @@ class ImageDraw: try: return font.getlength(text, mode, direction, features, language) except AttributeError: + deprecate("textlength support for fonts without getlength", 10) size = self.textsize( - text, font, direction=direction, features=features, language=language + text, + font, + direction=direction, + features=features, + language=language, + __internal__=True, ) if direction == "ttb": return size[1] @@ -704,9 +746,7 @@ class ImageDraw: widths = [] max_width = 0 lines = self._multiline_split(text) - line_spacing = ( - self.textsize("A", font=font, stroke_width=stroke_width)[1] + spacing - ) + line_spacing = self._multiline_spacing(font, spacing, stroke_width) for line in lines: line_width = self.textlength( line, diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index 681b75d44..38fc24d74 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -143,6 +143,8 @@ class ImageFont: :return: (width, height) """ + if not kwargs.get("__internal__"): + deprecate("getsize", 10, "getbbox or getlength") return self.font.getsize(text) def getmask(self, text, mode="", *args, **kwargs): @@ -386,7 +388,13 @@ class FreeTypeFont: return left, top, left + width, top + height def getsize( - self, text, direction=None, features=None, language=None, stroke_width=0 + self, + text, + direction=None, + features=None, + language=None, + stroke_width=0, + __internal__=False, ): """ Returns width and height (in pixels) of given text if rendered in font with @@ -438,6 +446,8 @@ class FreeTypeFont: :return: (width, height) """ + if not __internal__: + deprecate("getsize", 10, "getbbox or getlength") # vertical offset is added for historical reasons # see https://github.com/python-pillow/Pillow/pull/4910#discussion_r486682929 size, offset = self.font.getsize(text, "L", direction, features, language) @@ -495,12 +505,15 @@ class FreeTypeFont: :return: (width, height) """ + deprecate("getsize_multiline", 10) max_width = 0 lines = self._multiline_split(text) - line_spacing = self.getsize("A", stroke_width=stroke_width)[1] + spacing + line_spacing = ( + self.getsize("A", stroke_width=stroke_width, __internal__=True)[1] + spacing + ) for line in lines: line_width, line_height = self.getsize( - line, direction, features, language, stroke_width + line, direction, features, language, stroke_width, __internal__=True ) max_width = max(max_width, line_width) @@ -516,6 +529,7 @@ class FreeTypeFont: :return: A tuple of the x and y offset """ + deprecate("getoffset", 10, "getbbox") return self.font.getsize(text)[1] def getmask( @@ -796,7 +810,12 @@ class TransposedFont: self.orientation = orientation # any 'transpose' argument, or None def getsize(self, text, *args, **kwargs): - w, h = self.font.getsize(text) + if not kwargs.get("__internal__"): + deprecate("getsize", 10, "getbbox or getlength") + try: + w, h = self.font.getsize(text, __internal__=True) + except TypeError: + w, h = self.font.getsize(text) if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): return h, w return w, h