diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index a01908e1a..b50b770d0 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -297,7 +297,7 @@ Methods .. versionadded:: 6.0.0 -.. py:method:: PIL.ImageDraw.ImageDraw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", direction=None, features=None) +.. py:method:: PIL.ImageDraw.ImageDraw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", direction=None, features=None, language=None) Draws the string at the given position. @@ -326,6 +326,16 @@ Methods .. versionadded:: 4.2.0 + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP47 language code + ` + Requires libraqm. + + .. versionadded:: 6.0.0 + .. py:method:: PIL.ImageDraw.ImageDraw.textsize(text, font=None, spacing=4, direction=None, features=None, language=None) Return the size of the given string, in pixels. @@ -362,7 +372,7 @@ Methods .. versionadded:: 6.0.0 -.. py:method:: PIL.ImageDraw.ImageDraw.multiline_textsize(text, font=None, spacing=4, direction=None, features=None) +.. py:method:: PIL.ImageDraw.ImageDraw.multiline_textsize(text, font=None, spacing=4, direction=None, features=None, language=None) Return the size of the given string, in pixels. @@ -388,6 +398,16 @@ Methods .. versionadded:: 4.2.0 + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP47 language code + ` + Requires libraqm. + + .. versionadded:: 6.0.0 + .. py:method:: PIL.ImageDraw.getdraw(im=None, hints=None) .. warning:: This method is experimental. diff --git a/docs/releasenotes/6.0.0.rst b/docs/releasenotes/6.0.0.rst index 8894fd99f..caf501014 100644 --- a/docs/releasenotes/6.0.0.rst +++ b/docs/releasenotes/6.0.0.rst @@ -99,6 +99,21 @@ version. Use ``PIL.__version__`` instead. +New ``language`` parameter +^^^^^^^^^^^^^^^^^^^^^^^^ + +Text rendering functions now accept a ``language`` parameter, to request language-specific glyphs and ligatures from the font + +The following functions accept the new parameter: + +* ``PIL.ImageDraw.ImageDraw.text()`` +* ``PIL.ImageDraw.ImageDraw.multiline_text()`` +* ``PIL.ImageDraw.ImageDraw.textsize()`` +* ``PIL.ImageDraw.ImageDraw.multiline_textsize()`` +* ``PIL.ImageFont.ImageFont.getsize()`` +* ``PIL.ImageFont.ImageFont.getsize_multiline()`` +* ``PIL.ImageFont.ImageFont.getmask()`` + API Additions ============= diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index ac549790a..86512bb82 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -282,13 +282,17 @@ class ImageDraw(object): self.draw.draw_bitmap(xy, mask, ink) def multiline_text(self, xy, text, fill=None, font=None, anchor=None, - spacing=4, align="left", direction=None, features=None): + spacing=4, align="left", direction=None, features=None, + language=None): widths = [] max_width = 0 lines = self._multiline_split(text) line_spacing = self.textsize('A', font=font)[1] + spacing for line in lines: - line_width, line_height = self.textsize(line, font) + line_width, line_height = self.textsize(line, font, + direction=direction, + features=features, + language=language) widths.append(line_width) max_width = max(max_width, line_width) left, top = xy @@ -302,29 +306,30 @@ class ImageDraw(object): else: raise ValueError('align must be "left", "center" or "right"') self.text((left, top), line, fill, font, anchor, - direction=direction, features=features) + direction=direction, features=features, language=language) top += line_spacing left = xy[0] def textsize(self, text, font=None, spacing=4, direction=None, - features=None): + features=None, language=None): """Get the size of a given string, in pixels.""" if self._multiline_check(text): return self.multiline_textsize(text, font, spacing, - direction, features) + direction, features, language) if font is None: font = self.getfont() - return font.getsize(text, direction, features) + return font.getsize(text, direction, features, language) def multiline_textsize(self, text, font=None, spacing=4, direction=None, - features=None): + features=None, language=None): max_width = 0 lines = self._multiline_split(text) line_spacing = self.textsize('A', font=font)[1] + spacing for line in lines: line_width, line_height = self.textsize(line, font, spacing, - direction, features) + direction, features, + language) max_width = max(max_width, line_width) return max_width, len(lines)*line_spacing - spacing