Issue #3003 - Add CSS lch() color parsing support

This commit is contained in:
Basilisk-Dev 2026-04-02 16:43:54 -04:00 • committed by EAZYBLACK
commit b0d43e27e9
4 changed files with 121 additions and 11 deletions

View file

@ -1237,6 +1237,7 @@ protected:
ComponentType& aA);
bool ParseHSLColor(float& aHue, float& aSaturation, float& aLightness,
float& aOpacity);
bool ParseLCHColor(nscolor& aColor);
bool ParseOKLabColor(nscolor& aColor);
bool ParseOKLCHColor(nscolor& aColor);
bool ParseOKLabComponent(float& aComponent, float aPercentScale,
@ -7623,6 +7624,14 @@ CSSParserImpl::ParseColor(nsCSSValue& aValue)
SkipUntil(')');
return CSSParseResult::Error;
}
else if (mToken.mIdent.LowerCaseEqualsLiteral("lch")) {
if (ParseLCHColor(rgba)) {
aValue.SetColorValue(rgba);
return CSSParseResult::Ok;
}
SkipUntil(')');
return CSSParseResult::Error;
}
else if (mToken.mIdent.LowerCaseEqualsLiteral("oklab")) {
if (ParseOKLabColor(rgba)) {
aValue.SetColorValue(rgba);
@ -7868,6 +7877,22 @@ CSSParserImpl::ParseOKLabComponent(float& aComponent, float aPercentScale,
return true;
}
bool
CSSParserImpl::ParseLCHColor(nscolor& aColor)
{
float l, chroma, hue, alpha;
if (!ParseOKLabComponent(l, kLabLightnessMax, Nothing()) ||
!ParseOKLabComponent(chroma, kLchPercentScaleC, Nothing()) ||
!ParseHue(hue) ||
!ParseColorOpacityAndCloseParen(alpha, '/')) {
return false;
}
aColor = LchToSRGBColor(l, chroma, hue, alpha);
return true;
}
bool
CSSParserImpl::ParseOKLabColor(nscolor& aColor)
{
@ -8862,6 +8887,7 @@ CSSParserImpl::ParseVariant(nsCSSValue& aValue,
tk->mIdent.LowerCaseEqualsLiteral("hsl") ||
tk->mIdent.LowerCaseEqualsLiteral("rgba") ||
tk->mIdent.LowerCaseEqualsLiteral("hsla") ||
tk->mIdent.LowerCaseEqualsLiteral("lch") ||
tk->mIdent.LowerCaseEqualsLiteral("oklab") ||
tk->mIdent.LowerCaseEqualsLiteral("oklch") ||
tk->mIdent.LowerCaseEqualsLiteral("color-mix"))))
@ -11117,7 +11143,8 @@ CSSParserImpl::ParseGradientInterpolationMethod()
mToken.mIdent.LowerCaseEqualsLiteral("oklab")) {
isPolarColorSpace = false;
} else if (mToken.mIdent.LowerCaseEqualsLiteral("hsl") ||
mToken.mIdent.LowerCaseEqualsLiteral("oklch")) {
mToken.mIdent.LowerCaseEqualsLiteral("oklch") ||
mToken.mIdent.LowerCaseEqualsLiteral("lch")) {
isPolarColorSpace = true;
} else {
return CSSParseResult::Error;