Re: [csswg-drafts] [css-color-4] Missing info about Premultiplication and Undefined values (#7536)

I started working on examples and (once you consider nonsense examples, because `none` can occur anywhere) find I have an order of operations problem. Here is a dumb example:

```css
--start: color(prophoto-rgb 0.3 none 0.7 /0.5);
--end: lab(100% 0 0 / none);
.foo {
  background: linear-gradient(in oklab to right, var(--start) var(--end));
}
```

Selected quotes from the spec:

> For handling of [missing component](https://drafts.csswg.org/css-color-4/#missing-color-component) in color interpolation, see [§ 12.2 Interpolating with Missing Components](https://drafts.csswg.org/css-color-4/#interpolation-missing)

and

>For all other purposes, a [missing component](https://drafts.csswg.org/css-color-4/#missing-color-component) behaves as a zero value, in the appropriate unit for that component: 0, 0%, or 0deg. This includes rendering the color directly, converting it to another color space, performing computations on the color component values, etc.

(both from [4.4 “Missing” Color Components and the `none` Keyword](https://drafts.csswg.org/css-color-4/#missing)

> Interpolation between [<color>](https://drafts.csswg.org/css-color-4/#typedef-color) values occurs by first converting them to a given color space which will be referred to as the 'interpolation space' below, and then linearly interpolating each component of the computed value of the color separately.

from [12. Color Interpolation](https://drafts.csswg.org/css-color-4/#interpolation)

and lastly

> If a color with a [missing component](https://drafts.csswg.org/css-color-4/#missing-color-component) is interpolated with another color which is not missing that component, the missing component is treated as having the other color’s component value.

from [12.2. Interpolating with Missing Components](https://drafts.csswg.org/css-color-4/#interpolation-missing)

So on the one hand, `--end` needs to get the alpha value from `--start`, 0.5, which is easy as they both have an alpha component in their source forms; but also, `--start` needs to get the green value from `--end` which is problematic because  Lab doesn't have a green component.

And this filling in of missing components must necessarily happen **before** converting them to the interpolation color space, because color space conversion changes missing values to 0.

What I think is reasonable, then is that there is no green component to copy from; and thus `--start` is unchanged; and when converted to OKLab the missing component will become zero.

```css
--start: color(prophoto-rgb 0.3 0 0.7 /0.5);
--end: lab(100% 0 0 / 0.5);
```

which is 

```css
oklab(38.63% 0.076 -0.27 / 0.5)
oklab(100% 0 0 / 0.5)
```

and interpolation proceeds as normal (both colors are premultiplied, components are interpolated, results are un-premultiplied).


-- 
GitHub Notification of comment by svgeesus
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/7536#issuecomment-1200153945 using your GitHub account


-- 
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config

Received on Saturday, 30 July 2022 13:04:12 UTC