]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix color-lightening and darkening calculations
authorEli Zaretskii <eliz@gnu.org>
Sat, 2 Nov 2024 16:15:25 +0000 (18:15 +0200)
committerEshel Yaron <me@eshelyaron.com>
Fri, 8 Nov 2024 13:28:48 +0000 (14:28 +0100)
* lisp/color.el (color-lighten-hsl): Fix calculations (bug#74055).

* test/lisp/color-tests.el (color-tests-lighten-hsl)
(color-tests-lighten-name, color-tests-darken-hsl)
(color-tests-darken-name): Adjust test results.

(cherry picked from commit 435d7d4292e6803405c1ea65c73693f20eea2a58)

lisp/color.el
test/lisp/color-tests.el

index 186f1bd9f9a87d5f816e134fce245b91708a69a5..007504043cc1e762bf42ca1cf77457311546b6e1 100644 (file)
@@ -446,7 +446,11 @@ See `color-desaturate-hsl'."
 Given a color defined in terms of hue, saturation, and luminance
 \(arguments H, S, and L), return a color that is PERCENT lighter.
 Returns a list (HUE SATURATION LUMINANCE)."
-  (list H S (color-clamp (+ L (/ percent 100.0)))))
+  (let ((p (/ percent 100.0)))
+    (if (> p 0.0)
+        (setq L (* L (- 1.0 p)))
+      (setq p (- (* L (abs p)))))
+    (list H S (color-clamp (+ L p)))))
 
 (defun color-lighten-name (name percent)
   "Make a color with a specified NAME lighter by PERCENT.
index bc897edc7024c3efcaf92e5ff0a7a48c35658978..63cb024bb8dc0c7871f72e5e7ecb4fa826aa3263 100644 (file)
 
 (ert-deftest color-tests-lighten-hsl ()
   (should (equal (color-lighten-hsl 360 0.5 0.5 0) '(360 0.5 0.5)))
-  (should (equal (color-lighten-hsl 360 0.5 0.5 -10) '(360 0.5 0.4)))
+  (should (equal (color-lighten-hsl 360 0.5 0.5 -10) '(360 0.5 0.45)))
   (should (equal (color-lighten-hsl 360 0.5 0.5 -500) '(360 0.5 0.0)))
-  (should
-   (color-tests--approx-equal
-    (color-lighten-hsl 120 0.5 0.8 5) '(120 0.5 0.85)))
-  (should
-   (equal (color-lighten-hsl 120 0.5 0.8 500) '(120 0.5 1.0))))
+  (should (equal (color-lighten-hsl 120 0.5 0.8 5) '(120 0.5 0.81)))
+  (should (equal (color-lighten-hsl 120 0.5 0.8 500) '(120 0.5 1.0))))
 
 (ert-deftest color-tests-lighten-name ()
   (should (equal (color-lighten-name "black" 100) "#ffffffffffff"))
   (should (equal (color-lighten-name "white" 100) "#ffffffffffff"))
   (should (equal (color-lighten-name "red" 0) "#ffff00000000"))
-  (should (equal (color-lighten-name "red" 10) "#ffff33323332")))
+  (should (equal (color-lighten-name "red" 10) "#ffff19991999")))
 
 (ert-deftest color-tests-darken-hsl ()
   (should (equal (color-darken-hsl 360 0.5 0.5 0) '(360 0.5 0.5)))
-  (should (equal (color-darken-hsl 360 0.5 0.5 -10) '(360 0.5 0.6)))
+  (should (equal (color-darken-hsl 360 0.5 0.5 -10) '(360 0.5 0.55)))
   (should (equal (color-darken-hsl 360 0.5 0.5 -500) '(360 0.5 1.0)))
-  (should (equal (color-darken-hsl 120 0.5 0.8 5) '(120 0.5 0.75)))
+  (should (equal (color-darken-hsl 120 0.5 0.8 5) '(120 0.5 0.76)))
   (should (equal (color-darken-hsl 120 0.5 0.8 500) '(120 0.5 0.0))))
 
 (ert-deftest color-tests-darken-name ()
   (should (equal (color-darken-name "black" 100) "#000000000000"))
   (should (equal (color-darken-name "white" 100) "#000000000000"))
   (should (equal (color-darken-name "red" 0) "#ffff00000000"))
-  (should (equal (color-darken-name "red" 10) "#cccc00000000")))
+  (should (equal (color-darken-name "red" 10) "#e66500000000")))
 
 (ert-deftest color-tests-oklab-to-xyz ()
   (should (color-tests--approx-equal (color-oklab-to-xyz 0 0 0) '(0.0 0.0 0.0)))