- From: Sam Weinig via GitHub <sysbot+gh@w3.org>
- Date: Mon, 31 Jan 2022 00:43:28 +0000
- To: public-css-archive@w3.org
weinig has just created a new issue for https://github.com/w3c/csswg-drafts:
== [css-color-4] CSS gamut mapping algorithm pseudocode can result in infinite looping for some inputs ==
The CSS gamut mapping algorithm [pseudocode](https://drafts.csswg.org/css-color/#binsearch) can result in infinite looping for some inputs. As an example, gamut mapping the color `oklch(104.4% 0 336)` to `display-p3` loops indefinitely due to the following steps:
```
gamut map oklch(104.4% 0 336) to display-p3:
origin_OKLCH -> oklch(104.4% 0 336)
inGamut<display-p3>(origin_OKLCH) -> false
min -> 0
max -> 0
start bisection loop:
chroma -> 0
current -> oklch(104.4% 0 336)
inGamut<display-p3>(current) -> false
current as display-p3 -> color(display-p3 1.058 1.058 1.058)
clipped -> (display-p3 1 1 1)
E -> delta(clipped, current)
-> clipped as oklab(100% 0 5.96E-8)
-> current as oklab(104.4% 0 0)
-> sqrt(((100 / 100) - (104.4 / 100))^2 + (0 - 0)^2 + (5.96E-8 - 0)^2)
-> 0.04
0.04 is not less than JND of 0.02, so we loop forever
```
I added a condition to step 9.4.3 to also check if chroma was 0, making it something like:
```
3. if E < JND or chroma is 0 convert clipped to destination and return it as the gamut mapped color
```
(though, it isn't really necessary to say "convert clipped to destination" since clipped is already in the destination color space by the definition of clip() in step 6.)
I haven't thought too deeply about whether there are any other cases that could infinite loop.
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/6999 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Monday, 31 January 2022 00:43:29 UTC