Oops, typo in the patch. Better patch attached. 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..8e25f1f590 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.green, opacity); + blue = MIX (blue, background.blue, opacity); +#undef MIX PUT_PIXEL (ximg, x, y, lookup_rgb_color (f, red, green, blue)); } -- 2.20.1 On Thu, Jun 20, 2019 at 8:43 PM Pip Cet wrote: > > Evaluate the following in emacs -Q: > > (require 'svg) > > (defun make-image (color) > (let ((svg (svg-create 100 100))) > (svg-rectangle svg 0 0 100 100 :fill color) > (svg-image svg))) > > (set-frame-parameter (window-frame) 'background-color "black") > > (insert (propertize " " 'display (make-image "#f00000"))) > > The expected result is a rectangle (on black background) of color > #f00000. The actual result is a rectangle of color #ef0000. For black > backgrounds, white is no longer representable. > > This is related to bug #36304, but much easier to fix. > > Patch attached.