[webkit-changes] [WebKit/WebKit] 88a073: Add support for using 'currentcolor' with color-mix()

Sam Weinig noreply at github.com
Fri Jan 20 09:35:54 PST 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 88a0736c2c2d79064ae781e6ef99e4e5abbf692f
      https://github.com/WebKit/WebKit/commit/88a0736c2c2d79064ae781e6ef99e4e5abbf692f
  Author: Sam Weinig <weinig at apple.com>
  Date:   2023-01-20 (Fri, 20 Jan 2023)

  Changed paths:
    M LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-color-mix-function-expected.txt
    M LayoutTests/imported/w3c/web-platform-tests/css/css-color/parsing/color-valid-color-mix-function.html
    M Source/WebCore/CMakeLists.txt
    M Source/WebCore/Sources.txt
    M Source/WebCore/WebCore.xcodeproj/project.pbxproj
    M Source/WebCore/css/CSSPrimitiveValue.cpp
    M Source/WebCore/css/CSSPrimitiveValue.h
    M Source/WebCore/css/CSSUnits.cpp
    M Source/WebCore/css/CSSUnits.h
    M Source/WebCore/css/StyleColor.cpp
    M Source/WebCore/css/StyleColor.h
    M Source/WebCore/css/calc/CSSCalcCategoryMapping.cpp
    A Source/WebCore/css/color/CSSResolvedColorMix.cpp
    A Source/WebCore/css/color/CSSResolvedColorMix.h
    A Source/WebCore/css/color/CSSUnresolvedColor.cpp
    A Source/WebCore/css/color/CSSUnresolvedColor.h
    A Source/WebCore/css/color/CSSUnresolvedColorMix.cpp
    M Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp
    M Source/WebCore/platform/graphics/ColorInterpolationMethod.cpp
    M Source/WebCore/platform/graphics/ColorInterpolationMethod.h
    M Source/WebCore/style/ColorFromPrimitiveValue.cpp

  Log Message:
  -----------
  Add support for using 'currentcolor' with color-mix()
https://bugs.webkit.org/show_bug.cgi?id=250459

Reviewed by Darin Adler.

To support 'currentcolor' as the origin color in a color-mix()
value, this change adds a new CSSPrimitiveValue type called
CSSUnresolvedColor as a peer to the existing color value, that
represents, as the name suggests, unresolved color values.

In this change, CSSUnresolvedColor is only used for color-mix(),
but it is implemented in a way so that we can add support for
other unresolved colors like relative colors.

In addition to CSSUnresolvedColor, to fully support 'currentcolor'
StyleColor was updated to add a third kind in addition to Color
and CurrentColor, for color-mix(). This allows for us to do late
evaluation of the color-mix() in the case of a 'currentcolor'
(or even in more interesting cases like an origin which is another
color-mix that itself has 'currentcolor' as the origin).

CSSUnresolvedColor also fixes an issue where we were not preserving
calc() values for the percentages in color-mix() in the specified
value serialization.

* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
Add new files.

* Source/WebCore/css/CSSPrimitiveValue.cpp:
(WebCore::isValidCSSUnitTypeForDoubleConversion):
(WebCore::isStringType):
(WebCore::CSSPrimitiveValue::init):
(WebCore::CSSPrimitiveValue::cleanup):
(WebCore::CSSPrimitiveValue::unitTypeString):
(WebCore::CSSPrimitiveValue::formatNumberForCustomCSSText const):
(WebCore::CSSPrimitiveValue::equals const):
* Source/WebCore/css/CSSPrimitiveValue.h:
(WebCore::isValueID):
* Source/WebCore/css/CSSUnits.cpp:
(WebCore::unitCategory):
(WebCore::operator<<):
* Source/WebCore/css/CSSUnits.h:
* Source/WebCore/css/calc/CSSCalcCategoryMapping.cpp:
(WebCore::hasDoubleValue):
Add new CSS_UNRESOLVED_COLOR kind.

* Source/WebCore/css/StyleColor.cpp:
(WebCore::StyleColor::copy):
(WebCore::StyleColor::resolveColor const):
(WebCore::StyleColor::isCurrentColor const):
(WebCore::StyleColor::isColorMix const):
(WebCore::StyleColor::resolveAbsoluteComponents):
(WebCore::resolveAbsoluteComponents):
(WebCore::resolveColor):
(WebCore::serializationForCSS):
(WebCore::operator<<):
* Source/WebCore/css/StyleColor.h:
(WebCore::StyleColor::StyleColor):
(WebCore::StyleColor::operator=):
(WebCore::StyleColor::currentColor):
(WebCore::operator==):
(WebCore::operator!=):
(WebCore::StyleColor::operator== const):
(WebCore::StyleColor::operator!= const):
(WebCore::CurrentColor::operator== const): Deleted.
(WebCore::CurrentColor::operator!= const): Deleted.
Support a new StyleColorMix kind. Rename CurrentColor to StyleCurrentColor
for consistency.

* Source/WebCore/css/color/CSSResolvedColorMix.cpp: Added.
(WebCore::normalizedMixPercentages):
(WebCore::mixColorComponentsUsingColorInterpolationMethod):
(WebCore::mix):
* Source/WebCore/css/color/CSSResolvedColorMix.h: Added.
CSSResolvedColorMix serves as the implementation of the final
resolved color-mix(), and is used for eager mixing (in the case
of the Raw variant currently used on workers) and in StyleColor
when doing the final resolution.

