From 54b01f55f80ba0b8233fb0ecae54dd3118ac0051 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Aug 2022 12:14:54 +1000 Subject: [PATCH 1/2] Round box position to integer when pasting embedded color --- .../standard_embedded_multiline_centered.png | Bin 0 -> 2951 bytes Tests/test_imagefont.py | 15 +++++++++++++++ src/PIL/ImageDraw.py | 1 + 3 files changed, 16 insertions(+) create mode 100644 Tests/images/standard_embedded_multiline_centered.png diff --git a/Tests/images/standard_embedded_multiline_centered.png b/Tests/images/standard_embedded_multiline_centered.png new file mode 100644 index 0000000000000000000000000000000000000000..3aebe37790d7d53c29743f3e05b1f319aea817ef GIT binary patch literal 2951 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 24) & 0xFF) + coord = tuple(int(c) for c in coord) coord2 = coord[0] + mask.size[0], coord[1] + mask.size[1] self.im.paste(color, coord + coord2, mask) else: From 18bd77bbc041a5a6393503db9b0930c971c03c65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ondrej=20Baranovi=C4=8D?= Date: Thu, 25 Aug 2022 11:45:33 +0200 Subject: [PATCH 2/2] simplify code, make test more generic --- .../standard_embedded_multiline_centered.png | Bin 2951 -> 0 bytes Tests/images/text_float_coord.png | Bin 0 -> 2877 bytes Tests/images/text_float_coord_1_alt.png | Bin 0 -> 807 bytes Tests/test_imagefont.py | 29 +++++++++++------- src/PIL/ImageDraw.py | 5 ++- 5 files changed, 20 insertions(+), 14 deletions(-) delete mode 100644 Tests/images/standard_embedded_multiline_centered.png create mode 100644 Tests/images/text_float_coord.png create mode 100644 Tests/images/text_float_coord_1_alt.png diff --git a/Tests/images/standard_embedded_multiline_centered.png b/Tests/images/standard_embedded_multiline_centered.png deleted file mode 100644 index 3aebe37790d7d53c29743f3e05b1f319aea817ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2951 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 literal 0 HcmV?d00001 diff --git a/Tests/images/text_float_coord_1_alt.png b/Tests/images/text_float_coord_1_alt.png new file mode 100644 index 0000000000000000000000000000000000000000..50bdac3d8f39aa492bf41ba3e49c787031d07628 GIT binary patch literal 807 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!9XObPq<-Ap?Ft=`Ln`LHy?wjzwSq`% zqUB_<*ye06UcI17g+vMN4{kAHC;pp1KY83O$D5mDQvUCK`3xoduE;Xj$ttoO;ZRg? z<6ty&;^+``a_A9YN@@`hP;P0Ez$SJ76<e?Tv6Qf;qK0-UYqm(hEAJy z-*x(%jm!J&mN4%UNb~#oD%#q3df3jB_jYed{(bmcSJ2Y0?;A8)em>{_^Y^T1@eIwg z|F5eoom#dyH1i*CV)I4UPaCuqH@no^Rq@a5>YcgaK}O=guTS62c<#*|FEVY~uUnsY zO`CSAAv@Sayxfo5+V?-U+PCHM^L5#ow^Vm6HL2H} zx9!8`#jB6#r^v)V3n@we|D`&rc9r69p0YQ3T7|f@+@fS)hnWP|6i8n7%Mj9?Qmrz hB6Z> 24) & 0xFF) - coord = tuple(int(c) for c in coord) - coord2 = coord[0] + mask.size[0], coord[1] + mask.size[1] - self.im.paste(color, coord + coord2, mask) + x, y = (int(c) for c in coord) + self.im.paste(color, (x, y, x + mask.size[0], y + mask.size[1]), mask) else: self.draw.draw_bitmap(coord, mask, ink)