Moved multiline split character to common functions

This commit is contained in:
Andrew Murray 2015-06-18 13:21:39 +10:00
parent d626679c23
commit 77169b2fdb

View File

@ -256,8 +256,18 @@ class ImageDraw(object):
## ##
# Draw text. # 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): 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) return self.multiline_text(xy, text, fill, font, anchor)
ink, fill = self._getink(fill) ink, fill = self._getink(fill)
@ -277,10 +287,10 @@ class ImageDraw(object):
self.draw.draw_bitmap(xy, mask, ink) self.draw.draw_bitmap(xy, mask, ink)
def multiline_text(self, xy, text, fill=None, font=None, anchor=None, def multiline_text(self, xy, text, fill=None, font=None, anchor=None,
spacing=0, align="left"): spacing=0, align="left"):
widths, heights = [], [] widths, heights = [], []
max_width = 0 max_width = 0
lines = text.split("\n") lines = self._multiline_split(text)
for line in lines: for line in lines:
line_width, line_height = self.textsize(line, font) line_width, line_height = self.textsize(line, font)
widths.append(line_width) widths.append(line_width)
@ -289,40 +299,38 @@ class ImageDraw(object):
left, top = xy left, top = xy
for idx, line in enumerate(lines): for idx, line in enumerate(lines):
if align == "left": if align == "left":
pass # left = x pass # left = x
elif align == "center": elif align == "center":
left += (max_width - widths[idx]) / 2.0 left += (max_width - widths[idx]) / 2.0
elif align == "right": elif align == "right":
left += (max_width - widths[idx]) left += (max_width - widths[idx])
else: else:
assert False, 'align must be either "left", "center" or "right"' assert False, 'align must be "left", "center" or "right"'
self.text((left, top), self.text((left, top), line, fill, font, anchor)
line, fill, font, anchor)
top += heights[idx] + spacing top += heights[idx] + spacing
left = xy[0] 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. # Get the size of a given string, in pixels.
def textsize(self, text, font=None): def textsize(self, text, font=None):
if "\n" in text: if self._multiline_check(text):
return multiline_textsize(text, font) return self.multiline_textsize(text, font)
if font is None: if font is None:
font = self.getfont() font = self.getfont()
return font.getsize(text) 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. # A simple 2D drawing interface for PIL images.