8000 [css-color-5] Make color-mix() accept 1+ arguments, to match *-mix() … · w3c/csswg-drafts@85cd6d2 · GitHub
[go: up one dir, main page]

Skip to content

Commit 85cd6d2

Browse files
committed
[css-color-5] Make color-mix() accept 1+ arguments, to match *-mix() in general. #11530
1 parent 7034229 commit 85cd6d2

File tree

1 file changed

+51
-36
lines changed

1 file changed

+51
-36
lines changed

css-color-5/Overview.bs

Lines changed: 51 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ Mixing Colors: the ''color-mix()'' Function {#color-mix}
216216

217217

218218
<pre class='prod'>
219-
<dfn>color-mix()</dfn> = color-mix( <<color-interpolation-method>> , [ <<color>> && <<percentage [0,100]>>? ]#{2})
219+
<dfn>color-mix()</dfn> = color-mix( <<color-interpolation-method>> , [ <<color>> && <<percentage [0,100]>>? ]#)
220220
</pre>
221221

222222
<wpt>
@@ -229,24 +229,9 @@ Mixing Colors: the ''color-mix()'' Function {#color-mix}
229229
Percentage Normalization
230230
</h3>
231231

232-
Percentages are required to be in the range 0% to 100%. Negative percentages are specifically disallowed. The percentages are normalized as follows:
233-
234-
1. Let <var>p1</var> be the first percentage and <var>p2</var> the second one.
235-
2. If both percentages are omitted, they each default to 50%
236-
(an equal mix of the two colors).
237-
3. Otherwise, if <var>p2</var> is omitted, it becomes 100% - <var>p1</var>
238-
4. Otherwise, if <var>p1</var> is omitted, it becomes 100% - <var>p2</var>
239-
5. Otherwise, if both are provided and add up to greater than 100%,
240-
they are scaled accordingly so that they add up to 100%.
241-
6. Otherwise, if both are provided and add up to less than 100%,
242-
the sum is saved as an alpha multiplier.
243-
If the sum is greater than zero,
244-
they are then scaled accordingly so that they add up to 100%.
245-
246-
This means that
247-
<var>p1</var> becomes <var>p1</var> / (<var>p1</var> + <var>p2</var>)
248-
and
249-
<var>p2</var> becomes <var>p2</var> / (<var>p1</var> + <var>p2</var>).
232+
Percentages are required to be in the range 0% to 100%.
233+
Negative percentages are specifically disallowed.
234+
Percentages are normalized by [=normalizing mix percentages=].
250235

251236
<wpt>
252237
color-mix-percents-01.html
@@ -282,23 +267,53 @@ Mixing Colors: the ''color-mix()'' Function {#color-mix}
282267
Calculating the Result of color-mix
283268
</h3>
284269

285-
After normalizing both percentages, the result is produced via the following algorithm:
286-
287-
1. If the alpha multiplier is zero, the result is ''transparent'', converted to the specified interpolation <<color-space>>
288-
2. Otherwise, as described in [[css-color-4#interpolation]],
289-
both colors are converted to the specified interpolation <<color-space>>,
290-
taking into account any [=analogous components=].
291-
3. Colors are then interpolated in the specified color space,
292-
as described in [[css-color-4#interpolation]].
293-
If the specified color space is a ''cylindrical-polar-color'' space,
294-
then the <<hue-interpolation-method>> controls the
295-
interpolation of hue, as described in
296-
[[css-color-4#hue-interpolation]].
297-
If no <<hue-interpolation-method>> is specified, it is as if
298-
''shorter'' had been specified.
299-
4. If an alpha multiplier was produced during percentage normalization,
300-
the alpha component of the interpolated result is multiplied
301-
by the alpha multiplier.
270+
<div algorithm>
271+
To <dfn export>calculate a color-mix()</dfn>:
272+
273+
1. [=Normalize mix percentages=] from the list of [=mix items=] passed to the function,
274+
letting |items| and |leftover| be the result.
275+
2. Let |alpha mult| be <code>1 - |leftover|</code>,
276+
interpreting |leftover| as a number between 0 and 1.
277+
3. If |alpha mult| is 0,
278+
return [=transparent black=],
279+
converted to the specified interpolation <<color-space>>.
280+
4. If |items| is length 1,
281+
set |color| to the color of that sole item.
282+
283+
Otherwise:
284+
285+
1. Let |item stack| be a [=/stack=] made by reversing |items|.
286+
(Thus, with the first item at the top of the stack.)
287+
2. While |item stack| has length 2 or greater:
288+
1. [=stack/Pop=] from |item stack| twice,
289+
letting |a| and |b| be the two results in order.
290+
Let |combined percentage| be the sum of |a| and |b|’s percentages.
291+
2. Interpolate |a| and |b|’s colors
292+
as described in [[css-color-4#interpolation]],
293+
with a progress percentage equal to <code>(|b|’s percentage) / |combined percentage|)</code>.
294+
If the specified color space is a [=cylindrical polar color=] space,
295+
then the <<hue-interpolation-method>> controls the
296+
interpolation of hue, as described in
297+
[[css-color-4#hue-interpolation]].
298+
If no <<hue-interpolation-method>> is specified,
299+
assume ''shorter''.
300+
3. Create a new [=mix item=] with the resulting color
301+
and a percentage of |combined percentage|,
302+
and [=stack/push=] it onto |item stack|.
303+
3. Set |color| to the color of the sole remaining item in |item stack|.
304+
5. Multiply the alpha component of |color| by |alpha mult|.
305+
6. Return |color|.
306+
307+
Note: In [=cylindrical polar color=] spaces,
308+
mixing is order-dependent,
309+
as which direction is “shorter” or “longer” around the hue circle
310+
can change depending on what other mixes have already been performed.
311+
This algorithm mixes each color in the specified order,
312+
mixing the result with the next in the list.
313+
For [=rectangular orthogonal color=] spaces,
314+
the order doesn't matter,
315+
and the process can be simplified.
316+
</div>
302317

303318
<wpt>
304319
color-mix-basic-001.html

0 commit comments

Comments
 (0)
0