From 7abe6404d3af04db2f5a503c1c873f80ab86f69e Mon Sep 17 00:00:00 2001 From: Pip Cet Date: Thu, 20 Jun 2019 20:13:12 +0000 Subject: [PATCH] SVG: scale color values properly * src/image.c (svg_load_image): scale color channel values to proper range. --- src/image.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/image.c b/src/image.c index 866323ba6e..6b6235a617 100644 --- a/src/image.c +++ b/src/image.c @@ -9658,17 +9658,20 @@ svg_load_image (struct frame *f, struct image *img, char *contents, { for (int x = 0; x < width; ++x) { - int red = *pixels++; - int green = *pixels++; - int blue = *pixels++; - int opacity = *pixels++; - - red = ((red * opacity) - + (background.red * ((1 << 8) - opacity))); - green = ((green * opacity) - + (background.green * ((1 << 8) - opacity))); - blue = ((blue * opacity) - + (background.blue * ((1 << 8) - opacity))); + unsigned int red = *pixels++; + unsigned int green = *pixels++; + unsigned int blue = *pixels++; + unsigned int opacity = *pixels++; + + /* opacity and the color channel values are in the range {0..255}, + * but expected output values are in the range {0..65535}, so scale + * by (256/255)^2. */ +#define MIX(a, b, opacity) \ + (((((a) * opacity) + ((b) * (255 - opacity))) * 65535 + 32512) / 65025) + red = MIX (red, background.red, opacity); + green = MIX (green, background.red, opacity); + blue = MIX (blue, background.red, opacity); +#undef MIX PUT_PIXEL (ximg, x, y, lookup_rgb_color (f, red, green, blue)); } -- 2.20.1