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.
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 @@ class ImageDraw(object):
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 @@ class ImageDraw(object):
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.