From b9fea97b12f18beda704b4a9ba0fa768ede65c41 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 16 Feb 2020 20:40:23 +1100 Subject: [PATCH] Fixed stroke on FreeType < 2.9 --- Tests/images/imagedraw_stroke_descender.png | Bin 0 -> 2196 bytes Tests/test_imagedraw.py | 16 ++++++++++++++++ src/_imagingft.c | 9 +++++---- 3 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 Tests/images/imagedraw_stroke_descender.png diff --git a/Tests/images/imagedraw_stroke_descender.png b/Tests/images/imagedraw_stroke_descender.png new file mode 100644 index 0000000000000000000000000000000000000000..93462334ae4e8b35519d1ee17c517723a5c7443d GIT binary patch literal 2196 zcmb7`dpOgJAII6S&1P0QCPrV5TU198GIz>tG=@aw5+!j`k&!UlqH<80Lmb!4CFFi9 zv%cvb3Bf&VEX|zBncp(QL!7ztohI4{gbmNa+|3tuK6XeZ|LNPjGIBsk z`>#)DdH(H62g+uhi*W9<>Q>L3f~k4BE>68lL}|p)oRjZ}C!Ns1D>n?CrsCbr>i@ZE zwLcC|(9sURG5MMwHLyM3-@LxHwf*VtWP0Nw3n}}@nfzgYo&Vbut(5y>4Aq77tXJGm z;V6MJ(naM`3NaV-Maw@uXv!7(?j>d^>lO=OL~rQ5YB2UVIWgN(4t-Zo2*cN$U@0(< zBWZ2brI}#*u?G2m-H;<&DcxOSloiZe;lf!n|FHDZ;>?Bny<>(Jc>NJNgJf-pgtX`s zD1WMuqMek2hA_t8#2W$03xx}+nA8CjF>F;C)1{rS)DM1HkGG7OfeH&w(Q;u%Dw;jzqdtszfG&2SOghEkQbI^p}GLi3`SYMB_tJbsxJ zwjX}e?@0E-lu?t`gRdxqU#RR5lC2NAY&v@qVN^MUZ=Tt^yo^h?WTSWpxvy4$mg8o}m3eTmRK-kZH3gVpSvW>+!2qI25P^t7+^1%wiHoN^?HhIQ z*Qu>U8U*Fa(AKRqZ%uVWDUJ67=(uPYzjBW1BWMH?x?O5^LgnBGEIce~%@e(+nV~9$ zuhIhr`udXKt9lLdsk@RQpAJ6X|F#s$AI3J@8~qT16SS@Ubm94TG&CA7n@&S&w5?U1 z+lc86yJQL$dO6v0-U1nYD7aSnur2KZhFmp!ibvNoOKarlkaopsHIaTh>sC~@ivQGy ze}Y;u!TT<@V@D6yl2_Euq#4LMP?J;22|L?ird}+w!@T=kfZ$oq0cUkUj<%WgSXtle z+s^ra;bjiA1j&dT%PToGHbNv>y}<&3xI)6+Ei{Jwo`?GiPMM~yJGi$9dXbi`gf3HvVOY`W+ros z7#`2ae&;_&CY`82Kywni+!NOw1DdZW!84aSIs1Z9G?x@c@xp{SWbj!U&E8EIq((36 zt|n8Xo*6)C6szJ#OMTUvzlhl8R)-^a^eCd8@6qhl>y+ZZf<Pty}ET3H5NgbNM9pE0`v2bwM|LS}lnXcTNdq3VF5&dI?gXST@?_YY@cXeaf9{{G8 z+$B*yOYgP4(FO)?$Z0FO351xOcB#3_VaWwI%9E_w<>Ub@RyUp$Wjlk~zf3_`J|m$NjpSAVUN4#-X73Xd}^)nVRY51r;U zUmRJg9yJAe1^(aql`sntcEw*A-^kf#@awe(&UaIU{D8>FltuHi{SeA%S)w*>!|1}Q zyURWNaE9wiB5b=1eFFCxRRGKshGQe%YXZqZp)`K052ho?xg@em&5=ulLCesCfcf2W5d3D-r+;yKVK}K>z{vJ7mj3I>+-X%Ht_7_ zp}{W6jrFibo?=C8w1s9+Yp34hEGQ(dbYN8WJ@rw%!J>rBm70>z9o7GQYw4KT%`YVf zzpYK)@R0%?ACzBVAD@07nXQEu1UJ1t8>o}dXy4~4a;x8Xq(@jW6uUSX@WE&^KSOSC zY3zC^D|Hyg(i!XXtVND)?0zSA(e4EgXKto~W^T+WxBs2=a=#tP2-0%PakSCe-nSuS MbK1eO+}tbnUxghcAOHXW literal 0 HcmV?d00001 diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 9036e184229..f6eabb21a66 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -944,6 +944,22 @@ def test_stroke(): ) +@skip_unless_feature("freetype2") +def test_stroke_descender(): + # Arrange + im = Image.new("RGB", (120, 130)) + draw = ImageDraw.Draw(im) + font = ImageFont.truetype("Tests/fonts/FreeMono.ttf", 120) + + # Act + draw.text((10, 0), "y", "#f00", font, stroke_width=2, stroke_fill="#0f0") + + # Assert + assert_image_similar( + im, Image.open("Tests/images/imagedraw_stroke_descender.png"), 6.76 + ) + + @skip_unless_feature("freetype2") def test_stroke_multiline(): # Arrange diff --git a/src/_imagingft.c b/src/_imagingft.c index 62a4c283e71..c9d489e8ee1 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -782,9 +782,6 @@ font_render(FontObject* self, PyObject* args) im = (Imaging) id; /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 */ load_flags = FT_LOAD_NO_BITMAP; - if (stroker == NULL) { - load_flags |= FT_LOAD_RENDER; - } if (mask) { load_flags |= FT_LOAD_TARGET_MONO; } @@ -792,7 +789,7 @@ font_render(FontObject* self, PyObject* args) ascender = 0; for (i = 0; i < count; i++) { index = glyph_info[i].index; - error = FT_Load_Glyph(self->face, index, load_flags); + error = FT_Load_Glyph(self->face, index, load_flags | FT_LOAD_RENDER); if (error) { return geterror(error); } @@ -806,6 +803,10 @@ font_render(FontObject* self, PyObject* args) ascender = temp; } + if (stroker == NULL) { + load_flags |= FT_LOAD_RENDER; + } + x = y = 0; horizontal_dir = dir && strcmp(dir, "ttb") == 0 ? 0 : 1; for (i = 0; i < count; i++) {