diff --git a/Tests/images/text_mono.gif b/Tests/images/text_mono.gif new file mode 100644 index 000000000..b350c10e6 Binary files /dev/null and b/Tests/images/text_mono.gif differ diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index b62fc2e23..5ceb72c99 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -11,6 +11,7 @@ from PIL import Image, ImageDraw, ImageFont from .helper import ( assert_image_equal, + assert_image_equal_tofile, assert_image_similar, assert_image_similar_tofile, is_pypy, @@ -736,3 +737,19 @@ class TestImageFont: @skip_unless_feature("raqm") class TestImageFont_RaqmLayout(TestImageFont): LAYOUT_ENGINE = ImageFont.LAYOUT_RAQM + + +def test_render_mono_size(): + # issue 4177 + + if distutils.version.StrictVersion(ImageFont.core.freetype2_version) < "2.4": + pytest.skip("Different metrics") + + im = Image.new("P", (100, 30), "white") + draw = ImageDraw.Draw(im) + ttf = ImageFont.truetype( + "Tests/fonts/DejaVuSans.ttf", 18, layout_engine=ImageFont.LAYOUT_BASIC + ) + + draw.text((10, 10), "r" * 10, "black", ttf) + assert_image_equal_tofile(im, "Tests/images/text_mono.gif") diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index 79c161713..617a7e5a7 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -259,7 +259,7 @@ class FreeTypeFont: :return: (width, height) """ - size, offset = self.font.getsize(text, direction, features, language) + size, offset = self.font.getsize(text, False, direction, features, language) return ( size[0] + stroke_width * 2 + offset[0], size[1] + stroke_width * 2 + offset[1], @@ -468,7 +468,9 @@ class FreeTypeFont: :py:mod:`PIL.Image.core` interface module, and the text offset, the gap between the starting coordinate and the first marking """ - size, offset = self.font.getsize(text, direction, features, language) + size, offset = self.font.getsize( + text, mode == "1", direction, features, language + ) size = size[0] + stroke_width * 2, size[1] + stroke_width * 2 im = fill("L", size, 0) self.font.render( diff --git a/src/_imagingft.c b/src/_imagingft.c index e0ff7521c..bf53e929e 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -609,6 +609,8 @@ font_getsize(FontObject* self, PyObject* args) FT_Face face; int xoffset, yoffset; int horizontal_dir; + int mask = 0; + int load_flags; const char *dir = NULL; const char *lang = NULL; size_t i, count; @@ -618,11 +620,11 @@ font_getsize(FontObject* self, PyObject* args) /* calculate size and bearing for a given string */ PyObject* string; - if (!PyArg_ParseTuple(args, "O|zOz:getsize", &string, &dir, &features, &lang)) { + if (!PyArg_ParseTuple(args, "O|izOz:getsize", &string, &mask, &dir, &features, &lang)) { return NULL; } - count = text_layout(string, self, dir, features, lang, &glyph_info, 0); + count = text_layout(string, self, dir, features, lang, &glyph_info, mask); if (PyErr_Occurred()) { return NULL; } @@ -641,7 +643,11 @@ font_getsize(FontObject* self, PyObject* args) /* 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); + load_flags = FT_LOAD_NO_BITMAP; + if (mask) { + load_flags |= FT_LOAD_TARGET_MONO; + } + error = FT_Load_Glyph(face, index, load_flags); if (error) { return geterror(error); }