From 592725bd748d942f6310992715d02e90e4763d33 Mon Sep 17 00:00:00 2001 From: shamsa Date: Wed, 13 Jan 2016 10:31:49 +0400 Subject: [PATCH 01/22] Add complex text support. This pull request adds support for languages that require complex text layout. We are using the Raqm library, that wraps FriBidi (for bidirectional text support) and HarfBuzz (for text shaping), and does proper BiDi and script itemization: https://github.com/HOST-Oman/libraqm This should fix #1089. --- .travis.yml | 5 +- PIL/ImageDraw.py | 12 ++-- PIL/ImageFont.py | 8 +-- _imagingft.c | 161 ++++++++++++++++++++++++++++++++++++++++------- setup.py | 12 +++- 5 files changed, 161 insertions(+), 37 deletions(-) diff --git a/.travis.yml b/.travis.yml index b88dc5ff2..a449b49e7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,10 +17,11 @@ python: - nightly dist: trusty - + install: + - "travis_retry sudo add-apt-repository -y ppa:as-bahanta/raqm" - "travis_retry sudo apt-get update" - - "travis_retry sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake imagemagick" + - "travis_retry sudo apt-get -qq install libfreetype6-dev libharfbuzz-dev libfribidi-dev libraqm-dev liblcms2-dev python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake imagemagick" - "travis_retry pip install cffi" - "travis_retry pip install nose" - "travis_retry pip install check-manifest" diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 720403920..220a90d86 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -218,10 +218,10 @@ class ImageDraw(object): return text.split(split_character) def text(self, xy, text, fill=None, font=None, anchor=None, - *args, **kwargs): + *args, **kwargs, direction=None, features=[]): if self._multiline_check(text): return self.multiline_text(xy, text, fill, font, anchor, - *args, **kwargs) + *args, **kwargs, direction=direction, features=features) ink, fill = self._getink(fill) if font is None: @@ -230,17 +230,17 @@ class ImageDraw(object): ink = fill if ink is not None: try: - mask, offset = font.getmask2(text, self.fontmode) + mask, offset = font.getmask2(text, self.fontmode, direction=direction, features=features) xy = xy[0] + offset[0], xy[1] + offset[1] except AttributeError: try: - mask = font.getmask(text, self.fontmode) + mask = font.getmask(text, self.fontmode, direction, features) except TypeError: mask = font.getmask(text) self.draw.draw_bitmap(xy, mask, ink) def multiline_text(self, xy, text, fill=None, font=None, anchor=None, - spacing=4, align="left"): + spacing=4, align="left", direction=None, features=[]): widths = [] max_width = 0 lines = self._multiline_split(text) @@ -259,7 +259,7 @@ class ImageDraw(object): left += (max_width - widths[idx]) else: assert False, 'align must be "left", "center" or "right"' - self.text((left, top), line, fill, font, anchor) + self.text((left, top), line, fill, font, anchor, direction=direction, features=features) top += line_spacing left = xy[0] diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 49494b33f..1af1887cb 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -143,13 +143,13 @@ class FreeTypeFont(object): def getoffset(self, text): return self.font.getsize(text)[1] - def getmask(self, text, mode=""): - return self.getmask2(text, mode)[0] + def getmask(self, text, mode="", direction=None, features=[]): + return self.getmask2(text, mode, direction, features)[0] - def getmask2(self, text, mode="", fill=Image.core.fill): + def getmask2(self, text, mode="", fill=Image.core.fill, direction=None, features=[]): size, offset = self.font.getsize(text) im = fill("L", size, 0) - self.font.render(text, im.id, mode == "1") + self.font.render(text, im.id, mode == "1", direction, features) return im, offset def font_variant(self, font=None, size=None, index=None, encoding=None): diff --git a/_imagingft.c b/_imagingft.c index ae62fc74e..93ef44c5d 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -48,6 +48,7 @@ struct { } ft_errors[] = #include FT_ERRORS_H +#include "raqm.h" /* -------------------------------------------------------------------- */ /* font objects */ @@ -329,11 +330,7 @@ font_render(FontObject* self, PyObject* args) int index, error, ascender; int load_flags; unsigned char *source; - FT_ULong ch; FT_GlyphSlot glyph; - FT_Bool kerning = FT_HAS_KERNING(self->face); - FT_UInt last_index = 0; - /* render string into given buffer (the buffer *must* have the right size, or this will crash) */ PyObject* string; @@ -341,16 +338,127 @@ font_render(FontObject* self, PyObject* args) int mask = 0; int temp; int xx, x0, x1; - if (!PyArg_ParseTuple(args, "On|i:render", &string, &id, &mask)) + const char *dir = NULL; + raqm_direction_t direction; + raqm_t *rq; + size_t count; + raqm_glyph_t *glyph_info; + PyObject *features = NULL; + + if (!PyArg_ParseTuple(args, "On|izO:render", &string, &id, &mask, &dir, &features)) return NULL; + rq = raqm_create(); + if (rq == NULL) { + PyErr_SetString(PyExc_ValueError, "raqm_create() failed."); + goto failed; + } + #if PY_VERSION_HEX >= 0x03000000 - if (!PyUnicode_Check(string)) { + if (PyUnicode_Check(string)) { + Py_ssize_t size = PyUnicode_GET_LENGTH(string); + Py_UCS4 text[size]; + PyUnicode_READY(string); + if (!PyUnicode_AsUCS4(string, text, size, 0)) + goto failed; + if (!raqm_set_text(rq, text, size)) { + PyErr_SetString(PyExc_ValueError, "raqm_set_text() failed"); + goto failed; + } + } #else - if (!PyUnicode_Check(string) && !PyString_Check(string)) { + if (PyUnicode_Check(string)) { + Py_UNICODE *text = PyUnicode_AS_UNICODE(string); + Py_ssize_t size = PyUnicode_GET_SIZE(string); + if (!raqm_set_text(rq, text, size)) { + PyErr_SetString(PyExc_ValueError, "raqm_set_text() failed"); + goto failed; + } + } + else if (PyString_Check(string)) { + char *text = PyString_AS_STRING(string); + int size = PyString_GET_SIZE(string); + if (!raqm_set_text_utf8(rq, text, size)) { + PyErr_SetString(PyExc_ValueError, "raqm_set_text_utf8() failed"); + goto failed; + } + } #endif + else { PyErr_SetString(PyExc_TypeError, "expected string"); - return NULL; + goto failed; + } + + direction = RAQM_DIRECTION_DEFAULT; + if (dir) { + if (strcmp(dir, "rtl") == 0) + direction = RAQM_DIRECTION_RTL; + else if (strcmp(dir, "ltr") == 0) + direction = RAQM_DIRECTION_LTR; + else if (strcmp(dir, "ttb") == 0) + direction = RAQM_DIRECTION_TTB; + else { + PyErr_SetString(PyExc_ValueError, "direction must be either 'rtl', 'ltr' or 'ttb'"); + goto failed; + } + } + + if (!raqm_set_par_direction(rq, direction)) { + PyErr_SetString(PyExc_ValueError, "raqm_set_par_direction() failed"); + goto failed; + } + + if (features) { + int len; + PyObject *seq = PySequence_Fast(features, "expected a sequence"); + if (!seq) { + goto failed; + } + + len = PySequence_Size(seq); + for (i = 0; i < len; i++) { + PyObject *item = PySequence_Fast_GET_ITEM(seq, i); + char *feature = NULL; + Py_ssize_t size = 0; +#if PY_VERSION_HEX >= 0x03000000 + if (!PyUnicode_Check(item) || + PyUnicode_READY(string) != 0 || + PyUnicode_KIND(item) != PyUnicode_1BYTE_KIND) { + PyErr_SetString(PyExc_TypeError, "expected an ASCII string"); + goto failed; + } + + feature = PyUnicode_1BYTE_DATA(item); + size = PyUnicode_GET_LENGTH(item); +#else + if (!PyString_Check(item)) { + PyErr_SetString(PyExc_TypeError, "expected a string"); + goto failed; + } + feature = PyString_AsString(item); + size = PyString_GET_SIZE(item); +#endif + if (!raqm_add_font_feature(rq, feature, size)) { + PyErr_SetString(PyExc_ValueError, "raqm_add_font_feature() failed"); + goto failed; + } + } + } + + if (!raqm_set_freetype_face(rq, self->face)) { + PyErr_SetString(PyExc_RuntimeError, "raqm_set_freetype_face() failed."); + goto failed; + } + + if (!raqm_layout (rq)) { + PyErr_SetString(PyExc_RuntimeError, "raqm_layout() failed."); + goto failed; + } + + glyph_info = raqm_get_glyphs(rq, &count); + if (glyph_info == NULL) { + PyErr_SetString(PyExc_ValueError, "raqm_get_glyphs() failed."); + goto failed; } im = (Imaging) id; @@ -360,36 +468,36 @@ font_render(FontObject* self, PyObject* args) load_flags |= FT_LOAD_TARGET_MONO; ascender = 0; - for (i = 0; font_getchar(string, i, &ch); i++) { - index = FT_Get_Char_Index(self->face, ch); + for (i = 0; i < count; i++) { + index = glyph_info[i].index; error = FT_Load_Glyph(self->face, index, load_flags); - if (error) - return geterror(error); + if (error) { + geterror(error); + goto failed; + } glyph = self->face->glyph; temp = (glyph->bitmap.rows - glyph->bitmap_top); + temp -= PIXEL(glyph_info[i].y_offset); if (temp > ascender) ascender = temp; } - for (x = i = 0; font_getchar(string, i, &ch); i++) { + for (x = i = 0; i < count; i++) { if (i == 0 && self->face->glyph->metrics.horiBearingX < 0) x = -PIXEL(self->face->glyph->metrics.horiBearingX); - index = FT_Get_Char_Index(self->face, ch); - if (kerning && last_index && index) { - FT_Vector delta; - FT_Get_Kerning(self->face, last_index, index, ft_kerning_default, - &delta); - x += delta.x >> 6; - } + index = glyph_info[i].index; error = FT_Load_Glyph(self->face, index, load_flags); - if (error) - return geterror(error); + if (error){ + geterror(error); + goto failed; + } glyph = self->face->glyph; source = (unsigned char*) glyph->bitmap.buffer; xx = x + glyph->bitmap_left; + xx += PIXEL(glyph_info[i].x_offset); x0 = 0; x1 = glyph->bitmap.width; if (xx < 0) @@ -401,6 +509,7 @@ font_render(FontObject* self, PyObject* args) /* use monochrome mask (on palette images, etc) */ for (y = 0; y < glyph->bitmap.rows; y++) { int yy = y + im->ysize - (PIXEL(glyph->metrics.horiBearingY) + ascender); + yy -= PIXEL(glyph_info[i].y_offset); if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ unsigned char *target = im->image8[yy] + xx; @@ -420,6 +529,7 @@ font_render(FontObject* self, PyObject* args) /* use antialiased rendering */ for (y = 0; y < glyph->bitmap.rows; y++) { int yy = y + im->ysize - (PIXEL(glyph->metrics.horiBearingY) + ascender); + yy -= PIXEL(glyph_info[i].y_offset); if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ int i; @@ -432,11 +542,14 @@ font_render(FontObject* self, PyObject* args) source += glyph->bitmap.pitch; } } - x += PIXEL(glyph->metrics.horiAdvance); - last_index = index; + x += PIXEL(glyph_info[i].x_advance); } Py_RETURN_NONE; + +failed: + raqm_destroy(rq); + return NULL; } static void diff --git a/setup.py b/setup.py index c34b8ed47..f184e8e45 100755 --- a/setup.py +++ b/setup.py @@ -115,6 +115,7 @@ TIFF_ROOT = None FREETYPE_ROOT = None LCMS_ROOT = None +RAQM_ROOT = None def _pkg_config(name): try: @@ -132,7 +133,7 @@ def _pkg_config(name): class pil_build_ext(build_ext): class feature: - features = ['zlib', 'jpeg', 'tiff', 'freetype', 'lcms', 'webp', + features = ['zlib', 'jpeg', 'tiff', 'freetype', 'raqm', 'lcms', 'webp', 'webpmux', 'jpeg2000', 'imagequant'] required = {'jpeg', 'zlib'} @@ -513,6 +514,11 @@ class pil_build_ext(build_ext): if subdir: _add_directory(self.compiler.include_dirs, subdir, 0) + if feature.want('raqm'): + if _find_include_file(self, "raqm.h"): + if _find_library_file(self, "raqm"): + feature.raqm = "raqm" + if feature.want('lcms'): _dbg('Looking for lcms') if _find_include_file(self, "lcms2.h"): @@ -594,6 +600,9 @@ class pil_build_ext(build_ext): exts.append(Extension("PIL._imagingft", ["_imagingft.c"], libraries=["freetype"])) + if feature.freetype and feature.raqm: + exts.append(Extension( + "PIL._imagingft", ["_imagingft.c"], libraries=["freetype", "fribidi" , "harfbuzz", "raqm"])) if feature.lcms: extra = [] @@ -660,6 +669,7 @@ class pil_build_ext(build_ext): (feature.imagequant, "LIBIMAGEQUANT"), (feature.tiff, "LIBTIFF"), (feature.freetype, "FREETYPE2"), + (feature.raqm, "RAQM"), (feature.lcms, "LITTLECMS2"), (feature.webp, "WEBP"), (feature.webpmux, "WEBPMUX"), From ff5c2ca925cfd82ca13aed0df801a03e8f5f96cb Mon Sep 17 00:00:00 2001 From: shamsa Date: Mon, 25 Jan 2016 14:51:27 +0400 Subject: [PATCH 02/22] Fix failure in test_imagefont.py --- PIL/ImageFont.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 1af1887cb..14c842388 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -144,7 +144,7 @@ class FreeTypeFont(object): return self.font.getsize(text)[1] def getmask(self, text, mode="", direction=None, features=[]): - return self.getmask2(text, mode, direction, features)[0] + return self.getmask2(text, mode, direction=direction, features=features)[0] def getmask2(self, text, mode="", fill=Image.core.fill, direction=None, features=[]): size, offset = self.font.getsize(text) From f013dd11f9f209a2f2472c6c7b82c465d9c66fb1 Mon Sep 17 00:00:00 2001 From: shamsa Date: Mon, 25 Jan 2016 15:16:35 +0400 Subject: [PATCH 03/22] Fix build with python 3.2 --- _imagingft.c | 45 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index 93ef44c5d..55bfa860e 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -354,27 +354,16 @@ font_render(FontObject* self, PyObject* args) goto failed; } -#if PY_VERSION_HEX >= 0x03000000 - if (PyUnicode_Check(string)) { - Py_ssize_t size = PyUnicode_GET_LENGTH(string); - Py_UCS4 text[size]; - PyUnicode_READY(string); - if (!PyUnicode_AsUCS4(string, text, size, 0)) - goto failed; - if (!raqm_set_text(rq, text, size)) { - PyErr_SetString(PyExc_ValueError, "raqm_set_text() failed"); - goto failed; - } - } -#else + if (PyUnicode_Check(string)) { Py_UNICODE *text = PyUnicode_AS_UNICODE(string); Py_ssize_t size = PyUnicode_GET_SIZE(string); - if (!raqm_set_text(rq, text, size)) { + if (!raqm_set_text(rq, (const uint32_t *)(text), size)) { PyErr_SetString(PyExc_ValueError, "raqm_set_text() failed"); goto failed; } } +#if PY_VERSION_HEX < 0x03000000 else if (PyString_Check(string)) { char *text = PyString_AS_STRING(string); int size = PyString_GET_SIZE(string); @@ -420,23 +409,27 @@ font_render(FontObject* self, PyObject* args) PyObject *item = PySequence_Fast_GET_ITEM(seq, i); char *feature = NULL; Py_ssize_t size = 0; -#if PY_VERSION_HEX >= 0x03000000 - if (!PyUnicode_Check(item) || - PyUnicode_READY(string) != 0 || - PyUnicode_KIND(item) != PyUnicode_1BYTE_KIND) { - PyErr_SetString(PyExc_TypeError, "expected an ASCII string"); - goto failed; - } + PyObject *bytes; - feature = PyUnicode_1BYTE_DATA(item); - size = PyUnicode_GET_LENGTH(item); +#if PY_VERSION_HEX >= 0x03000000 + if (!PyUnicode_Check(item)) { #else - if (!PyString_Check(item)) { + if (!PyUnicode_Check(item) && !PyString_Check(item)) { +#endif PyErr_SetString(PyExc_TypeError, "expected a string"); goto failed; } - feature = PyString_AsString(item); - size = PyString_GET_SIZE(item); + + if (!PyUnicode_Check(item)) { + bytes = PyUnicode_AsUTF8String(item); + feature = PyBytes_AS_STRING(bytes); + size = PyBytes_GET_SIZE(bytes); + } +#if PY_VERSION_HEX < 0x03000000 + else { + feature = PyString_AsString(item); + size = PyString_GET_SIZE(item); + } #endif if (!raqm_add_font_feature(rq, feature, size)) { PyErr_SetString(PyExc_ValueError, "raqm_add_font_feature() failed"); From 8b3ed968c440c91bf223765ed0862c1f362f29aa Mon Sep 17 00:00:00 2001 From: shamsa Date: Wed, 27 Jan 2016 09:09:26 +0400 Subject: [PATCH 04/22] fallback code --- PIL/ImageDraw.py | 5 +- PIL/ImageFont.py | 4 +- _imagingft.c | 191 ++++++++++++++++++++++++++++++++++++----------- setup.py | 18 +++-- 4 files changed, 164 insertions(+), 54 deletions(-) diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 220a90d86..8c3bf9ad5 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -218,7 +218,8 @@ class ImageDraw(object): return text.split(split_character) def text(self, xy, text, fill=None, font=None, anchor=None, - *args, **kwargs, direction=None, features=[]): + *args, **kwargs, direction=None, features=None): + if self._multiline_check(text): return self.multiline_text(xy, text, fill, font, anchor, *args, **kwargs, direction=direction, features=features) @@ -240,7 +241,7 @@ 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=[]): + spacing=4, align="left", direction=None, features=None): widths = [] max_width = 0 lines = self._multiline_split(text) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 14c842388..985570c8a 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -143,10 +143,10 @@ class FreeTypeFont(object): def getoffset(self, text): return self.font.getsize(text)[1] - def getmask(self, text, mode="", direction=None, features=[]): + def getmask(self, text, mode="", direction=None, features=None): return self.getmask2(text, mode, direction=direction, features=features)[0] - def getmask2(self, text, mode="", fill=Image.core.fill, direction=None, features=[]): + def getmask2(self, text, mode="", fill=Image.core.fill, direction=None, features=None): size, offset = self.font.getsize(text) im = fill("L", size, 0) self.font.render(text, im.id, mode == "1", direction, features) diff --git a/_imagingft.c b/_imagingft.c index 55bfa860e..e1130b016 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -41,6 +41,23 @@ #define FT_ERRORDEF( e, v, s ) { e, s }, #define FT_ERROR_START_LIST { #define FT_ERROR_END_LIST { 0, 0 } }; +#ifdef HAVE_RAQM +#include +#else +typedef enum +{ + RAQM_DIRECTION_DEFAULT, + RAQM_DIRECTION_RTL, + RAQM_DIRECTION_LTR, + RAQM_DIRECTION_TTB +} raqm_direction_t; +#endif + +typedef struct +{ + int index, x_offset, x_advance, y_offset; + unsigned int cluster; +} GlyphInfo; struct { int code; @@ -48,7 +65,6 @@ struct { } ft_errors[] = #include FT_ERRORS_H -#include "raqm.h" /* -------------------------------------------------------------------- */ /* font objects */ @@ -322,31 +338,17 @@ font_getabc(FontObject* self, PyObject* args) return Py_BuildValue("ddd", a, b, c); } -static PyObject* -font_render(FontObject* self, PyObject* args) -{ - int i, x, y; - Imaging im; - int index, error, ascender; - int load_flags; - unsigned char *source; - FT_GlyphSlot glyph; - /* render string into given buffer (the buffer *must* have - the right size, or this will crash) */ - PyObject* string; - Py_ssize_t id; - int mask = 0; - int temp; - int xx, x0, x1; - const char *dir = NULL; - raqm_direction_t direction; - raqm_t *rq; - size_t count; - raqm_glyph_t *glyph_info; - PyObject *features = NULL; - if (!PyArg_ParseTuple(args, "On|izO:render", &string, &id, &mask, &dir, &features)) - return NULL; +static size_t +text_layout(PyObject* string, FontObject* self, const char* dir, + PyObject *features ,GlyphInfo **glyph_info, int mask) +{ +#ifdef HAVE_RAQM + int i = 0; + raqm_t *rq; + size_t count = 0; + raqm_glyph_t *glyphs; + raqm_direction_t direction; rq = raqm_create(); if (rq == NULL) { @@ -354,7 +356,6 @@ font_render(FontObject* self, PyObject* args) goto failed; } - if (PyUnicode_Check(string)) { Py_UNICODE *text = PyUnicode_AS_UNICODE(string); Py_ssize_t size = PyUnicode_GET_SIZE(string); @@ -397,7 +398,7 @@ font_render(FontObject* self, PyObject* args) goto failed; } - if (features) { + if (features != Py_None) { int len; PyObject *seq = PySequence_Fast(features, "expected a sequence"); if (!seq) { @@ -420,8 +421,10 @@ font_render(FontObject* self, PyObject* args) goto failed; } - if (!PyUnicode_Check(item)) { + if (PyUnicode_Check(item)) { bytes = PyUnicode_AsUTF8String(item); + if (bytes == NULL) + goto failed; feature = PyBytes_AS_STRING(bytes); size = PyBytes_GET_SIZE(bytes); } @@ -448,12 +451,121 @@ font_render(FontObject* self, PyObject* args) goto failed; } - glyph_info = raqm_get_glyphs(rq, &count); - if (glyph_info == NULL) { + glyphs = raqm_get_glyphs(rq, &count); + if (glyphs == NULL) { PyErr_SetString(PyExc_ValueError, "raqm_get_glyphs() failed."); + count = 0; goto failed; } + (*glyph_info) = PyMem_New(GlyphInfo, count); + if ((*glyph_info) == NULL) { + PyErr_SetString(PyExc_MemoryError, "PyMem_New() failed"); + count = 0; + goto failed; + } + + for (i = 0; i < count; i++) { + (*glyph_info)[i].index = glyphs[i].index; + (*glyph_info)[i].x_offset = glyphs[i].x_offset; + (*glyph_info)[i].x_advance = glyphs[i].x_advance; + (*glyph_info)[i].y_offset = glyphs[i].y_offset; + (*glyph_info)[i].cluster = glyphs[i].cluster; + } + +failed: + raqm_destroy (rq); + return count; + +#else + if (features != Py_None || dir != NULL) + PyErr_SetString(PyExc_KeyError, "Raqm is missing."); + + int error, load_flags; + FT_ULong ch; + Py_ssize_t count; + FT_GlyphSlot glyph; + FT_Bool kerning = FT_HAS_KERNING(self->face); + FT_UInt last_index = 0; +#if PY_VERSION_HEX >= 0x03000000 + if (!PyUnicode_Check(string)) { +#else + if (!PyUnicode_Check(string) && !PyString_Check(string)) { +#endif + PyErr_SetString(PyExc_TypeError, "expected string"); + return 0; + } + + count = 0; + while (font_getchar(string, count, &ch)) + count++; + if (count == 0) + return 0; + + (*glyph_info) = PyMem_New(GlyphInfo, count); + if ((*glyph_info) == NULL) { + PyErr_SetString(PyExc_MemoryError, "PyMem_New() failed"); + return 0; + } + + load_flags = FT_LOAD_RENDER|FT_LOAD_NO_BITMAP; + if (mask) + load_flags |= FT_LOAD_TARGET_MONO; + int i; + for (i = 0; font_getchar(string, i, &ch); i++) { + (*glyph_info)[i].index = FT_Get_Char_Index(self->face, ch); + error = FT_Load_Glyph(self->face, (*glyph_info)[i].index, load_flags); + if (error) { + geterror(error); + return 0; + } + glyph = self->face->glyph; + (*glyph_info)[i].x_offset=0; + (*glyph_info)[i].y_offset=0; + if (kerning && last_index && (*glyph_info)[i].index) { + FT_Vector delta; + if (FT_Get_Kerning(self->face, last_index, (*glyph_info)[i].index, + ft_kerning_default,&delta) == 0) + (*glyph_info)[i-1].x_advance += PIXEL(delta.x); + } + + (*glyph_info)[i].x_advance = glyph->metrics.horiAdvance; + last_index = (*glyph_info)[i].index; + (*glyph_info)[i].cluster = ch; + } + return count; +#endif +} + +static PyObject* +font_render(FontObject* self, PyObject* args) +{ + int i, x, y; + Imaging im; + int index, error, ascender; + int load_flags; + unsigned char *source; + FT_GlyphSlot glyph; + /* render string into given buffer (the buffer *must* have + the right size, or this will crash) */ + PyObject* string; + Py_ssize_t id; + int mask = 0; + int temp; + int xx, x0, x1; + const char *dir = NULL; + size_t count; + GlyphInfo *glyph_info; + PyObject *features = NULL; + + if (!PyArg_ParseTuple(args, "On|izO:render", &string, &id, &mask, &dir, &features)) + return NULL; + + glyph_info = NULL; + count = text_layout(string, self, dir, features, &glyph_info, mask); + if (count == 0) + return NULL; + im = (Imaging) id; /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 */ load_flags = FT_LOAD_RENDER|FT_LOAD_NO_BITMAP; @@ -464,10 +576,9 @@ font_render(FontObject* self, PyObject* args) for (i = 0; i < count; i++) { index = glyph_info[i].index; error = FT_Load_Glyph(self->face, index, load_flags); - if (error) { - geterror(error); - goto failed; - } + if (error) + return geterror(error); + glyph = self->face->glyph; temp = (glyph->bitmap.rows - glyph->bitmap_top); temp -= PIXEL(glyph_info[i].y_offset); @@ -481,10 +592,8 @@ font_render(FontObject* self, PyObject* args) index = glyph_info[i].index; error = FT_Load_Glyph(self->face, index, load_flags); - if (error){ - geterror(error); - goto failed; - } + if (error) + return geterror(error); glyph = self->face->glyph; @@ -537,12 +646,8 @@ font_render(FontObject* self, PyObject* args) } x += PIXEL(glyph_info[i].x_advance); } - + PyMem_Del(glyph_info); Py_RETURN_NONE; - -failed: - raqm_destroy(rq); - return NULL; } static void diff --git a/setup.py b/setup.py index f184e8e45..7595acfd3 100755 --- a/setup.py +++ b/setup.py @@ -516,8 +516,10 @@ class pil_build_ext(build_ext): if feature.want('raqm'): if _find_include_file(self, "raqm.h"): - if _find_library_file(self, "raqm"): - feature.raqm = "raqm" + if _find_library_file(self, "raqm") and \ + _find_library_file(self, "harfbuzz") and \ + _find_library_file(self, "fribidi"): + feature.raqm = ["raqm", "harfbuzz", "fribidi"] if feature.want('lcms'): _dbg('Looking for lcms') @@ -597,12 +599,14 @@ class pil_build_ext(build_ext): # additional libraries if feature.freetype: - exts.append(Extension("PIL._imagingft", - ["_imagingft.c"], - libraries=["freetype"])) - if feature.freetype and feature.raqm: + libs = ["freetype"] + defs = [] + if feature.raqm: + libs.extend(feature.raqm) + defs.append(('HAVE_RAQM', None)) exts.append(Extension( - "PIL._imagingft", ["_imagingft.c"], libraries=["freetype", "fribidi" , "harfbuzz", "raqm"])) + "PIL._imagingft", ["_imagingft.c"], libraries=libs, + define_macros=defs)) if feature.lcms: extra = [] From 228af633b2169e6225b8829421b1418d3a37334d Mon Sep 17 00:00:00 2001 From: shamsa Date: Wed, 3 Feb 2016 14:50:46 +0400 Subject: [PATCH 05/22] Document complex text layout features. --- docs/installation.rst | 3 ++- docs/reference/ImageDraw.rst | 10 +++++++--- docs/reference/ImageFont.rst | 4 +++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 2724886bb..9de91ea7d 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -170,6 +170,8 @@ Many of Pillow's features require external libraries: * Windows support: Libimagequant requires VS2013/MSVC 18 to compile, so it is unlikely to work with any Python prior to 3.5 on Windows. +* **libraqm** provides complex text layout support. + Once you have installed the prerequisites, run:: $ pip install Pillow @@ -222,7 +224,6 @@ Build Options library search process to dump all paths searched for and found to stdout. - Sample Usage:: $ MAX_CONCURRENCY=1 python setup.py build_ext --enable-[feature] install diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 842407c90..6e379475b 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -227,7 +227,7 @@ Methods Draw a shape. -.. py:method:: PIL.ImageDraw.Draw.text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left") +.. py:method:: PIL.ImageDraw.Draw.text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", direction=None, features=None) Draws the string at the given position. @@ -240,9 +240,11 @@ Methods the number of pixels between lines. :param align: If the text is passed on to multiline_text(), "left", "center" or "right". + :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt. + :param features: A list of font features used for text layout. For example, 'ligature, kerning, Medial ...etc. - -.. py:method:: PIL.ImageDraw.Draw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left") +.. py:method:: PIL.ImageDraw.Draw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", + direction=None, features=[]) Draws the string at the given position. @@ -252,6 +254,8 @@ Methods :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. :param spacing: The number of pixels between lines. :param align: "left", "center" or "right". + :param direction: Direction of the text. + :param features: Font features used for text layout. .. py:method:: PIL.ImageDraw.Draw.textsize(text, font=None, spacing=0) diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index 166d977a6..40e7d7f46 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -51,7 +51,7 @@ Methods :return: (width, height) -.. py:method:: PIL.ImageFont.ImageFont.getmask(text, mode='') +.. py:method:: PIL.ImageFont.ImageFont.getmask(text, mode='', direction=None, features=[]) Create a bitmap for the text. @@ -63,6 +63,8 @@ Methods driver prefers; if empty, the renderer may return either mode. Note that the mode is always a string, to simplify C-level implementations. + :param direction: Direction of the text. + :param features: A list of font features used for text layout. .. versionadded:: 1.1.5 :return: An internal PIL storage memory instance as defined by the From 25b2a6420bdb7dc7fb808a0839edb6673167da3b Mon Sep 17 00:00:00 2001 From: shamsa Date: Wed, 3 Feb 2016 15:24:10 +0400 Subject: [PATCH 06/22] Testing complex text layout. --- PIL/ImageDraw.py | 6 +- PIL/features.py | 1 + Tests/fonts/NotoNastaliqUrdu-Regular.ttf | Bin 0 -> 497204 bytes Tests/images/test_Nastalifont_text.png | Bin 0 -> 1071 bytes Tests/images/test_arabictext_features.png | Bin 0 -> 1435 bytes Tests/images/test_complex_unicode_text.png | Bin 0 -> 1075 bytes Tests/images/test_direction_ltr.png | Bin 0 -> 1834 bytes Tests/images/test_direction_rtl.png | Bin 0 -> 1199 bytes Tests/images/test_kerning_features.png | Bin 0 -> 963 bytes Tests/images/test_ligature_features.png | Bin 0 -> 605 bytes Tests/images/test_text.png | Bin 0 -> 1088 bytes Tests/images/test_y_offset.png | Bin 0 -> 1066 bytes Tests/test_imagefontctl.py | 136 +++++++++++++++++++++ _imagingft.c | 10 +- selftest.py | 3 +- 15 files changed, 148 insertions(+), 8 deletions(-) create mode 100644 Tests/fonts/NotoNastaliqUrdu-Regular.ttf create mode 100644 Tests/images/test_Nastalifont_text.png create mode 100644 Tests/images/test_arabictext_features.png create mode 100644 Tests/images/test_complex_unicode_text.png create mode 100644 Tests/images/test_direction_ltr.png create mode 100644 Tests/images/test_direction_rtl.png create mode 100644 Tests/images/test_kerning_features.png create mode 100644 Tests/images/test_ligature_features.png create mode 100644 Tests/images/test_text.png create mode 100644 Tests/images/test_y_offset.png create mode 100644 Tests/test_imagefontctl.py diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 8c3bf9ad5..1c205e924 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -218,12 +218,10 @@ class ImageDraw(object): return text.split(split_character) def text(self, xy, text, fill=None, font=None, anchor=None, - *args, **kwargs, direction=None, features=None): - + direction=None, features=None, *args, **kwargs): if self._multiline_check(text): return self.multiline_text(xy, text, fill, font, anchor, - *args, **kwargs, direction=direction, features=features) - + direction=direction, features=features, *args, **kwargs) ink, fill = self._getink(fill) if font is None: font = self.getfont() diff --git a/PIL/features.py b/PIL/features.py index 134d85abf..8a70080ca 100644 --- a/PIL/features.py +++ b/PIL/features.py @@ -5,6 +5,7 @@ modules = { "tkinter": "PIL._imagingtk", "freetype2": "PIL._imagingft", "littlecms2": "PIL._imagingcms", + "raqm": "PIL._imagingft", "webp": "PIL._webp", "transp_webp": ("WEBP", "WebPDecoderBuggyAlpha") } diff --git a/Tests/fonts/NotoNastaliqUrdu-Regular.ttf b/Tests/fonts/NotoNastaliqUrdu-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..891f633d802bbece8eb3a701a62bdcb69c45b74c GIT binary patch literal 497204 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�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