* Source/WebCore/css/color/CSSUnresolvedColor.cpp: Added.
(WebCore::CSSUnresolvedColor::cssText const):
(WebCore::CSSUnresolvedColor::equals const):
(WebCore::CSSUnresolvedColor::createStyleColor const):
* Source/WebCore/css/color/CSSUnresolvedColor.h: Added.
CSSUnresolvedColor serves a container for unresolved colors
in CSSPrimitiveValue. For now it only supports color-mix(),
but is setup to support other kinds going future.

* Source/WebCore/css/color/CSSUnresolvedColorMix.cpp: Added.
(WebCore::serializationForCSS):
(WebCore::operator==):
(WebCore::operator!=):
(WebCore::createStyleColor):
* Source/WebCore/css/color/CSSUnresolvedColorMix.h: Added.
Value type for unresolved color-mix(), used as the "specified
value" for color-mix() to correctly serialize per-spec and
correctly resolve to a structured StyleColor at style building
time.

* Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp:
(WebCore::CSSPropertyParserHelpers::consumeOriginColorRaw):
(WebCore::CSSPropertyParserHelpers::consumeOptionalAlphaRaw):
(WebCore::CSSPropertyParserHelpers::consumeOptionalAlphaRawAllowingSymbolTableIdent):
(WebCore::CSSPropertyParserHelpers::parseRelativeRGBParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseNonRelativeRGBParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseRGBParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseRelativeHSLParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseNonRelativeHSLParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseHSLParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseHWBParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseRelativeHWBParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseNonRelativeHWBParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseLabParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseRelativeLabParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseNonRelativeLabParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseLCHParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseRelativeLCHParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseNonRelativeLCHParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseColorFunctionForRGBTypesRaw):
(WebCore::CSSPropertyParserHelpers::parseRelativeColorFunctionForRGBTypes):
(WebCore::CSSPropertyParserHelpers::parseColorFunctionForXYZTypesRaw):
(WebCore::CSSPropertyParserHelpers::parseRelativeColorFunctionForXYZTypes):
(WebCore::CSSPropertyParserHelpers::parseRelativeColorFunctionParameters):
(WebCore::CSSPropertyParserHelpers::parseNonRelativeColorFunctionParameters):
(WebCore::CSSPropertyParserHelpers::parseColorFunctionParametersRaw):
(WebCore::CSSPropertyParserHelpers::parseColorContrastFunctionParametersRaw):
(WebCore::CSSPropertyParserHelpers::consumeColorMixComponentRaw):
(WebCore::CSSPropertyParserHelpers::consumeColorMixComponent):
(WebCore::CSSPropertyParserHelpers::parseColorMixFunctionParametersRaw):
(WebCore::CSSPropertyParserHelpers::hasNonCalculatedZeroPercentage):
(WebCore::CSSPropertyParserHelpers::parseColorMixFunctionParameters):
(WebCore::CSSPropertyParserHelpers::parseColorFunctionRaw):
(WebCore::CSSPropertyParserHelpers::parseColorFunction):
(WebCore::CSSPropertyParserHelpers::consumeColorWorkerSafe):
(WebCore::CSSPropertyParserHelpers::consumeColor):
(WebCore::CSSPropertyParserHelpers::consumeOriginColor): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeOptionalAlpha): Deleted.
(WebCore::CSSPropertyParserHelpers::consumeOptionalAlphaAllowingSymbolTableIdent): Deleted.
(WebCore::CSSPropertyParserHelpers::parseRelativeRGBParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseNonRelativeRGBParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseRGBParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseRelativeHSLParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseNonRelativeHSLParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseHSLParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseHWBParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseRelativeHWBParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseNonRelativeHWBParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseLabParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseRelativeLabParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseNonRelativeLabParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseLCHParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseRelativeLCHParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseNonRelativeLCHParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseColorFunctionForRGBTypes): Deleted.
(WebCore::CSSPropertyParserHelpers::parseColorFunctionForXYZTypes): Deleted.
(WebCore::CSSPropertyParserHelpers::parseColorFunctionParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::parseColorContrastFunctionParameters): Deleted.
(WebCore::CSSPropertyParserHelpers::normalizedMixPercentages): Deleted.
(WebCore::CSSPropertyParserHelpers::mixColorComponentsUsingColorInterpolationMethod): Deleted.
(WebCore::CSSPropertyParserHelpers::mixColorComponents): Deleted.
Renames color parsing functions to use the Raw suffix to match convention and
make it clear that the new color-mix parsing function is sufficiently different
in that it is not eagerly resolving.

* Source/WebCore/platform/graphics/ColorInterpolationMethod.cpp:
(WebCore::serializationForCSS):
* Source/WebCore/platform/graphics/ColorInterpolationMethod.h:
Add CSS serialization support and fix HasHueInterpolationMethod to actually
match the right structs.

* Source/WebCore/style/ColorFromPrimitiveValue.cpp:
(WebCore::Style::colorFromPrimitiveValue):
Support CSSUnresolvedColor CSSPrimitiveValues when building StyleColors.

Canonical link: https://commits.webkit.org/259145@main




More information about the webkit-changes mailing list