From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Pip Cet Newsgroups: gmane.emacs.bugs Subject: bug#36315: 27.0.50; SVG transparency handling is inaccurate Date: Thu, 20 Jun 2019 20:46:20 +0000 Message-ID: References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="000000000000571a05058bc77246" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="90245"; mail-complaints-to="usenet@blaine.gmane.org" To: 36315@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Jun 20 22:54:28 2019 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1he44g-000NJM-HM for geb-bug-gnu-emacs@m.gmane.org; Thu, 20 Jun 2019 22:54:26 +0200 Original-Received: from localhost ([::1]:53060 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1he44f-0005kG-Dh for geb-bug-gnu-emacs@m.gmane.org; Thu, 20 Jun 2019 16:54:25 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:46744) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1he3yY-0001D6-Hf for bug-gnu-emacs@gnu.org; Thu, 20 Jun 2019 16:48:10 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1he3yV-0005J0-0i for bug-gnu-emacs@gnu.org; Thu, 20 Jun 2019 16:48:05 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:35799) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1he3yT-0005IX-VT for bug-gnu-emacs@gnu.org; Thu, 20 Jun 2019 16:48:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1he3yT-0007lM-Nm for bug-gnu-emacs@gnu.org; Thu, 20 Jun 2019 16:48:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Pip Cet Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 20 Jun 2019 20:48:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 36315 X-GNU-PR-Package: emacs Original-Received: via spool by 36315-submit@debbugs.gnu.org id=B36315.156106362529757 (code B ref 36315); Thu, 20 Jun 2019 20:48:01 +0000 Original-Received: (at 36315) by debbugs.gnu.org; 20 Jun 2019 20:47:05 +0000 Original-Received: from localhost ([127.0.0.1]:49342 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1he3xZ-0007jt-G3 for submit@debbugs.gnu.org; Thu, 20 Jun 2019 16:47:05 -0400 Original-Received: from mail-oi1-f194.google.com ([209.85.167.194]:46359) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1he3xW-0007jM-Ks for 36315@debbugs.gnu.org; Thu, 20 Jun 2019 16:47:03 -0400 Original-Received: by mail-oi1-f194.google.com with SMTP id 65so3117032oid.13 for <36315@debbugs.gnu.org>; Thu, 20 Jun 2019 13:47:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=RhsQGfXJPLg7eLX7PIR+Y4G0Atw22+17mbqvuffS0+w=; b=u5Wivot04GH7d7TDRnt3b/ROmtg2kHQ+qhjmJsvOVvMs+Rxt5wTlwjBCP2UbKkbklH Sl6Q2oy3IhIcEwTrRQlgHKtkUU8PGvePTTNyrW2k4roKZu3WgI1WMQLuer47I+mac5Tp j9Pi6av3VMWLto62aXWYqGDHM6dXxZqMO4L0EXyUy3NY2WMMU7VKHQo7iJaGRP7kFPWr pJPum514rGSDT2hyWLgnkbQpd7egfJj9GkzI74Yklu0niqKSKiTIUq8phAlhRDnpFJ7l evCXPO8T4ap6lBJduHL6DduHm7M4v8rZQFQ2yNzoaRpcZ6VC5Kiel6b2uxUCOYn95sGS /Yfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=RhsQGfXJPLg7eLX7PIR+Y4G0Atw22+17mbqvuffS0+w=; b=LTu+5nal7UKuAuQY7syB4L0u3pAlQLf8ETeF7cbOqBG3Wn6Hsq/qN1wMyNbC23buST wyVcKZqUZMsNWRMYV4ONqE5UMrkInHwkZfyi6sLRC2moLN37KkiNPMp6wSXreG5QrPrV 7n92DXN6CjItQRa2Fu6oa3jbsqUIdaH7gUAeoRnNquy5g3Pe+crNDN6PwHtD9MXqMyt0 8n+R45F2Qv8xR/7gev+uvLsLUIvy9TDCIFWxyddNPH7t1CnZ6KnAWMjqmye8WrxGXuKH fk2EebB+qkvByyKptmKNWUBI/A6pc6pszMK3ujj/+2XfknBo1A2NM/HmbhPM7CN6UzyK BG+w== X-Gm-Message-State: APjAAAX8Ho8SlskNbgNvu/8UEL8eZ4+sTELRQ+QFw1LNjV9xR7wtFKTE mbVXv1r4HJlRgazYxkf0CGwJyvZs6czVlHyt7yM83a4UMNU= X-Google-Smtp-Source: APXvYqyPoPCqOtswg3cF9c4MUkg5CXcOOYVo/NhdnXLroRG1mUPIo2vpKBtrv3IEYzkspsyIZbrJIUjKT+lv0zs58Xw= X-Received: by 2002:aca:4790:: with SMTP id u138mr614542oia.44.1561063616608; Thu, 20 Jun 2019 13:46:56 -0700 (PDT) In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.51.188.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:160916 Archived-At: --000000000000571a05058bc77246 Content-Type: text/plain; charset="UTF-8" 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. --000000000000571a05058bc77246 Content-Type: application/x-patch; name="0001-SVG-scale-color-values-properly.patch" Content-Disposition: attachment; filename="0001-SVG-scale-color-values-properly.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_jx54vp5n0 RnJvbSAyZTVhZGUyYjJmNjliNzYwYzc1NGNlMTRjMGFiZDU1YmVkMTc5NjE0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQaXAgQ2V0IDxwaXBjZXRAZ21haWwuY29tPgpEYXRlOiBUaHUs IDIwIEp1biAyMDE5IDIwOjEzOjEyICswMDAwClN1YmplY3Q6IFtQQVRDSF0gU1ZHOiBzY2FsZSBj b2xvciB2YWx1ZXMgcHJvcGVybHkKCiogc3JjL2ltYWdlLmMgKHN2Z19sb2FkX2ltYWdlKTogc2Nh bGUgY29sb3IgY2hhbm5lbCB2YWx1ZXMgdG8gcHJvcGVyCnJhbmdlLgotLS0KIHNyYy9pbWFnZS5j IHwgMjUgKysrKysrKysrKysrKystLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDE0IGluc2Vy dGlvbnMoKyksIDExIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9pbWFnZS5jIGIvc3Jj L2ltYWdlLmMKaW5kZXggODY2MzIzYmE2ZS4uOGUyNWYxZjU5MCAxMDA2NDQKLS0tIGEvc3JjL2lt YWdlLmMKKysrIGIvc3JjL2ltYWdlLmMKQEAgLTk2NTgsMTcgKzk2NTgsMjAgQEAgc3ZnX2xvYWRf aW1hZ2UgKHN0cnVjdCBmcmFtZSAqZiwgc3RydWN0IGltYWdlICppbWcsIGNoYXIgKmNvbnRlbnRz LAogICAgICAgewogCWZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7ICsreCkKIAkgIHsKLQkgICAg aW50IHJlZCAgICAgPSAqcGl4ZWxzKys7Ci0JICAgIGludCBncmVlbiAgID0gKnBpeGVscysrOwot CSAgICBpbnQgYmx1ZSAgICA9ICpwaXhlbHMrKzsKLQkgICAgaW50IG9wYWNpdHkgPSAqcGl4ZWxz Kys7Ci0KLQkgICAgcmVkICAgPSAoKHJlZCAqIG9wYWNpdHkpCi0JCSAgICAgKyAoYmFja2dyb3Vu ZC5yZWQgKiAoKDEgPDwgOCkgLSBvcGFjaXR5KSkpOwotCSAgICBncmVlbiA9ICgoZ3JlZW4gKiBv cGFjaXR5KQotCQkgICAgICsgKGJhY2tncm91bmQuZ3JlZW4gKiAoKDEgPDwgOCkgLSBvcGFjaXR5 KSkpOwotCSAgICBibHVlICA9ICgoYmx1ZSAqIG9wYWNpdHkpCi0JCSAgICAgKyAoYmFja2dyb3Vu ZC5ibHVlICogKCgxIDw8IDgpIC0gb3BhY2l0eSkpKTsKKwkgICAgdW5zaWduZWQgaW50IHJlZCAg ICAgPSAqcGl4ZWxzKys7CisJICAgIHVuc2lnbmVkIGludCBncmVlbiAgID0gKnBpeGVscysrOwor CSAgICB1bnNpZ25lZCBpbnQgYmx1ZSAgICA9ICpwaXhlbHMrKzsKKwkgICAgdW5zaWduZWQgaW50 IG9wYWNpdHkgPSAqcGl4ZWxzKys7CisKKwkgICAgLyogb3BhY2l0eSBhbmQgdGhlIGNvbG9yIGNo YW5uZWwgdmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2UgezAuLjI1NX0sCisJICAgICAqIGJ1dCBleHBl Y3RlZCBvdXRwdXQgdmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2UgezAuLjY1NTM1fSwgc28gc2NhbGUK KwkgICAgICogYnkgKDI1Ni8yNTUpXjIuICovCisjZGVmaW5lIE1JWChhLCBiLCBvcGFjaXR5KQkJ CQkJCVwKKwkgICAgKCgoKChhKSAqIG9wYWNpdHkpICsgKChiKSAqICgyNTUgLSBvcGFjaXR5KSkp ICogNjU1MzUgKyAzMjUxMikgLyA2NTAyNSkKKwkgICAgcmVkICAgPSBNSVggKHJlZCwgYmFja2dy b3VuZC5yZWQsIG9wYWNpdHkpOworCSAgICBncmVlbiA9IE1JWCAoZ3JlZW4sIGJhY2tncm91bmQu Z3JlZW4sIG9wYWNpdHkpOworCSAgICBibHVlICA9IE1JWCAoYmx1ZSwgYmFja2dyb3VuZC5ibHVl LCBvcGFjaXR5KTsKKyN1bmRlZiBNSVgKIAogCSAgICBQVVRfUElYRUwgKHhpbWcsIHgsIHksIGxv b2t1cF9yZ2JfY29sb3IgKGYsIHJlZCwgZ3JlZW4sIGJsdWUpKTsKIAkgIH0KLS0gCjIuMjAuMQoK --000000000000571a05058bc77246--