diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 11fc52ec7ad..2afe937144b 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -256,8 +256,18 @@ def rectangle(self, xy, fill=None, outline=None): ## # Draw text. + def _multiline_check(self, text): + split_character = "\n" if isinstance(text, type("")) else b"\n" + + return split_character in text + + def _multiline_split(self, text): + split_character = "\n" if isinstance(text, type("")) else b"\n" + + return text.split(split_character) + def text(self, xy, text, fill=None, font=None, anchor=None): - if "\n" in text: + if self._multiline_check(text): return self.multiline_text(xy, text, fill, font, anchor) ink, fill = self._getink(fill) @@ -277,10 +287,10 @@ def text(self, xy, text, fill=None, font=None, anchor=None): self.draw.draw_bitmap(xy, mask, ink) def multiline_text(self, xy, text, fill=None, font=None, anchor=None, - spacing=0, align="left"): + spacing=0, align="left"): widths, heights = [], [] max_width = 0 - lines = text.split("\n") + lines = self._multiline_split(text) for line in lines: line_width, line_height = self.textsize(line, font) widths.append(line_width) @@ -289,40 +299,38 @@ def multiline_text(self, xy, text, fill=None, font=None, anchor=None, left, top = xy for idx, line in enumerate(lines): if align == "left": - pass # left = x + pass # left = x elif align == "center": left += (max_width - widths[idx]) / 2.0 elif align == "right": left += (max_width - widths[idx]) else: - assert False, 'align must be either "left", "center" or "right"' - self.text((left, top), - line, fill, font, anchor) + assert False, 'align must be "left", "center" or "right"' + self.text((left, top), line, fill, font, anchor) top += heights[idx] + spacing left = xy[0] - def multiline_textsize(self, text, font=None, spacing=0): - max_width = 0 - height = 0 - lines = text.split("\n") - for line in lines: - line_width, line_height = self.textsize(line, font) - height += line_height + spacing - max_width = max(max_width, line_width) - return max_width, height - - ## # Get the size of a given string, in pixels. def textsize(self, text, font=None): - if "\n" in text: - return multiline_textsize(text, font) + if self._multiline_check(text): + return self.multiline_textsize(text, font) if font is None: font = self.getfont() return font.getsize(text) + def multiline_textsize(self, text, font=None, spacing=0): + max_width = 0 + height = 0 + lines = self._multiline_split(text) + for line in lines: + line_width, line_height = self.textsize(line, font) + height += line_height + spacing + max_width = max(max_width, line_width) + return max_width, height + ## # A simple 2D drawing interface for PIL images.