aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Pillow/py3/_imagingft.c
diff options
context:
space:
mode:
authorkickbutt <kickbutt@yandex-team.com>2024-01-23 23:36:43 +0300
committerAlexander Smirnov <alex@ydb.tech>2024-01-24 15:02:13 +0300
commit299dc21a6f70a16b00e1d564fa56961331552415 (patch)
tree183f498a2e98a04f9a6143a11006ba0c10f867f3 /contrib/python/Pillow/py3/_imagingft.c
parent5ccb6ae864be6b53df427dc3a0fa14dbb95aa11c (diff)
downloadydb-299dc21a6f70a16b00e1d564fa56961331552415.tar.gz
Fix separator in CUDA_ARCHITECTURES
Diffstat (limited to 'contrib/python/Pillow/py3/_imagingft.c')
-rw-r--r--contrib/python/Pillow/py3/_imagingft.c65
1 files changed, 44 insertions, 21 deletions
diff --git a/contrib/python/Pillow/py3/_imagingft.c b/contrib/python/Pillow/py3/_imagingft.c
index 069e7cd147..19a2d6fb9b 100644
--- a/contrib/python/Pillow/py3/_imagingft.c
+++ b/contrib/python/Pillow/py3/_imagingft.c
@@ -877,7 +877,7 @@ font_render(FontObject *self, PyObject *args) {
width += stroke_width * 2 + ceil(x_start);
height += stroke_width * 2 + ceil(y_start);
- image = PyObject_CallFunction(fill, "s(ii)", strcmp(mode, "RGBA") == 0 ? "RGBA" : "L", width, height);
+ image = PyObject_CallFunction(fill, "ii", width, height);
if (image == Py_None) {
PyMem_Del(glyph_info);
return Py_BuildValue("ii", 0, 0);
@@ -885,7 +885,9 @@ font_render(FontObject *self, PyObject *args) {
PyMem_Del(glyph_info);
return NULL;
}
- id = PyLong_AsSsize_t(PyObject_GetAttrString(image, "id"));
+ PyObject *imageId = PyObject_GetAttrString(image, "id");
+ id = PyLong_AsSsize_t(imageId);
+ Py_XDECREF(imageId);
im = (Imaging)id;
x_offset -= stroke_width;
@@ -1047,8 +1049,8 @@ font_render(FontObject *self, PyObject *args) {
if (yy >= 0 && yy < im->ysize) {
/* blend this glyph into the buffer */
int k;
- unsigned char v;
unsigned char *target;
+ unsigned int tmp;
if (color) {
/* target[RGB] returns the color, target[A] returns the mask */
/* target bands get split again in ImageDraw.text */
@@ -1059,34 +1061,55 @@ font_render(FontObject *self, PyObject *args) {
if (color && bitmap.pixel_mode == FT_PIXEL_MODE_BGRA) {
/* paste color glyph */
for (k = x0; k < x1; k++) {
- if (target[k * 4 + 3] < source[k * 4 + 3]) {
- /* unpremultiply BGRa to RGBA */
- target[k * 4 + 0] = CLIP8(
- (255 * (int)source[k * 4 + 2]) / source[k * 4 + 3]);
- target[k * 4 + 1] = CLIP8(
- (255 * (int)source[k * 4 + 1]) / source[k * 4 + 3]);
- target[k * 4 + 2] = CLIP8(
- (255 * (int)source[k * 4 + 0]) / source[k * 4 + 3]);
- target[k * 4 + 3] = source[k * 4 + 3];
+ unsigned int src_alpha = source[k * 4 + 3];
+
+ /* paste only if source has data */
+ if (src_alpha > 0) {
+ /* unpremultiply BGRa */
+ int src_red = CLIP8((255 * (int)source[k * 4 + 2]) / src_alpha);
+ int src_green = CLIP8((255 * (int)source[k * 4 + 1]) / src_alpha);
+ int src_blue = CLIP8((255 * (int)source[k * 4 + 0]) / src_alpha);
+
+ /* blend required if target has data */
+ if (target[k * 4 + 3] > 0) {
+ /* blend RGBA colors */
+ target[k * 4 + 0] = BLEND(src_alpha, target[k * 4 + 0], src_red, tmp);
+ target[k * 4 + 1] = BLEND(src_alpha, target[k * 4 + 1], src_green, tmp);
+ target[k * 4 + 2] = BLEND(src_alpha, target[k * 4 + 2], src_blue, tmp);
+ target[k * 4 + 3] = CLIP8(src_alpha + MULDIV255(target[k * 4 + 3], (255 - src_alpha), tmp));
+ } else {
+ /* paste unpremultiplied RGBA values */
+ target[k * 4 + 0] = src_red;
+ target[k * 4 + 1] = src_green;
+ target[k * 4 + 2] = src_blue;
+ target[k * 4 + 3] = src_alpha;
+ }
}
}
} else if (bitmap.pixel_mode == FT_PIXEL_MODE_GRAY) {
if (color) {
unsigned char *ink = (unsigned char *)&foreground_ink;
for (k = x0; k < x1; k++) {
- v = source[k] * convert_scale;
- if (target[k * 4 + 3] < v) {
- target[k * 4 + 0] = ink[0];
- target[k * 4 + 1] = ink[1];
- target[k * 4 + 2] = ink[2];
- target[k * 4 + 3] = v;
+ unsigned int src_alpha = source[k] * convert_scale;
+ if (src_alpha > 0) {
+ if (target[k * 4 + 3] > 0) {
+ target[k * 4 + 0] = BLEND(src_alpha, target[k * 4 + 0], ink[0], tmp);
+ target[k * 4 + 1] = BLEND(src_alpha, target[k * 4 + 1], ink[1], tmp);
+ target[k * 4 + 2] = BLEND(src_alpha, target[k * 4 + 2], ink[2], tmp);
+ target[k * 4 + 3] = CLIP8(src_alpha + MULDIV255(target[k * 4 + 3], (255 - src_alpha), tmp));
+ } else {
+ target[k * 4 + 0] = ink[0];
+ target[k * 4 + 1] = ink[1];
+ target[k * 4 + 2] = ink[2];
+ target[k * 4 + 3] = src_alpha;
+ }
}
}
} else {
for (k = x0; k < x1; k++) {
- v = source[k] * convert_scale;
- if (target[k] < v) {
- target[k] = v;
+ unsigned int src_alpha = source[k] * convert_scale;
+ if (src_alpha > 0) {
+ target[k] = target[k] > 0 ? CLIP8(src_alpha + MULDIV255(target[k], (255 - src_alpha), tmp)) : src_alpha;
}
}
}