Skip to content

Commit

Permalink
Moved multiline split character to common functions
Browse files Browse the repository at this point in the history
  • Loading branch information
radarhere committed Jun 18, 2015
1 parent d626679 commit 77169b2
Showing 1 changed file with 28 additions and 20 deletions.
48 changes: 28 additions & 20 deletions PIL/ImageDraw.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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.
Expand Down

0 comments on commit 77169b2

Please sign in to comment.