W0|`S`BMU~ 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 literal 0 HcmV?d00001 diff --git a/Tests/images/test_arabictext_features.png b/Tests/images/test_arabictext_features.png new file mode 100644 index 0000000000000000000000000000000000000000..9bfa5a931cf0abab932dba401a7d5a7c5ed23aaa GIT binary patch literal 1435 zcmcIk=~L1P00mPN6BxxKL8(zm+b-NvF(KA#67s;jNIWo2#?@8wWYy6u)U7-wH#3jb zG1JCcfz~rkz#mbW3|4rqY5l5ITNPBijD)pNNS7Wj!EZyAlpG{XQW;X{Pz0Mh~Ua37cr|6%P8~Ie&QNvlMK^-nz zS%01bt#j(|`pITBDs>)g7WG@wCaNEj*+0N3&$SsaT! z*7KY+v>xt+IsLYZsc?Fe~ac z`Qp;N95GrMv+#*LF4o<$%ERIe8ut2(@X5zCKH+ik0$#gIuo-is^^u8!r<3327Rp?R zImJbY^u_nN$@@w(Rn?7NuWXLF*hlEu18*9u;EIpxRgQPl7F2UacGSWlR@$XbVMJeG z6<{|g*4gol>m9e`GiAvI7QmK};`><`zrpH(;R;I4roNjoq!^_vh`-zi%Y?n%z?@`7 zj#v)@Q#DE3rEAS;!$$ZD^Tw68o$Ayc3dw>tVH}$N`}by121A%y3#na+i!%jQEN#Kn zY}wopil!UOC97?h^RkF0D#O~CFro>K+uEHlf!!4KB@T~ZTW8c5e76T23t=GNpzyiv z@3C6C1K29mQxIq8Q67V@T_*>+J>h$kvgY}8z}qipOroM=%KO1JjvuP+#h#~>g*2Tumm7Im>51$8Y8v-I z-D}l6f)4okisB3?G+At3$GWSoomuZ^Z z#$aCXlD7Q1R4S8bSxBvQ&C_$hjjKp;BAt&(}a5U(_wc1iTq~}4_tb-m(0^YJ@ ze9qaPZpU!(?y!MoweN)fFc8Rq-vv(WVXx8tu}R`{)9d5z?jnp%)EOOQ1gJ@W{ zBn1G+*m;g5j0kgNsSDP3@P_;=lbxao>(xG2Dd<3P*<`-Cl>xqPs-wNitye(~O1bl= zH1TnrZo?%vV1M|`qGgpkd{bH~M2-zq3gI|I0na4Q_~!7o{5=O(B4uVP+MzT}hH_ud zA*)5_*^_X*mXwD04T8NDIq_&2ftW;oi!3w{c%Ronc1EG&aREiO31=&-1IoA8&+4EF z)-6nNZ%_VK#>jZ-Ks_Cx01Ba7`~Cg+T>CWTQ11vfK>|8e_+LIMA%pcCriM5@PN}UV zxNg716Oi2!5giEb>FSge(t!fb;lsA6mJxc<$q^2rl2A?1Eo8BDSvn1B^HSINYd)8a z1jf#3?wf>MzGzMx!tMOjns1kcT22mIR1(Z+MALeMK49j_U+=(J)!0qs2XV!2(*y#T zQ8%A+FA(UuItrqNT`jA<4Mn4B5-IQjddoR~Foa_rVXEL&a!jL&`pr-hF#C_sOT-d8 h>dycC&uH!6hPvF7xqAE}Uf(%g2-Vx)i|@g@^e?ZOrF{SZ literal 0 HcmV?d00001 diff --git a/Tests/images/test_complex_unicode_text.png b/Tests/images/test_complex_unicode_text.png new file mode 100644 index 0000000000000000000000000000000000000000..565a2f9328df4c5dab8218c59c88360dfc7f40a3 GIT binary patch literal 1075 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Q#hD_j{|3XDu79}@++fWy=SPhob%k_j@ zq+(l?j<^^vzL;4wL87GO*i9CvlBxo}c?T_xpUcShKl}c<;@hwP*R5v%wav8^%&1Nu%_g;-y!hMn@f+@aTJlOq;kH#VQuPq+`lh^jPo^3jQXt4on-{I<| z##S1h$~&0t`2H^Bs6MQ0t+4+SP%qdgW6ECEswBg) zdexRnRgvX?^kTU8F68)qcw#`y_q_|R?#!vyIP{i5r$MPE`01p*eFs$^P2-7t+1uW@ zq4WrMEtkl{$z5jZi^{?}qj=g6J5-qZteaORDe`dTLiv3mh3wY6yPWc0RZ6JNO>IB4 zuSj)^(GJ~b+a5-(<8`g9{o&^-tJkEo$NE;zWnsRym(GiS9pV+uWh#Dn_!G;Hge?c> zdu&oyFaNORa9==3$re+Q!)NaW3G=>_jb+L{O7`4jj6`Dt^$EAx9!t`=wh1-|jVM=wMX_JhpPlf^`S1QsyQtAE$fP|=qIwS;g%JR&Ea3)zB~J$_UF?9E&PWL z7EMx4^!}0e;`7y|z4O&G&&;_Y_{)ajZ2`Xxb9Z9WBFe@?KpiJMon zwD{bwfR^9q1GY^qIDNB=De6Jw3-05G_Ouy!oc(@HQumP38kyfK#CAx{YnksPSasO> zYq{23ZmF7;st#^nw?g-!S_boj_#Zsiru|quF>mR!Y}Q?g=3mUKHMUAO?7hHf qKkWw3-LrE2D!?p4W3=S+;d<*Y@4_dY7WM!Z1`M9AelF{r5}E)SMcv&1 literal 0 HcmV?d00001 diff --git a/Tests/images/test_direction_ltr.png b/Tests/images/test_direction_ltr.png new file mode 100644 index 0000000000000000000000000000000000000000..42239334d129e60638da294d201c97e440eed4a3 GIT binary patch literal 1834 zcmd6o`#al*0><^G4n;dk-Qtu@ogfiZTspQjnprJcmn7;kN`xkzphOy%S?W@)=Cs5$ zHMDBxo*>jc?U;O18C91^Nt-4{i3$s;;yC}sK0mzA`#kUOpZE496jEE$SW`_+P22lh zgrAz)0o(l^rEzdS*^y<%YHI3h-iWUQQkW~k*oF|C(a{g{FTbg3^HYAuL(Sx|E*Mz0 zUe3(Dnx|o{uI*M~$6o&%sMI>4Ms6c0HspB%6kN{9$c!1{@aK~eZtSjlW)ExIpgvdsjpoMn z^njuGBaSBiCgn~ZGo8$MW@ukKi+ZZQMs)Aqc=WMCwCitEbB|&enGV+}zrfM%tD8R9 zWo}jK&50Z)H;n(T+@>kmW&nme2q)p1doc-?dM-~QT?h=ckzn!Mr7&A^5pBSjIVfUP zih^~_gu=cMKM+ImVr8G>Pe%%}D70vB0LTke(Q?t=sjrAJPA2SfN<}6&C?3i|+pR!{k^IQqF1Lb8(W{j<&J|18@||=4{poNXkG~j zJZ`owayC`4}UX&uLoz;M%~!riGq zVV@fLZ#~kvf*_g}&}aE@Q^L0!CL?5pU1voToI;Adh~ICL(qQB9=i27m-9fU)oAX_D zrq2V;Tg|11rqxMS;rHk3&>itx*6`xh4dITJF6%(K&MZ$U!Yai_tQ22DmcV!2OXRQr z{+QPFROGRI>Rgs*VVX-jta0u5Y?74tvj2gv_>;nbZQ^Kxhoj<{69We<^LGlS%ktgE zlcNY$9dKk1Dee$*({oJRG<)G19)T}>`&lx9I8h=h5!xm`TJtc@DdoRw_b~Du?B<-0 z`>8!gmfG9!dlzxGWDNWKO=?WcXlee!7OtzFZ^tPT#J_KO=$_ZObwP49OaiiEUqo^b z4<+ees6FJ$>G@+fpWyb^QFDlluu|Sc(rBZ~l^5-HK}1o9Sr9$jYsWn!HWHTefe}Wf zM;XK=EIJtSC&m1sM?E^x5JJIPpK;FjdC9Fw!G=BKbE)?+D(tYxW#qv;3qlZ6Kv6xX zHxp9sxH|E}jf>e-NoNFfP+O}57uPp*jC8Gcds;=wYs^N=Djj+6O(#3e@8W-Gg4Sl9 z5iUIBriY`43(schY3YO`Nr&~^M*IHNt(f1nG^~&{sHcZQY^f|Ay&0MouUT`H$TycC zI>o>bjNsCqka9uqt6RY~%utkUV8|@A`;2|FPx#BB*%dJb=iCgV|4y8#IFkW1=6i=+ zy7;6FuhMdyZrE|*{1@o_b#2+&jq?SZaa~w0P`CxJ+v>s^Bij>U^fvtBiy4ic=X&}D zB|~oFcI5<|j+x0GSy3*mlaq-@f5C&}K4`eJb5+ay3@lwY5hWS6?9EzTf3_6A`q3E= zPj_~j2A7C>IAU+6W80F9^tjdOq|J-?Hr{er_q|sV!`hKg)#t{-vP`Tqz+`d*&>PSM zrWY9kc2b4{Tk78@YPvOMGF*{b6lx@JYJzI<{P%~iTr(4SmZ6?sak7;QV~Xws(*oB# zDo{NRUIzlD_VRrLjgEr_jQPSk=BqHYne`92xC$bNg0o9IIx9f!TNMf|++%D5DqL+? zDb22bN}Pgvx67*J+u>V=u;qD-Xf1=H3^L!9rX$N@Ro=ACxnUxxb*YGS2i16}IY(ox z+TmwdnC8E$a&bxEMn!@uv8ycvEsxz3Oq{SZH#-45Gwke@82nfn;{T<=Ig6{RD<5OS p&v%HggFwlPP>X*GXz1S2Xu`Xs$B^S|`yZ(0?S(=#eG~rk{{YR=ddUC) literal 0 HcmV?d00001 diff --git a/Tests/images/test_direction_rtl.png b/Tests/images/test_direction_rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..966b67d6b6436564ced292ce598f0561824d3b43 GIT binary patch literal 1199 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Q#hD_butYiCy+J51;or@55HiRg?6r-ni@MiSwpcTMnFSTONHW<^M(HezTlQ zTJ=+smYj>=seM>*Lm;og_3hfMsz=dte>*3#`n2!-P^NK6`s$Y33pn<-?M_rX)3WtL z^iQ=vh9VDN7KqJZS$?qeL)uB8{u_dQt=!)0w63;nzvd$5C|I{<*;_u>iUoC_zb0>u zNq(|Cpe1#2Tvl&n&lO4bL+MZb6IX6uy!@)mG6zAnSF_Xe{;sNgI{U-TSMwY0U67S) zyZN+x;<1C_53gQxe-*W3@55Wq9e(UeJUM4$+=>w4J|P>iu7aZ4Lt8%i-e7(G;PR}- zJJRbkfJU#={19Uy^{qYiYkyzs-nIQ#j2Ch|zs?@d=Nb|F_p8wj!F~Fb#*tcU%_=J9 zs6FhEEKuGf+_hnOZ_Vrg-MQ@RTSCvug;u@nE>QW>R=nz?rh$ZAM(vV!4N7-{<>zq! zb{4cd|3UVp!;Me=rio9pp8WgO!rs4_Q+t`SVBJQ}QX8{YrI;&kF19b^n0`1&f~WdW z2t$~I;I?gcK~r1i87x+_V4ug+ypW^zVXMLZ-cQF?bLOZ2So>JYg85v-?g!UDZC`vh zQS?lk-V9dhOHYm+RSU6P->Nj{-kXcMAF5yQawjHhIFWmxvX*W!;Ke&e;wNQK|rTL zNk-#x%k%@!KKQ=iXFt6A;W9DP?ZQ(S^x7IP$eXo!C(4~^Ke|C?-uVwIHtA<#v(~gJ z)%=OKD42SlGycE+lvV$CKK1yp5{>_O} zIt}Vh@fwHD&eii#-?ZQDfJp?KckN@x0jg|u2+KbiK?R&ggWLs*wmv=j@?nJ(uO-WD7juxda+1pMThpm-k=bd=nJj8 zR`19tN$h0o=62+bn##rNnOQXb=#CkEexIK0EfKox^WnE5%d>sO=kG+uoI6wby-~$; zlFG~a)hR#sYtLVGxijF<^t;dIajCvpJ#z=Y*N-&Ue63hR=GS{0QhN@}Wq8vzcj{_+ zT?UyIH`DrA9^5z-wbnOESbJS~_LNr!Qw-$2D)tqXvY%<4S&;kmQmKLTvqODX^&F$3 z|Hg4fhrZKgkXx7YaiQAJMD7g zR`ROFcR%fk<*c)v@*#>Lj#qV0V5el$O9T157ZNg!KMiEtX4$X3(k@kY&Nkps|HHZ) zY~hFVEF`@uR^FbnD}>*P)A*qR&*8EPsdMc@axXY;^XzXCDq}3*p7J64MvUi=JdKAp z`zAhL(DMCFcb0P2jh5q1oaMT5cQ{q&yh|0XySMiArzDMsoBMuLFKjv4HxU?)^Slm) zJ=rchakA;eOKcZ5a7LHDblM^C>`=_^%*aDOYF{qZmY}b5;A7v6#~;M+ z9KRG_CH^pZ!CkN1zyDeEzHQQ48E+DD$oQ_-4X&WlwJmGcZ{5H3vAgv7`ytiy*4n)~ zpXgmHANtDQHsnw+L(ke>w+p2jn7i5Kc@LDoonG3W@M@jkA^#1seJzPInmVuQ1xKm# zPW_Ol_m`u__)XJV0}k_p$tCtTBB#GvSXTbUQ=%=gf-BAW2hIV9*iDP=c~oUq_4I$pU;N_Jeq-<2^qa!Q+Yeel zY&VczcG#st_0FB-Rg4u(`}i&=TGfaiv)U)QeO~X4=*B>^`wod>hR{Ef|)Aut< YToHVAG5Nt%VCH1-boFyt=akR{08N#^oB#j- literal 0 HcmV?d00001 diff --git a/Tests/images/test_ligature_features.png b/Tests/images/test_ligature_features.png new file mode 100644 index 0000000000000000000000000000000000000000..664e9929d05990b58673d318b9518a63255675cd GIT binary patch literal 605 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Q#hD_YdcP9bG1rm>P6@98F04ATFVzmMF0Q@R9im6O#-*c$F6F{_>e- zY$ColuDa#hx|g4;o=&RXcmH|u_rE;f&wYL^1hge8&uC{ZUh{rg zVKjNqYMqd{P`|HrSw=f!DuZXPKNFTVsqo`6+gVYMw`RSsI=o+h$HnbOCgwS+e*gXL z-kaAf+jf4f`zS4XXy>WUl=32l%D7Ce{@tmUJ%fJ+S(@RBykC4Mdg`)G8eLlsyzqCoK3SrEee%vH z>7NvLUOV~KZ<0>WF7u4_PoKB&%W@`K%nR#N`#pK?$%9Y4QWstd@$1`Vn9*(ee}C2O zM1i(6t)0O$*PaQt3yljqm(#jB6c_`Pf&}HiOk0^Zya;`fB?~gk)78&qol`;+06Lfj APXGV_ literal 0 HcmV?d00001 diff --git a/Tests/images/test_text.png b/Tests/images/test_text.png new file mode 100644 index 0000000000000000000000000000000000000000..c156399cd1bf603438c1bc1ddcfd8d8872a48b77 GIT binary patch literal 1088 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Q#hD_3@4(|L(Vy zg6AX^UU^|fPBYicvit^>h)eVPrndJE!Rdj>l{o3r)TN)tq*`tMH~oJBRa_6St0Urk8PTmi3!9^(HTd zs<3xkFUY*%o!2JFEEc9Ez4?LT4!!&*@%umKbNjIu|C;|$(4*-n!PT!UMu>Q{_yx6c9s-d)q3uMOMylP*E$We^pO6EI;_QV*Os1XjM6i^^yjEJ z8{=2aQcVZm8j+rp8`gxVX*EPAWM2q)^X>fx_G1TI>SI#bayavv9~Y?FaA#LjC9^ANx;rHW9Ze>oq%vUdnzTwT{I{v=>@xji7sy0`*19v~DtZ9*C7SUP2wk-X3 z;a%Pf9Pe3u4<2FUQsABI=FxQ7(S3tm2Jb$;Nei?qc3io+2~XVd{;$-v<0>gTe~DWM4fE`{4r literal 0 HcmV?d00001 diff --git a/Tests/images/test_y_offset.png b/Tests/images/test_y_offset.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf07b51ccd6961281310399d732c5790b2ed5d1 GIT binary patch literal 1066 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Q#hD_*pBvs=0 z$M?o>SMAP|)|-~PXr`N>%8_-FTN+oomA@N2;&#!?^F?gA zXH&$+rGEvzCQSI0rhC!1L{xUg1gqFHe&=S+G(Pt(WVi9}zXs;dXMX=X_j}BqJJ=kc#Jk$XAKKlJzIuMTsFE*xF7LN^ zj_0ed{${)(c8B*cXF03(gU%&YkJn5HlKl|vtUNW!sr=Ul?oWYnIya=Abnn0T;Ohc) z<;^-vn7^?^H)(s_+H&|`!h(wry?yh{a{5A24WBeiO7`-zi8sAHxMMKK7jRw@G3iS`^jpz0+=}tX=BUT*j1hA;*gcFmdt=jt`HU8<@gmyA4|)^K zV_NEd=u}wG2>rif>9miIAH1qm-!#_FBKOytb>{9Im!z#usg7KkiKpSeuliT4SoW)+6-0 zda;4DYyEYvu}>y zeV56eP5*Dd^Q2|de;%!!=qqZzH1>l`4~so(xZk-KORkAqT8N!td|>mYeewlP?gxA` z7&+JY-mpITcuLf*?1@#L0pF^#Hnpp7-RJjX%dIccoN_bYZ1lW*RHs62AEzJtem3@| o>CHPQ+iDS)dvN5i;G_5V-8}oXx3+Z=unb`EboFyt=akR{04mknZU6uP literal 0 HcmV?d00001 diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py new file mode 100644 index 000000000..02c432527 --- /dev/null +++ b/Tests/test_imagefontctl.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +from helper import unittest, PillowTestCase +from PIL import Image +from PIL import ImageDraw + +FONT_SIZE = 20 +FONT_PATH = "Tests/fonts/DejaVuSans.ttf" + +try: + from PIL import ImageFont + + # check if raqm is available + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'TEST', font=ttf, fill=500, direction='ltr') + + class TestImagecomplextext(PillowTestCase): + + def test_complex_text(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'اهلا عمان', font=ttf, fill=500) + + target = 'Tests/images/test_text.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_y_offset(self): + ttf = ImageFont.truetype("Tests/fonts/NotoNastaliqUrdu-Regular.ttf", FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'هنا عمان', font=ttf, fill=500) + + target = 'Tests/images/test_y_offset.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_complex_unicode_text(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), u'مرحبا بكم', font=ttf, fill=500) + + target = 'Tests/images/test_complex_unicode_text.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_text_direction_rtl(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'English عربي', font=ttf, fill=500, direction='rtl') + + target = 'Tests/images/test_direction_rtl.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_text_direction_ltr(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'سلطنة عمان Oman', font=ttf, fill=500, direction='ltr') + + target = 'Tests/images/test_direction_ltr.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_text_direction_rtl2(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'Oman سلطنة عمان', font=ttf, fill=500, direction='rtl') + + target = 'Tests/images/test_direction_ltr.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_ligature_features(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'filling', font=ttf, fill=500, features=['-liga']) + + target = 'Tests/images/test_ligature_features.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_kerning_features(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'TeToAV', font=ttf, fill=500, features=['-kern']) + + target = 'Tests/images/test_kerning_features.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + + def test_arabictext_features(self): + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) + + im = Image.new(mode='RGB', size=(300, 100)) + draw = ImageDraw.Draw(im) + draw.text((0, 0), 'اللغة العربية', font=ttf, fill=500, features=['-fina','-init','-medi']) + + target = 'Tests/images/test_arabictext_features.png' + target_img = Image.open(target) + + self.assert_image_similar(im, target_img, .5) + +except (KeyError, ImportError): + class TestImagecomplextext(PillowTestCase): + def test_skip(self): + self.skipTest("KeyError") + +if __name__ == '__main__': + unittest.main() + +# End of file diff --git a/_imagingft.c b/_imagingft.c index e1130b016..201782143 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -588,17 +588,21 @@ font_render(FontObject* self, PyObject* args) for (x = i = 0; i < count; i++) { if (i == 0 && self->face->glyph->metrics.horiBearingX < 0) - x = -PIXEL(self->face->glyph->metrics.horiBearingX); + x = -self->face->glyph->metrics.horiBearingX; index = glyph_info[i].index; error = FT_Load_Glyph(self->face, index, load_flags); if (error) return geterror(error); + if (i == 0 && self->face->glyph->metrics.horiBearingX < 0) { + x = -self->face->glyph->metrics.horiBearingX; + } + glyph = self->face->glyph; source = (unsigned char*) glyph->bitmap.buffer; - xx = x + glyph->bitmap_left; + xx = PIXEL(x) + glyph->bitmap_left; xx += PIXEL(glyph_info[i].x_offset); x0 = 0; x1 = glyph->bitmap.width; @@ -644,7 +648,7 @@ font_render(FontObject* self, PyObject* args) source += glyph->bitmap.pitch; } } - x += PIXEL(glyph_info[i].x_advance); + x += glyph_info[i].x_advance; } PyMem_Del(glyph_info); Py_RETURN_NONE; diff --git a/selftest.py b/selftest.py index 067db4d79..cfb6a2b43 100755 --- a/selftest.py +++ b/selftest.py @@ -178,7 +178,8 @@ if __name__ == "__main__": ("freetype2", "FREETYPE2"), ("littlecms2", "LITTLECMS2"), ("webp", "WEBP"), - ("transp_webp", "Transparent WEBP") + ("transp_webp", "Transparent WEBP"), + ("raqm", "RAQM") ]: supported = features.check_module(name) From 95a2ac1086d2fc3815aedd96eea666f2b7c42d9e Mon Sep 17 00:00:00 2001 From: shamsa Date: Thu, 4 Feb 2016 12:47:24 +0400 Subject: [PATCH 07/22] Solve merge conflict --- PIL/ImageDraw.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index 1c205e924..cb2b87905 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -217,11 +217,9 @@ class ImageDraw(object): return text.split(split_character) - def text(self, xy, text, fill=None, font=None, anchor=None, - direction=None, features=None, *args, **kwargs): + def text(self, xy, text, fill=None, font=None, anchor=None, *args, **kwargs): if self._multiline_check(text): - return self.multiline_text(xy, text, fill, font, anchor, - direction=direction, features=features, *args, **kwargs) + return self.multiline_text(xy, text, fill, font, anchor, *args, **kwargs) ink, fill = self._getink(fill) if font is None: font = self.getfont() @@ -229,11 +227,11 @@ class ImageDraw(object): ink = fill if ink is not None: try: - mask, offset = font.getmask2(text, self.fontmode, direction=direction, features=features) + mask, offset = font.getmask2(text, self.fontmode, *args, **kwargs) xy = xy[0] + offset[0], xy[1] + offset[1] except AttributeError: try: - mask = font.getmask(text, self.fontmode, direction, features) + mask = font.getmask(text, self.fontmode, *args, **kwargs) except TypeError: mask = font.getmask(text) self.draw.draw_bitmap(xy, mask, ink) From c6d5de60d49eefc7bdfdc1f2322095fc3a54f54b Mon Sep 17 00:00:00 2001 From: shamsa Date: Tue, 16 Feb 2016 11:52:59 +0400 Subject: [PATCH 08/22] Fix gitsize function. --- PIL/ImageFont.py | 6 +- Tests/images/test_complex_unicode_text.png | Bin 1075 -> 1075 bytes _imagingft.c | 81 +++++++++++---------- 3 files changed, 46 insertions(+), 41 deletions(-) diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 985570c8a..b8059933c 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -136,8 +136,8 @@ class FreeTypeFont(object): def getmetrics(self): return self.font.ascent, self.font.descent - def getsize(self, text): - size, offset = self.font.getsize(text) + def getsize(self, text, direction=None, features=None): + size, offset = self.font.getsize(text, direction, features) return (size[0] + offset[0], size[1] + offset[1]) def getoffset(self, text): @@ -147,7 +147,7 @@ class FreeTypeFont(object): return self.getmask2(text, mode, direction=direction, features=features)[0] def getmask2(self, text, mode="", fill=Image.core.fill, direction=None, features=None): - size, offset = self.font.getsize(text) + size, offset = self.font.getsize(text, direction, features) im = fill("L", size, 0) self.font.render(text, im.id, mode == "1", direction, features) return im, offset diff --git a/Tests/images/test_complex_unicode_text.png b/Tests/images/test_complex_unicode_text.png index 565a2f9328df4c5dab8218c59c88360dfc7f40a3..dd4f6bf223fef6f5de91e9929494c109e1e85edf 100644 GIT binary patch delta 945 zcmV;i15W(22(t)~Hh**!8$&9?TNqLF5=B~s4;h6*Nf*Mvq*9_Ry5K`-NDqOC(L+xa zkwq5@!Sbn#1d&D;p$IY2%xH8n2Z=#PXPiYKMAL(Fat7zj%sDz9t?%dY?DhYzbvFBd z*4q254U!~D()q8Ymd4F68?G3wu}J?X<6$v;8JB9!WMF?5IaaQ*4! zu?VGqHPzI*8OFe$@arfINBaM%tq40{JSh0MUuHT0m&4DY4gP|el`VCv z!xz1@z>UxYog+It(%CZ$dO}zDICS)T8o4iQ4DI1?SjEZDJHlsS768-W&G1_&p(pGP z%SX`TM0hRiuSES6mc!c6+OLak;ni^Gi2u#}Je2TWI9N$?By0}f41B)2r2g|HjhYiX zLVuqHpat%Nr(h9GXz;jdumnojI@mHeFc+4=qm?OFI_InlCER<4vaNud&Q=uA1W!X( zI2PvCl|gE}H_m7gmat;&ngRG5 zK7lp8{8CT1QiJssVLR-C?#7O#7Co>BS_$F%UN%8{qsJqY(F018&;uD5={)ccaRKgE T5`#lM00000NkvXXu0mjf$pOm0 delta 945 zcmV;i15W(22(t)~Hh-K^Yz(OkZ(&5yOB87lK4cUMC0z&ulS+xQ=z65r1k0x`5=0tZgd)U5Go#UIa*!BwbjH~PLUej?4xYg|Gv^!~kLLIDc=r1L*E*a1 zKWpuM)&@zEBBmt&N4vg2%$6 zFa?god!;ivC`lu@13nJ@p$L1!D!8o9496hxxEJ912C~tdjgrczC$w^{uci z6yacaGh8y#(4=O20E*BTI>NC~ghf?aKF8qygqNRksDD5FP=67Q95n}ag(4gXtE#kl zB^0OpE?f(}p$PlKkx+#9y`j~)YCE}J0S?P_3fv|PN3w;U{ z;ggCsC!%&%iCPSY!$5d7Os<}G85H5Ep&!0faR)mMxMs&)|lb&EZdYt;Di&X-$P0a10if*btV$!q5d5 z!8HJE7;P)*MpzEJ!hV=gj%tN(LkAp($uPD2a(~87c%($vXy0T809V4Vp%earS>-Kt zYrP_~tD%h`$oTHsme z3&+B|hB8Ra_tqIL!Xm63`=}PU8lHroLJ@kyL-ltmoeLU#sdogE8hXLEuBa{HCTIiT zU-%5xmiVoaZl&gH1-fB3^f!AbwHtuF&s4%^r`F;R8C8&;uzLr1QgnJM`{X TlFJiF00000NkvXXu0mjf(Y3al diff --git a/_imagingft.c b/_imagingft.c index 201782143..ae570af51 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -205,60 +205,69 @@ font_getchar(PyObject* string, int index, FT_ULong* char_out) return 0; } +static size_t +text_layout(PyObject* string, FontObject* self, const char* dir, + PyObject *features ,GlyphInfo **glyph_info, int mask); + static PyObject* font_getsize(FontObject* self, PyObject* args) { int i, x, y_max, y_min; - FT_ULong ch; FT_Face face; int xoffset, yoffset; - FT_Bool kerning = FT_HAS_KERNING(self->face); - FT_UInt last_index = 0; + const char *dir = NULL; + size_t count; + GlyphInfo *glyph_info = NULL;; + PyObject *features = Py_None; /* calculate size and bearing for a given string */ PyObject* string; - if (!PyArg_ParseTuple(args, "O:getsize", &string)) + if (!PyArg_ParseTuple(args, "O|zO:getsize", &string, &dir, &features)) return NULL; -#if PY_VERSION_HEX >= 0x03000000 - if (!PyUnicode_Check(string)) { -#else - if (!PyUnicode_Check(string) && !PyString_Check(string)) { -#endif - PyErr_SetString(PyExc_TypeError, "expected string"); - return NULL; - } - face = NULL; xoffset = yoffset = 0; y_max = y_min = 0; - for (x = i = 0; font_getchar(string, i, &ch); i++) { + count = text_layout(string, self, dir, features, &glyph_info, 0); + if (count == 0) + return NULL; + + for (x = i = 0; i < count; i++) { int index, error; FT_BBox bbox; FT_Glyph glyph; face = self->face; - index = FT_Get_Char_Index(face, ch); - if (kerning && last_index && index) { - FT_Vector delta; - FT_Get_Kerning(self->face, last_index, index, ft_kerning_default, - &delta); - x += delta.x; - } - - /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 - * Yifu Yu, 2014-10-15 - */ + index = glyph_info[i].index; + /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 + * Yifu Yu, 2014-10-15 + */ error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT|FT_LOAD_NO_BITMAP); if (error) return geterror(error); - if (i == 0) + + if (i == 0 && face->glyph->metrics.horiBearingX < 0) { xoffset = face->glyph->metrics.horiBearingX; - x += face->glyph->metrics.horiAdvance; + x -= xoffset; + } + + x += glyph_info[i].x_advance; + + if (i == count - 1) + { + int offset; + offset = glyph_info[i].x_advance - + face->glyph->metrics.width - + face->glyph->metrics.horiBearingX; + if (offset < 0) + x -= offset; + } FT_Get_Glyph(face->glyph, &glyph); FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_SUBPIXELS, &bbox); + bbox.yMax -= glyph_info[i].y_offset; + bbox.yMin -= glyph_info[i].y_offset; if (bbox.yMax > y_max) y_max = bbox.yMax; if (bbox.yMin < y_min) @@ -268,23 +277,17 @@ font_getsize(FontObject* self, PyObject* args) if (face->glyph->metrics.horiBearingY > yoffset) yoffset = face->glyph->metrics.horiBearingY; - last_index = index; + //last_index = index; FT_Done_Glyph(glyph); } if (face) { - int offset; + /* left bearing */ if (xoffset < 0) x -= xoffset; else xoffset = 0; - /* right bearing */ - offset = face->glyph->metrics.horiAdvance - - face->glyph->metrics.width - - face->glyph->metrics.horiBearingX; - if (offset < 0) - x -= offset; /* difference between the font ascender and the distance of * the baseline from the top */ yoffset = PIXEL(self->face->size->metrics.ascender - yoffset); @@ -323,7 +326,7 @@ font_getabc(FontObject* self, PyObject* args) int index, error; face = self->face; index = FT_Get_Char_Index(face, ch); - /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 */ + /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 */ error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT|FT_LOAD_NO_BITMAP); if (error) return geterror(error); @@ -589,15 +592,15 @@ font_render(FontObject* self, PyObject* args) for (x = i = 0; i < count; i++) { if (i == 0 && self->face->glyph->metrics.horiBearingX < 0) x = -self->face->glyph->metrics.horiBearingX; - index = glyph_info[i].index; + index = glyph_info[i].index; error = FT_Load_Glyph(self->face, index, load_flags); if (error) return geterror(error); if (i == 0 && self->face->glyph->metrics.horiBearingX < 0) { x = -self->face->glyph->metrics.horiBearingX; - } + } glyph = self->face->glyph; @@ -638,6 +641,7 @@ font_render(FontObject* self, PyObject* args) yy -= PIXEL(glyph_info[i].y_offset); if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ + int i; unsigned char *target = im->image8[yy] + xx; for (i = x0; i < x1; i++) { @@ -650,6 +654,7 @@ font_render(FontObject* self, PyObject* args) } x += glyph_info[i].x_advance; } + PyMem_Del(glyph_info); Py_RETURN_NONE; } From 3130bce60334d19651e37aac87be0f16cabf3626 Mon Sep 17 00:00:00 2001 From: shamsa Date: Thu, 18 Feb 2016 12:53:19 +0400 Subject: [PATCH 09/22] fix testing --- Tests/images/test_complex_unicode_text.png | Bin 1075 -> 1442 bytes Tests/images/test_y_offset.png | Bin 1066 -> 1604 bytes Tests/test_imagefontctl.py | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/images/test_complex_unicode_text.png b/Tests/images/test_complex_unicode_text.png index dd4f6bf223fef6f5de91e9929494c109e1e85edf..f1a6f7ec61d7d9d096f2a39bf84364e7547b4438 100644 GIT binary patch delta 1334 zcmV-61HNkl*YlJm@&dovd#Nq>^0Nv>nmqn*$N$G=Uv z3^fC~;N(_>8ge01pbKWTBC^z^<6sf|DSR)Z4f|;*Lf6}s)ezT05f-%~)Q}6A2}Str zsMjuysjazbr^C(R*>HE5122}X&8kULVQu(t?9Qqk$rPH!OjDaAC>C zC2Qf$37u=(3%?H6v~KVE zSxE<6*|K=jk<~yE?t)b?6Ygk5!F&iF3@5{KSX^>b>wkXQ`7`vw*F!r1KAGwruCecg z-!9n%3*h<*pSU|51D`LsrDQEU-FSp9xCBlg>ClRjnXmwWcQuvX1u!3uYih34kP(V- z3cU9%MjwF1C9lE_;R_Qx@%gYBHZ?W39qtN`hTnvz!cVGA?~vcaE3hO0r#7_}E)A=~ zNlm3EHGgDi5nch?!O;6yf6|jl4A!p)VBS?phr#fFkS<=T$u? z!ZV==KO9^Jop5XD4@KA;exAbxFpAql5sJ_s9tbyvheHuo4!c>L1-+pN%fpjlUpTjx z(%(W6c4weUzrsM+)gka6*b|Cyf9(PF(0_#-DtO-=RVyum%~d^g!>8f<)pGx5=nYrF z`V4%Y3q|-xm{TqEm&1mzsVb@>>T-xgqp~`@-%}gcYF;E`=iO3hQerZ4E`(6P^hD;pOnxP=qJLmRj)b;eRi+ zSv|Fqvk28PbD=-%4-bZ2we`0(tO+~9?$FKQ{$1gr4E*468r&6LtahiT!V*{(p0AbJ zs_;d4JnRjRhyL(F=n0D&{D0GrLlM4KHK)Ve>M`<=<+XyZ|8rs~?5Gay3@gK_a8m|$ z`@P}I@DUE*9eTni;Gx=0WJg#TrhnIBT7+tuWuXY)1)u{ihHt=^hJCd=>h26hm_O>6 zz!@-m+`p{MfH}4QLr#P9VfI9_lp53y19$i50eBt$FoAI2f%R}ad;sp8cy^5|;e|%V z_d#E+c>p%HI3sBcZM5{ou3N%I@VU_KLz*-`?PCvV#0dvq0WG<%wQ;5YUk+`+4(Nr~ sj&>?znk;!rlhFf8lh6Yh7n+a delta 964 zcmV;#13Ubp3$qB2BYy+>NklnIIJ`v0k|2s>as%z$-HVp5|_ zfNw(y&z(k+k$)^lAA|OAAnXdCh8M#ExbQSOmCh&4Ftz&8%b+dvgnR1EKawJR6846+ zaJ2F$sDz_oL%5@^PRG?1B{jfO_#>3CJKSHT%^WxqI>NPs9sMzE9J0U$Ey8M1O)w4S z!J2R=l+acs`R(xFU@PpKVQVPiV0b-TG}O?fM!OG6=zj{W;aDhPVU?E8(Dy&#rKcR~ z4&T*YghNNohMl2=17T&AHZO&8%J0I}&>2eD7mkDy-t~r7=dx{~gj)fa4<&q6<&wRI zz9r)33|Q%ngPyQu$P0Zkl<-l%HYcKXREb&yheJ&6J zW&dzrW;y_u!_T1&{(_m6Ep@BI7rnH=jnD&~BRf0N*)t1zLRa`Wbo6@~xi4%C?cs1( z#mUb*!e?O?0Mp>j@LMRMC+rT(N6_O$crEO&MEw+&!`jf=uZwNr)o|yC|IPe7l<;0S zSbs@!By0}f41B)2r2g|HjhYiXLZ1bo1@3~UU=d7c@VIKQ1WMRC*fKaU7nZ@Jl_^&` z=d24Q+@(Rus?#PeWHY7UtHKL2A4=&S(*quwwM1n&3)!9DWETbcP3N?^J5I z`d{iD!o<2>@U1CobGQMT0r(p}fi=DSQXEgWQiJssVLR-C?#7O#7Co>BTH*U%HbHx% m$0L(L1xb@&1sWLXJn#>30q$24gF`(40000ngBx4s1fQHC?C4O zQHfEiZKo$79o2ea zMRa-+QV}L}dIF=g0KVz;9Hc@Vu8Z)OLDK0tNQLOkBK*^suOu(PMW`c02NvOpFn7#B zehB*un2XeT9aw~m;J}!J91DY`0wyDMTn856yx@y52kC}S3Yd%3c^z1U0}aZ#ALot` zFcID#?F8ypr1`T;#ed4R2rnx%Wj}nGY8-&8b4QpA!1h%8L^v;NY~6~qrR-9%vKQg` z@Xsj!yD!9)dNtvl!M5BH`e6s`OtsI4*;!-jR-`Rumx`6W2$uxY3*8L6VPEY%m4M&C zuG|skz^nDze-(V3H8x$5wwhfkR`w#i5`YtmOW6%OYFh@NAAk1cj&ObOLcLp~7r|#) zW78FBtJ$SuWiP^20DM$XzHXS1x~Fm$ko&pcG?)zM1h>JA+K*1n5hPuawv=5eT=pV- zxx@i@t)P5U;5&G;wsB~i&AAutgML^Fj|5wTld2;3!B;sZFrp@GDZ5m-uFM|2@H~7y zs_4D&6F3O}gMXpx$J1alBdfBh@Lld>Xp3M@<^6=J71a;G!K~rwinOKdQsJ_9!k-0C zkLqm7jqqNuHh48y9py~d2G6IW^#)00l{R-CJXH0R@2RS5%U%G!&5Dq&Nb_fxI%9Qk zOzWej!TKPny!Hpv;11Xp9GB|6EO;yHNOvDR8tku%`F~b0y{f~-kOa-cbVCySwDs&# z`wU->PDx#o&4eYeJ;(NvHVBuN_;;`nfH&anpbKs&)v3OEvr4jAuqw*W0C&SWSYP5_ z@Of3A5l=D$24E^|soE{;R-~EPrE&6PFtxVjzA=2~=t9_3wQKDRo((Q&(E0ITW#dHC zVM{O=JbxC{8YFT4XwN^EK{q%XBQRr_mj5PnhO-V*B@7jHv5;m~Y<#9(m|YqtPX!C=wOtD}&AOV5#O5+uwtK!0YXqTyKsq=}L#azRE-S^y}T=^nXgX zXDW@qs~USR{3qJ@3)>C^=d>-jbO^Z)4y0D#+Te_;K7Xz}_?}g1nGYNCon;xFE=Yn? z+ZJCsv|Isef<3|igBOAu>wVkz7C5c)ehzGi;UC*!=xawavO7vgpP$2vwfkf{^gt4M zPoGLhh`Zrrm<6u{*EjCA6pn5GWJY>mj|a+hRQY4&wAaSUcj4Q;*EQD-+gyY?3Y2ec z9uIc`FtzejU~9c!aXp^Cg~5(aKpJlYuqjvsli+@s*6H~GtK11Clko#0lkWo%7^Hf> Y2N~o?D2~tY5&!@I07*qoM6N<$f;jN&`v3p{ delta 973 zcmV;;12X)?45|o_BYy+&NkljpwZz= zO>Q=9j#Onam%@&Wmd^%5b?mid zg}e{LC5I2dcL1D&k6>xSo3OUNaH*x737$z;?uC4e-A|VKI>-k*>RYU`LjG|iI2>#W zhJyje{3auH7>14Rre=zFcZ$CI~TfKpDqp*KYzIyX4Wx+%8+h&6mEhA zupAD+V%P|C;ltoWa4y(g&&5g2pbhARc_nY*27`X+heNQlSo{kT7)f_7%&`YyOR=&N zwimZLJK&ExMo<=#gI&SObem6LW5RW?4CcWp*iqNjNll;)e^>)UB@cU*`;$Np0*{ zNxD+DKM7m|$165MZ{^Y(`NB*2-tnKkEaXUxeP3GRDN$-Q-^S%1-d4e`ioKA4LnZU) z$qAjkEM(P$e?p`t)&`?BHzy0;3m&RgzYV?&P6vY-A7|I&UkQ<#)zy#>`f9f6gJC~X zk^UovPd5j%U%TA`KL#)Tk3*8Cm-)qgkxdmhrCsnGj08UgS5D68q}CTXI2OzS;5_Vy zlh6qZ;0~Ap39L=nJIUjeTH0%odPz|Bdup|KH diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 02c432527..6c03fb168 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -34,7 +34,7 @@ try: im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) - draw.text((0, 0), 'هنا عمان', font=ttf, fill=500) + draw.text((0, 0), 'العالم العربي', font=ttf, fill=500) target = 'Tests/images/test_y_offset.png' target_img = Image.open(target) @@ -46,7 +46,7 @@ try: im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) - draw.text((0, 0), u'مرحبا بكم', font=ttf, fill=500) + draw.text((0, 0), u'السلام عليكم', font=ttf, fill=500) target = 'Tests/images/test_complex_unicode_text.png' target_img = Image.open(target) From 1b7401a8b9a6a6a4f74c2b2ee350906a735a452d Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Tue, 13 Dec 2016 09:07:29 +0400 Subject: [PATCH 10/22] fix windows build --- _imagingft.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index ae570af51..948854b6d 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -217,7 +217,7 @@ font_getsize(FontObject* self, PyObject* args) int xoffset, yoffset; const char *dir = NULL; size_t count; - GlyphInfo *glyph_info = NULL;; + GlyphInfo *glyph_info = NULL; PyObject *features = Py_None; /* calculate size and bearing for a given string */ @@ -481,15 +481,16 @@ failed: return count; #else - if (features != Py_None || dir != NULL) - PyErr_SetString(PyExc_KeyError, "Raqm is missing."); - int error, load_flags; FT_ULong ch; Py_ssize_t count; FT_GlyphSlot glyph; FT_Bool kerning = FT_HAS_KERNING(self->face); FT_UInt last_index = 0; + + if (features != Py_None || dir != NULL) + PyErr_SetString(PyExc_KeyError, "setting text direction or font features is not supported without libraqm"); + #if PY_VERSION_HEX >= 0x03000000 if (!PyUnicode_Check(string)) { #else From af0df0c9da933c6c8602d1a364a26f1312545a55 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Tue, 13 Dec 2016 12:37:27 +0400 Subject: [PATCH 11/22] fix windows build --- _imagingft.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_imagingft.c b/_imagingft.c index 948854b6d..e664ff6b0 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -487,6 +487,7 @@ failed: FT_GlyphSlot glyph; FT_Bool kerning = FT_HAS_KERNING(self->face); FT_UInt last_index = 0; + int i; if (features != Py_None || dir != NULL) PyErr_SetString(PyExc_KeyError, "setting text direction or font features is not supported without libraqm"); @@ -515,7 +516,6 @@ failed: load_flags = FT_LOAD_RENDER|FT_LOAD_NO_BITMAP; if (mask) load_flags |= FT_LOAD_TARGET_MONO; - int i; for (i = 0; font_getchar(string, i, &ch); i++) { (*glyph_info)[i].index = FT_Get_Char_Index(self->face, ch); error = FT_Load_Glyph(self->face, (*glyph_info)[i].index, load_flags); From f2ba26860e27566e87491613fa2609c771ca93b1 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Wed, 14 Dec 2016 11:05:14 +0400 Subject: [PATCH 12/22] fix setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 7595acfd3..6c4c437d0 100755 --- a/setup.py +++ b/setup.py @@ -114,7 +114,6 @@ IMAGEQUANT_ROOT = None TIFF_ROOT = None FREETYPE_ROOT = None LCMS_ROOT = None - RAQM_ROOT = None def _pkg_config(name): @@ -515,6 +514,7 @@ class pil_build_ext(build_ext): _add_directory(self.compiler.include_dirs, subdir, 0) if feature.want('raqm'): + _dbg('Looking for raqm') if _find_include_file(self, "raqm.h"): if _find_library_file(self, "raqm") and \ _find_library_file(self, "harfbuzz") and \ From 37e25888bb7aff439f0d59f6044e5df0bf9c6817 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Wed, 14 Dec 2016 11:05:32 +0400 Subject: [PATCH 13/22] improve docs for CTL --- docs/reference/ImageDraw.rst | 16 ++++++++++++---- docs/reference/ImageFont.rst | 8 ++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 6e379475b..20d76cce0 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -240,8 +240,12 @@ Methods the number of pixels between lines. :param align: If the text is passed on to multiline_text(), "left", "center" or "right". - :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt. - :param features: A list of font features used for text layout. For example, 'ligature, kerning, Medial ...etc. + :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. + :param features: A list of font feature to be used during text layout. + This is usually used to turn on optional font features that are not enabled by + default, for example 'dlig' or 'ss01', but can be also used to turn off default + font features for example '-liga' to disable ligatures or '-kern' to disable kerning. + To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm .. py:method:: PIL.ImageDraw.Draw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", direction=None, features=[]) @@ -254,8 +258,12 @@ Methods :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. :param spacing: The number of pixels between lines. :param align: "left", "center" or "right". - :param direction: Direction of the text. - :param features: Font features used for text layout. + :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. + :param features: A list of font feature to be used during text layout. + This is usually used to turn on optional font features that are not enabled by + default, for example 'dlig' or 'ss01', but can be also used to turn off default + font features for example '-liga' to disable ligatures or '-kern' to disable kerning. + To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm .. py:method:: PIL.ImageDraw.Draw.textsize(text, font=None, spacing=0) diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index 40e7d7f46..3a0b06732 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -63,8 +63,12 @@ Methods driver prefers; if empty, the renderer may return either mode. Note that the mode is always a string, to simplify C-level implementations. - :param direction: Direction of the text. - :param features: A list of font features used for text layout. + :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. + :param features: A list of font feature to be used during text layout. This is + usually used to turn on optional font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also used to turn off default font + features for example '-liga' to disable ligatures or '-kern' to disable kerning. + To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm .. versionadded:: 1.1.5 :return: An internal PIL storage memory instance as defined by the From ebdc297f4c1cd912fdeb5a0b37fc81417e584bce Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Wed, 14 Dec 2016 11:07:09 +0400 Subject: [PATCH 14/22] break up text_layout into two implementations --- _imagingft.c | 308 +++++++++++++++++++++++++++------------------------ 1 file changed, 161 insertions(+), 147 deletions(-) diff --git a/_imagingft.c b/_imagingft.c index e664ff6b0..79d358dfe 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -206,147 +206,9 @@ font_getchar(PyObject* string, int index, FT_ULong* char_out) } static size_t -text_layout(PyObject* string, FontObject* self, const char* dir, - PyObject *features ,GlyphInfo **glyph_info, int mask); - -static PyObject* -font_getsize(FontObject* self, PyObject* args) -{ - int i, x, y_max, y_min; - FT_Face face; - int xoffset, yoffset; - const char *dir = NULL; - size_t count; - GlyphInfo *glyph_info = NULL; - PyObject *features = Py_None; - - /* calculate size and bearing for a given string */ - - PyObject* string; - if (!PyArg_ParseTuple(args, "O|zO:getsize", &string, &dir, &features)) - return NULL; - - face = NULL; - xoffset = yoffset = 0; - y_max = y_min = 0; - - count = text_layout(string, self, dir, features, &glyph_info, 0); - if (count == 0) - return NULL; - - for (x = i = 0; i < count; i++) { - int index, error; - FT_BBox bbox; - FT_Glyph glyph; - face = self->face; - index = glyph_info[i].index; - /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 - * Yifu Yu, 2014-10-15 - */ - error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT|FT_LOAD_NO_BITMAP); - if (error) - return geterror(error); - - if (i == 0 && face->glyph->metrics.horiBearingX < 0) { - xoffset = face->glyph->metrics.horiBearingX; - x -= xoffset; - } - - x += glyph_info[i].x_advance; - - if (i == count - 1) - { - int offset; - offset = glyph_info[i].x_advance - - face->glyph->metrics.width - - face->glyph->metrics.horiBearingX; - if (offset < 0) - x -= offset; - } - - FT_Get_Glyph(face->glyph, &glyph); - FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_SUBPIXELS, &bbox); - bbox.yMax -= glyph_info[i].y_offset; - bbox.yMin -= glyph_info[i].y_offset; - if (bbox.yMax > y_max) - y_max = bbox.yMax; - if (bbox.yMin < y_min) - y_min = bbox.yMin; - - /* find max distance of baseline from top */ - if (face->glyph->metrics.horiBearingY > yoffset) - yoffset = face->glyph->metrics.horiBearingY; - - //last_index = index; - FT_Done_Glyph(glyph); - } - - if (face) { - - /* left bearing */ - if (xoffset < 0) - x -= xoffset; - else - xoffset = 0; - /* difference between the font ascender and the distance of - * the baseline from the top */ - yoffset = PIXEL(self->face->size->metrics.ascender - yoffset); - } - - return Py_BuildValue( - "(ii)(ii)", - PIXEL(x), PIXEL(y_max - y_min), - PIXEL(xoffset), yoffset - ); -} - -static PyObject* -font_getabc(FontObject* self, PyObject* args) -{ - FT_ULong ch; - FT_Face face; - double a, b, c; - - /* calculate ABC values for a given string */ - - PyObject* string; - if (!PyArg_ParseTuple(args, "O:getabc", &string)) - return NULL; - -#if PY_VERSION_HEX >= 0x03000000 - if (!PyUnicode_Check(string)) { -#else - if (!PyUnicode_Check(string) && !PyString_Check(string)) { -#endif - PyErr_SetString(PyExc_TypeError, "expected string"); - return NULL; - } - - if (font_getchar(string, 0, &ch)) { - int index, error; - face = self->face; - index = FT_Get_Char_Index(face, ch); - /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 */ - error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT|FT_LOAD_NO_BITMAP); - if (error) - return geterror(error); - a = face->glyph->metrics.horiBearingX / 64.0; - b = face->glyph->metrics.width / 64.0; - c = (face->glyph->metrics.horiAdvance - - face->glyph->metrics.horiBearingX - - face->glyph->metrics.width) / 64.0; - } else - a = b = c = 0.0; - - return Py_BuildValue("ddd", a, b, c); -} - - -static size_t -text_layout(PyObject* string, FontObject* self, const char* dir, +text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject *features ,GlyphInfo **glyph_info, int mask) { -#ifdef HAVE_RAQM int i = 0; raqm_t *rq; size_t count = 0; @@ -479,8 +341,12 @@ text_layout(PyObject* string, FontObject* self, const char* dir, failed: raqm_destroy (rq); return count; +} -#else +static size_t +text_layout_fallback(PyObject* string, FontObject* self, const char* dir, + PyObject *features ,GlyphInfo **glyph_info, int mask) +{ int error, load_flags; FT_ULong ch; Py_ssize_t count; @@ -489,9 +355,9 @@ failed: FT_UInt last_index = 0; int i; - if (features != Py_None || dir != NULL) + if (features != Py_None || dir != NULL) { PyErr_SetString(PyExc_KeyError, "setting text direction or font features is not supported without libraqm"); - + } #if PY_VERSION_HEX >= 0x03000000 if (!PyUnicode_Check(string)) { #else @@ -502,10 +368,12 @@ failed: } count = 0; - while (font_getchar(string, count, &ch)) + while (font_getchar(string, count, &ch)) { count++; - if (count == 0) + } + if (count == 0) { return 0; + } (*glyph_info) = PyMem_New(GlyphInfo, count); if ((*glyph_info) == NULL) { @@ -514,8 +382,9 @@ failed: } load_flags = FT_LOAD_RENDER|FT_LOAD_NO_BITMAP; - if (mask) + if (mask) { load_flags |= FT_LOAD_TARGET_MONO; + } for (i = 0; font_getchar(string, i, &ch); i++) { (*glyph_info)[i].index = FT_Get_Char_Index(self->face, ch); error = FT_Load_Glyph(self->face, (*glyph_info)[i].index, load_flags); @@ -538,7 +407,150 @@ failed: (*glyph_info)[i].cluster = ch; } return count; +} + +static size_t +text_layout(PyObject* string, FontObject* self, const char* dir, + PyObject *features, GlyphInfo **glyph_info, int mask) +{ + size_t count; +#ifdef HAVE_RAQM + count = text_layout_raqm(string, self, dir, features, glyph_info, mask); +#else + count = text_layout_fallback(string, self, dir, features, glyph_info, mask); #endif + return count; +} + +static PyObject* +font_getsize(FontObject* self, PyObject* args) +{ + int i, x, y_max, y_min; + FT_Face face; + int xoffset, yoffset; + const char *dir = NULL; + size_t count; + GlyphInfo *glyph_info = NULL; + PyObject *features = Py_None; + + /* calculate size and bearing for a given string */ + + PyObject* string; + if (!PyArg_ParseTuple(args, "O|zO:getsize", &string, &dir, &features)) + return NULL; + + face = NULL; + xoffset = yoffset = 0; + y_max = y_min = 0; + + count = text_layout(string, self, dir, features, &glyph_info, 0); + if (count == 0) + return NULL; + + for (x = i = 0; i < count; i++) { + int index, error; + FT_BBox bbox; + FT_Glyph glyph; + face = self->face; + index = glyph_info[i].index; + /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 + * Yifu Yu, 2014-10-15 + */ + error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT|FT_LOAD_NO_BITMAP); + if (error) + return geterror(error); + + if (i == 0 && face->glyph->metrics.horiBearingX < 0) { + xoffset = face->glyph->metrics.horiBearingX; + x -= xoffset; + } + + x += glyph_info[i].x_advance; + + if (i == count - 1) + { + int offset; + offset = glyph_info[i].x_advance - + face->glyph->metrics.width - + face->glyph->metrics.horiBearingX; + if (offset < 0) + x -= offset; + } + + FT_Get_Glyph(face->glyph, &glyph); + FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_SUBPIXELS, &bbox); + bbox.yMax -= glyph_info[i].y_offset; + bbox.yMin -= glyph_info[i].y_offset; + if (bbox.yMax > y_max) + y_max = bbox.yMax; + if (bbox.yMin < y_min) + y_min = bbox.yMin; + + /* find max distance of baseline from top */ + if (face->glyph->metrics.horiBearingY > yoffset) + yoffset = face->glyph->metrics.horiBearingY; + + FT_Done_Glyph(glyph); + } + + if (face) { + + /* left bearing */ + if (xoffset < 0) + x -= xoffset; + else + xoffset = 0; + /* difference between the font ascender and the distance of + * the baseline from the top */ + yoffset = PIXEL(self->face->size->metrics.ascender - yoffset); + } + + return Py_BuildValue( + "(ii)(ii)", + PIXEL(x), PIXEL(y_max - y_min), + PIXEL(xoffset), yoffset + ); +} + +static PyObject* +font_getabc(FontObject* self, PyObject* args) +{ + FT_ULong ch; + FT_Face face; + double a, b, c; + + /* calculate ABC values for a given string */ + + PyObject* string; + if (!PyArg_ParseTuple(args, "O:getabc", &string)) + return NULL; + +#if PY_VERSION_HEX >= 0x03000000 + if (!PyUnicode_Check(string)) { +#else + if (!PyUnicode_Check(string) && !PyString_Check(string)) { +#endif + PyErr_SetString(PyExc_TypeError, "expected string"); + return NULL; + } + + if (font_getchar(string, 0, &ch)) { + int index, error; + face = self->face; + index = FT_Get_Char_Index(face, ch); + /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 */ + error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT|FT_LOAD_NO_BITMAP); + if (error) + return geterror(error); + a = face->glyph->metrics.horiBearingX / 64.0; + b = face->glyph->metrics.width / 64.0; + c = (face->glyph->metrics.horiAdvance - + face->glyph->metrics.horiBearingX - + face->glyph->metrics.width) / 64.0; + } else + a = b = c = 0.0; + + return Py_BuildValue("ddd", a, b, c); } static PyObject* @@ -562,13 +574,15 @@ font_render(FontObject* self, PyObject* args) GlyphInfo *glyph_info; PyObject *features = NULL; - if (!PyArg_ParseTuple(args, "On|izO:render", &string, &id, &mask, &dir, &features)) + if (!PyArg_ParseTuple(args, "On|izO:render", &string, &id, &mask, &dir, &features)) { return NULL; + } glyph_info = NULL; count = text_layout(string, self, dir, features, &glyph_info, mask); - if (count == 0) + if (count == 0) { return NULL; + } im = (Imaging) id; /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 */ From 629522af5661d99e43f1225e111be9a40d0b400e Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Wed, 14 Dec 2016 11:07:58 +0400 Subject: [PATCH 15/22] update depends/* to install raqm --- depends/debian_8.2.sh | 3 ++- depends/fedora_23.sh | 4 +++- depends/freebsd_10.sh | 4 +++- depends/install_raqm.sh | 19 +++++++++++++++++++ depends/ubuntu_14.04.sh | 6 ++++-- 5 files changed, 31 insertions(+), 5 deletions(-) create mode 100755 depends/install_raqm.sh diff --git a/depends/debian_8.2.sh b/depends/debian_8.2.sh index 96e6a8e2b..c4f72bf8e 100755 --- a/depends/debian_8.2.sh +++ b/depends/debian_8.2.sh @@ -11,7 +11,8 @@ sudo apt-get -y install python-dev python-setuptools \ python3-dev python-virtualenv cmake sudo apt-get -y install libtiff5-dev libjpeg62-turbo-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev \ - python-tk python3-tk + python-tk python3-tk libharfbuzz-dev libfribidi-dev ./install_openjpeg.sh ./install_imagequant.sh +./install_raqm.sh diff --git a/depends/fedora_23.sh b/depends/fedora_23.sh index bad03e764..f9ef9e814 100755 --- a/depends/fedora_23.sh +++ b/depends/fedora_23.sh @@ -15,4 +15,6 @@ sudo dnf install python-devel python3-devel python-virtualenv make gcc sudo dnf install libtiff-devel libjpeg-devel zlib-devel freetype-devel \ lcms2-devel libwebp-devel openjpeg2-devel tkinter python3-tkinter \ - tcl-devel tk-devel \ No newline at end of file + tcl-devel tk-devel harfbuzz-devel fribidi-devel + +./install_raqm.sh \ No newline at end of file diff --git a/depends/freebsd_10.sh b/depends/freebsd_10.sh index 99b4d6d0f..205b6660e 100755 --- a/depends/freebsd_10.sh +++ b/depends/freebsd_10.sh @@ -8,4 +8,6 @@ sudo pkg install python2 python3 py27-pip py27-virtualenv py27-setuptools27 # Openjpeg fails badly using the openjpeg package. # I can't find a python3.4 version of tkinter -sudo pkg install jpeg-turbo tiff webp lcms2 freetype2 py27-tkinter +sudo pkg install jpeg-turbo tiff webp lcms2 freetype2 harfbuzz fribidi py27-tkinter + +./install_raqm.sh \ No newline at end of file diff --git a/depends/install_raqm.sh b/depends/install_raqm.sh new file mode 100755 index 000000000..31950aa4a --- /dev/null +++ b/depends/install_raqm.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# install raqm + + +if [ ! -f raqm-0.2.0.tar.gz ]; then + wget -O 'raqm-0.2.0.tar.gz' 'https://github.com/HOST-Oman/libraqm/releases/download/v0.2.0/raqm-0.2.0.tar.gz?raw=true' + +fi + +rm -r raqm-0.2.0 +tar -xvzf raqm-0.2.0.tar.gz + + +pushd raqm-0.2.0 + +./configure --prefix=/usr && make -j4 && sudo make -j4 install + +popd + diff --git a/depends/ubuntu_14.04.sh b/depends/ubuntu_14.04.sh index a548f74fa..97d142165 100755 --- a/depends/ubuntu_14.04.sh +++ b/depends/ubuntu_14.04.sh @@ -4,12 +4,14 @@ # Installs all of the dependencies for Pillow for Ubuntu 14.04 # for both system Pythons 2.7 and 3.4 # - +sudo add-apt-repository -y ppa:as-bahanta/raqm +sudo apt-get update sudo apt-get -y install python-dev python-setuptools \ python3-dev python-virtualenv cmake sudo apt-get -y install libtiff5-dev libjpeg8-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev \ - python-tk python3-tk + python-tk python3-tk libharfbuzz-dev libfribidi-dev ./install_openjpeg.sh ./install_imagequant.sh +./install_raqm.sh From 22d2a5e49cb69aafb2ce5204d36e6ec827d64279 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Wed, 14 Dec 2016 11:10:15 +0400 Subject: [PATCH 16/22] only catch ImportError same as test_imagefont.py --- Tests/test_imagefontctl.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 6c03fb168..31e9630b6 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -125,10 +125,10 @@ try: self.assert_image_similar(im, target_img, .5) -except (KeyError, ImportError): +except ImportError: class TestImagecomplextext(PillowTestCase): def test_skip(self): - self.skipTest("KeyError") + self.skipTest("ImportError") if __name__ == '__main__': unittest.main() From b18ead33f1325b856ab429cb0b8c296557fd49b3 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Wed, 14 Dec 2016 11:29:09 +0400 Subject: [PATCH 17/22] declare text_layout_raqm only when we HAVE_RAQM --- _imagingft.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_imagingft.c b/_imagingft.c index 79d358dfe..d1bbe5822 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -205,6 +205,7 @@ font_getchar(PyObject* string, int index, FT_ULong* char_out) return 0; } +#ifdef HAVE_RAQM static size_t text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject *features ,GlyphInfo **glyph_info, int mask) @@ -342,6 +343,7 @@ failed: raqm_destroy (rq); return count; } +#endif static size_t text_layout_fallback(PyObject* string, FontObject* self, const char* dir, From 5833779c48f244f6e1d7b2049459c7b375fa77f6 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Wed, 14 Dec 2016 11:49:21 +0400 Subject: [PATCH 18/22] adding KeyError exception so the test not fail when there is no raqm lib. --- Tests/test_imagefontctl.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 31e9630b6..2a6463159 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -129,6 +129,10 @@ except ImportError: class TestImagecomplextext(PillowTestCase): def test_skip(self): self.skipTest("ImportError") +except KeyError: + class TestImagecomplextext(PillowTestCase): + def test_skip(self): + self.skipTest("KeyError") if __name__ == '__main__': unittest.main() From 4b8d884256b8d699ef0901d02df3591535b7c0d7 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Thu, 15 Dec 2016 14:43:02 +0400 Subject: [PATCH 19/22] update --- PIL/ImageDraw.py | 6 ++++-- PIL/features.py | 1 - Tests/test_imagefontctl.py | 11 ++++++----- _imagingft.c | 16 ++++++++-------- docs/installation.rst | 22 ++++++++++++++++++---- docs/reference/ImageDraw.rst | 6 ++++-- docs/reference/ImageFont.rst | 3 ++- 7 files changed, 42 insertions(+), 23 deletions(-) diff --git a/PIL/ImageDraw.py b/PIL/ImageDraw.py index cb2b87905..de3dfdcd6 100644 --- a/PIL/ImageDraw.py +++ b/PIL/ImageDraw.py @@ -217,9 +217,11 @@ class ImageDraw(object): return text.split(split_character) - def text(self, xy, text, fill=None, font=None, anchor=None, *args, **kwargs): + def text(self, xy, text, fill=None, font=None, anchor=None, + *args, **kwargs): if self._multiline_check(text): - return self.multiline_text(xy, text, fill, font, anchor, *args, **kwargs) + return self.multiline_text(xy, text, fill, font, anchor, + *args, **kwargs) ink, fill = self._getink(fill) if font is None: font = self.getfont() diff --git a/PIL/features.py b/PIL/features.py index 8a70080ca..134d85abf 100644 --- a/PIL/features.py +++ b/PIL/features.py @@ -5,7 +5,6 @@ modules = { "tkinter": "PIL._imagingtk", "freetype2": "PIL._imagingft", "littlecms2": "PIL._imagingcms", - "raqm": "PIL._imagingft", "webp": "PIL._webp", "transp_webp": ("WEBP", "WebPDecoderBuggyAlpha") } diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 2a6463159..32999b169 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -1,22 +1,23 @@ # -*- coding: utf-8 -*- from helper import unittest, PillowTestCase from PIL import Image -from PIL import ImageDraw +from PIL import ImageDraw, ImageFont + +#check if raqm installed +have_raqm = ImageFont.core.have_raqm FONT_SIZE = 20 FONT_PATH = "Tests/fonts/DejaVuSans.ttf" try: from PIL import ImageFont - - # check if raqm is available + ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) draw.text((0, 0), 'TEST', font=ttf, fill=500, direction='ltr') - + @unittest.skipIf(not have_raqm, "Raqm Library is not installed !") class TestImagecomplextext(PillowTestCase): - def test_complex_text(self): ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) diff --git a/_imagingft.c b/_imagingft.c index d1bbe5822..2725f3022 100644 --- a/_imagingft.c +++ b/_imagingft.c @@ -43,14 +43,6 @@ #define FT_ERROR_END_LIST { 0, 0 } }; #ifdef HAVE_RAQM #include -#else -typedef enum -{ - RAQM_DIRECTION_DEFAULT, - RAQM_DIRECTION_RTL, - RAQM_DIRECTION_LTR, - RAQM_DIRECTION_TTB -} raqm_direction_t; #endif typedef struct @@ -830,6 +822,14 @@ setup_module(PyObject* m) { #endif PyDict_SetItemString(d, "freetype2_version", v); + +#ifdef HAVE_RAQM + v = PyBool_FromLong(1); +#else + v = PyBool_FromLong(0); +#endif + PyDict_SetItemString(d, "have_raqm", v); + return 0; } diff --git a/docs/installation.rst b/docs/installation.rst index 9de91ea7d..263cb4e70 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -171,6 +171,9 @@ Many of Pillow's features require external libraries: so it is unlikely to work with any Python prior to 3.5 on Windows. * **libraqm** provides complex text layout support. + * libraqm provides bidirectional text support (using FriBiDi), shaping (using HarfBuzz), and proper script itemization. As a result, Raqm can support most writing systems covered by Unicode. + * libraqm depends on the following libraries: FreeType, HarfBuzz, FriBiDi, make sure that install them before install libraqm if not available as package in your system. + * setting text direction or font features is not supported without libraqm. Once you have installed the prerequisites, run:: @@ -203,14 +206,16 @@ Build Options * Build flags: ``--disable-zlib``, ``--disable-jpeg``, ``--disable-tiff``, ``--disable-freetype``, ``--disable-tcl``, ``--disable-tk``, ``--disable-lcms``, ``--disable-webp``, - ``--disable-webpmux``, ``--disable-jpeg2000``, ``--disable-imagequant``. + ``--disable-webpmux``, ``--disable-jpeg2000``, + ``--disable-imagequant``, ``--disable-raqm``. Disable building the corresponding feature even if the development libraries are present on the building machine. * Build flags: ``--enable-zlib``, ``--enable-jpeg``, ``--enable-tiff``, ``--enable-freetype``, ``--enable-tcl``, ``--enable-tk``, ``--enable-lcms``, ``--enable-webp``, - ``--enable-webpmux``, ``--enable-jpeg2000``, ``--enable-imagequant``. + ``--enable-webpmux``, ``--enable-jpeg2000``, + ``--enable-imagequant``, ``--enable-raqm``. Require that the corresponding feature is built. The build will raise an exception if the libraries are not found. Webpmux (WebP metadata) relies on WebP support. Tcl and Tk also must be used together. @@ -248,7 +253,16 @@ The easiest way to install external libraries is via `Homebrew $ brew install libtiff libjpeg webp little-cms2 -Install Pillow with:: +To install libraqm on MaxOS use Homebrew:: + $ brew install freetype harfbuzz fribidi +Once you have `libraqm source code `_ and the dependencies , run the customary sequence of commands in the source code +directory:: + + $ ./configure + $ make + $ make install + +Now install Pillow with:: $ pip install Pillow @@ -278,7 +292,7 @@ Or for Python 3:: Prerequisites are installed on **FreeBSD 10** with:: - $ sudo pkg install jpeg tiff webp lcms2 freetype2 + $ sudo pkg install jpeg tiff webp lcms2 freetype2 harfbuzz fribidi Building on Linux diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 20d76cce0..2a83b9268 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -240,12 +240,13 @@ Methods the number of pixels between lines. :param align: If the text is passed on to multiline_text(), "left", "center" or "right". - :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. + :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. Requires libraqm :param features: A list of font feature to be used during text layout. This is usually used to turn on optional font features that are not enabled by default, for example 'dlig' or 'ss01', but can be also used to turn off default font features for example '-liga' to disable ligatures or '-kern' to disable kerning. To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm + Requires libraqm. .. py:method:: PIL.ImageDraw.Draw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left", direction=None, features=[]) @@ -258,12 +259,13 @@ Methods :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. :param spacing: The number of pixels between lines. :param align: "left", "center" or "right". - :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. + :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. Requires libraqm. :param features: A list of font feature to be used during text layout. This is usually used to turn on optional font features that are not enabled by default, for example 'dlig' or 'ss01', but can be also used to turn off default font features for example '-liga' to disable ligatures or '-kern' to disable kerning. To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm + Requires libraqm. .. py:method:: PIL.ImageDraw.Draw.textsize(text, font=None, spacing=0) diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index 3a0b06732..46df1e4f7 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -63,12 +63,13 @@ Methods driver prefers; if empty, the renderer may return either mode. Note that the mode is always a string, to simplify C-level implementations. - :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. + :param direction: Direction of the text. It can be 'rtl', 'ltr', 'ttb' or 'btt'. Requires libraqm :param features: A list of font feature to be used during text layout. This is usually used to turn on optional font features that are not enabled by default, for example 'dlig' or 'ss01', but can be also used to turn off default font features for example '-liga' to disable ligatures or '-kern' to disable kerning. To get all supported features, see https://www.microsoft.com/typography/otspec/featurelist.htm + Requires libraqm .. versionadded:: 1.1.5 :return: An internal PIL storage memory instance as defined by the From 5891d230d56a1450dc5ae46f62f46809aff0093a Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Thu, 15 Dec 2016 14:55:45 +0400 Subject: [PATCH 20/22] fix build --- PIL/features.py | 1 + 1 file changed, 1 insertion(+) diff --git a/PIL/features.py b/PIL/features.py index 134d85abf..cfa05b473 100644 --- a/PIL/features.py +++ b/PIL/features.py @@ -4,6 +4,7 @@ modules = { "pil": "PIL._imaging", "tkinter": "PIL._imagingtk", "freetype2": "PIL._imagingft", + "raqm": "PIL._imagingft", "littlecms2": "PIL._imagingcms", "webp": "PIL._webp", "transp_webp": ("WEBP", "WebPDecoderBuggyAlpha") From 8739e53d3298ce4ca93750fd2db19a9f31c97081 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Sat, 17 Dec 2016 15:57:22 +0400 Subject: [PATCH 21/22] fix ubuntu build --- depends/ubuntu_14.04.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/depends/ubuntu_14.04.sh b/depends/ubuntu_14.04.sh index 97d142165..997bb09cf 100755 --- a/depends/ubuntu_14.04.sh +++ b/depends/ubuntu_14.04.sh @@ -10,8 +10,7 @@ sudo apt-get -y install python-dev python-setuptools \ python3-dev python-virtualenv cmake sudo apt-get -y install libtiff5-dev libjpeg8-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev \ - python-tk python3-tk libharfbuzz-dev libfribidi-dev + python-tk python3-tk libharfbuzz-dev libfribidi-dev libraqm-dev ./install_openjpeg.sh -./install_imagequant.sh -./install_raqm.sh +./install_imagequant.sh \ No newline at end of file From 8144eb48acb176f223eb6bc756eae0112f36de91 Mon Sep 17 00:00:00 2001 From: Fahad Al-Saidi Date: Mon, 19 Dec 2016 08:40:03 +0400 Subject: [PATCH 22/22] fedora has raqm package --- depends/fedora_23.sh | 4 +--- docs/installation.rst | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/depends/fedora_23.sh b/depends/fedora_23.sh index f9ef9e814..5bdcf7f17 100755 --- a/depends/fedora_23.sh +++ b/depends/fedora_23.sh @@ -15,6 +15,4 @@ sudo dnf install python-devel python3-devel python-virtualenv make gcc sudo dnf install libtiff-devel libjpeg-devel zlib-devel freetype-devel \ lcms2-devel libwebp-devel openjpeg2-devel tkinter python3-tkinter \ - tcl-devel tk-devel harfbuzz-devel fribidi-devel - -./install_raqm.sh \ No newline at end of file + tcl-devel tk-devel harfbuzz-devel fribidi-devel libraqm-devel \ No newline at end of file diff --git a/docs/installation.rst b/docs/installation.rst index 263cb4e70..f58d54735 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -333,7 +333,7 @@ Prerequisites are installed on **Ubuntu 14.04 LTS** with:: Prerequisites are installed on **Fedora 23** with:: $ sudo dnf install libtiff-devel libjpeg-devel zlib-devel freetype-devel \ - lcms2-devel libwebp-devel tcl-devel tk-devel + lcms2-devel libwebp-devel tcl-devel tk-devel libraqm-devel