Changeset 271992 in webkit
- Timestamp:
- Jan 27, 2021 5:22:09 PM (18 months ago)
- Location:
- trunk
- Files:
-
- 10 added
- 16 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/TestExpectations (modified) (1 diff)
-
LayoutTests/fast/css/parsing-a98rgb-colors-expected.txt (added)
-
LayoutTests/fast/css/parsing-a98rgb-colors.html (added)
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-color/a98rgb-001-expected.html (added)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-color/a98rgb-001.html (added)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-color/a98rgb-002-expected.html (added)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-color/a98rgb-002.html (added)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-color/a98rgb-003-expected.html (added)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-color/a98rgb-003.html (added)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-color/a98rgb-004-expected.html (added)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-color/a98rgb-004.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/css/CSSValueKeywords.in (modified) (1 diff)
-
Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp (modified) (2 diffs)
-
Source/WebCore/platform/graphics/ColorConversion.cpp (modified) (14 diffs)
-
Source/WebCore/platform/graphics/ColorConversion.h (modified) (4 diffs)
-
Source/WebCore/platform/graphics/ColorSerialization.cpp (modified) (2 diffs)
-
Source/WebCore/platform/graphics/ColorSerialization.h (modified) (2 diffs)
-
Source/WebCore/platform/graphics/ColorSpace.cpp (modified) (2 diffs)
-
Source/WebCore/platform/graphics/ColorSpace.h (modified) (2 diffs)
-
Source/WebCore/platform/graphics/ColorTypes.h (modified) (10 diffs)
-
Source/WebCore/platform/graphics/cairo/ImageBufferCairoBackend.cpp (modified) (2 diffs)
-
Source/WebCore/platform/graphics/cg/ColorSpaceCG.cpp (modified) (1 diff)
-
Source/WebCore/platform/graphics/cg/ColorSpaceCG.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r271988 r271992 1 2021-01-27 Sam Weinig <weinig@apple.com> 2 3 Add support for color(a98-rgb ...) as part of CSS Color 4 4 https://bugs.webkit.org/show_bug.cgi?id=221018 5 6 Reviewed by Darin Adler. 7 8 * TestExpectations: 9 Un-fail some now passing tests. 10 11 * fast/css/parsing-a98rgb-colors-expected.txt: Added. 12 * fast/css/parsing-a98rgb-colors.html: Added. 13 Add new tests for parsing color(a98-rgb ) colors. 14 1 15 2021-01-27 Ada Chan <ada.chan@apple.com> 2 16 -
trunk/LayoutTests/TestExpectations
r271988 r271992 4599 4599 webkit.org/b/220928 imported/w3c/web-platform-tests/css/css-color/predefined-003.html [ ImageOnlyFailure ] # Invalid test, no colorspace specified 4600 4600 webkit.org/b/220928 imported/w3c/web-platform-tests/css/css-color/predefined-004.html [ ImageOnlyFailure ] # Invalid test, no colorspace specified 4601 webkit.org/b/220928 imported/w3c/web-platform-tests/css/css-color/predefined-007.html [ ImageOnlyFailure ] # Requires a98-rgb support4602 webkit.org/b/220928 imported/w3c/web-platform-tests/css/css-color/predefined-008.html [ ImageOnlyFailure ] # Requires a98-rgb support4603 4601 webkit.org/b/220928 imported/w3c/web-platform-tests/css/css-color/predefined-009.html [ ImageOnlyFailure ] # Requires prophoto-rgb support 4604 4602 webkit.org/b/220928 imported/w3c/web-platform-tests/css/css-color/predefined-010.html [ ImageOnlyFailure ] # Requires prophoto-rgb support -
trunk/LayoutTests/imported/w3c/ChangeLog
r271944 r271992 1 2021-01-27 Sam Weinig <weinig@apple.com> 2 3 Add support for color(a98-rgb ...) as part of CSS Color 4 4 https://bugs.webkit.org/show_bug.cgi?id=221018 5 6 Reviewed by Darin Adler. 7 8 Add some new WPT tests for color(a98-rgb ) that will be upstreamed shortly. 9 10 * web-platform-tests/css/css-color/a98rgb-001-expected.html: Added. 11 * web-platform-tests/css/css-color/a98rgb-001.html: Added. 12 * web-platform-tests/css/css-color/a98rgb-002-expected.html: Added. 13 * web-platform-tests/css/css-color/a98rgb-002.html: Added. 14 * web-platform-tests/css/css-color/a98rgb-003-expected.html: Added. 15 * web-platform-tests/css/css-color/a98rgb-003.html: Added. 16 * web-platform-tests/css/css-color/a98rgb-004-expected.html: Added. 17 * web-platform-tests/css/css-color/a98rgb-004.html: Added. 18 1 19 2021-01-27 Manuel Rego Casasnovas <rego@igalia.com> 2 20 -
trunk/Source/WebCore/ChangeLog
r271988 r271992 1 2021-01-27 Sam Weinig <weinig@apple.com> 2 3 Add support for color(a98-rgb ...) as part of CSS Color 4 4 https://bugs.webkit.org/show_bug.cgi?id=221018 5 6 Reviewed by Darin Adler. 7 8 * css/CSSValueKeywords.in: 9 Add keyword for a98-rgb and a comment indicating that lab, which already exists as a value, 10 is also a valid identifier for the color function. 11 12 * css/parser/CSSPropertyParserHelpers.cpp: 13 (WebCore::CSSPropertyParserHelpers::parseColorFunctionForRGBTypes): 14 (WebCore::CSSPropertyParserHelpers::parseColorFunctionParameters): 15 (WebCore::CSSPropertyParserHelpers::parseColorFunctionForSRGBOrDisplayP3Parameters): Deleted. 16 Generalize parseColorFunctionForSRGBOrDisplayP3Parameters to work for all RGB types, which now include 17 A98RGB. 18 19 * platform/graphics/ColorConversion.cpp: 20 (WebCore::SRGBTransferFunction::fromLinearClamping): 21 (WebCore::SRGBTransferFunction::toLinearClamping): 22 (WebCore::SRGBTransferFunction::fromLinearNonClamping): 23 (WebCore::SRGBTransferFunction::toLinearNonClamping): 24 (WebCore::A98RGBTransferFunction::fromLinearClamping): 25 (WebCore::A98RGBTransferFunction::toLinearClamping): 26 (WebCore::A98RGBTransferFunction::fromLinearNonClamping): 27 (WebCore::A98RGBTransferFunction::toLinearNonClamping): 28 (WebCore::toLinearClamping): 29 (WebCore::fromLinearClamping): 30 (WebCore::toLinearNonClamping): 31 (WebCore::fromLinearNonClamping): 32 (WebCore::toLinearSRGBA): 33 (WebCore::toLinearExtendedSRGBA): 34 (WebCore::toSRGBA): 35 (WebCore::toExtendedSRGBA): 36 (WebCore::toLinearDisplayP3): 37 (WebCore::toDisplayP3): 38 (WebCore::toLinearA98RGB): 39 (WebCore::toA98RGB): 40 (WebCore::toXYZA): 41 (WebCore::linearToRGBColorComponentClamping): Deleted. 42 (WebCore::rgbToLinearColorComponentClamping): Deleted. 43 (WebCore::linearToRGBColorComponentNonClamping): Deleted. 44 (WebCore::rgbToLinearColorComponentNonClamping): Deleted. 45 * platform/graphics/ColorConversion.h: 46 (WebCore::toA98RGB): 47 (WebCore::toLinearA98RGB): 48 (WebCore::callWithColorType): 49 Add conversion support for A98RGB and LinearA98RGB. Move gamma conversion functions 50 into structs named for the type of transfer function. While not used currently, this 51 will allow future templatizing of conversion to avoid so much boiler plate in the 52 future. 53 54 * platform/graphics/ColorSerialization.cpp: 55 (WebCore::serialization): 56 (WebCore::serializationForCSS): 57 (WebCore::serializationForHTML): 58 (WebCore::serializationForRenderTreeAsText): 59 * platform/graphics/ColorSerialization.h: 60 Add serialization support for color(a98-rgb ...). 61 62 * platform/graphics/ColorSpace.cpp: 63 * platform/graphics/ColorSpace.h: 64 Add A98RGB as a ColorSpace, which really just means it is something 65 ExtendedColor can hold. 66 67 * platform/graphics/cg/ColorSpaceCG.cpp: 68 * platform/graphics/cg/ColorSpaceCG.h: 69 Add support for creating a CGColorSpace for A98RGB. 70 71 * platform/graphics/ColorTypes.h: 72 (WebCore::operator==): 73 (WebCore::operator!=): 74 (WebCore::RGBAType::RGBAType): 75 (WebCore::asColorComponents): 76 (WebCore::SRGBA::SRGBA): Deleted. 77 (WebCore::ExtendedSRGBA::ExtendedSRGBA): Deleted. 78 (WebCore::LinearSRGBA::LinearSRGBA): Deleted. 79 (WebCore::LinearExtendedSRGBA::LinearExtendedSRGBA): Deleted. 80 (WebCore::DisplayP3::DisplayP3): Deleted. 81 (WebCore::LinearDisplayP3::LinearDisplayP3): Deleted. 82 (WebCore::callWithColorType): Deleted. 83 Simplify adding new RGB color types by adding a shared base class, RGBAType 84 and and a shared asColorComponents funciton. Also simplify all color types 85 by removing the need to define your own operator==/!= for each type by having 86 a single one that operates on any type that can have asColorComponents() called 87 on it. 88 89 To create a new RGB color (one with red, green and blue named components) one 90 now only needs to do: 91 92 template<typename T> struct Foo : RGBAType<Foo, T, RGBModel<T>> { 93 using RGBAType<Foo, T, RGBModel<T>>::RGBAType; 94 }; 95 template<typename T> Foo(T, T, T, T) -> Foo<T>; 96 97 Additionally, if the type has gamma encoded and linear versions, it should have 98 either a `using GammaEncoded = ...` or `using Linear = ...` decalaring its 99 counterpart and should add a colorSpace member if the type is used by ExtendedColor. 100 101 Note, the deduction guide is necessary to keep things like the following working: 102 103 auto color = SRGB { float1, float2, ... }; 104 105 Unfortunately, deduction does not come along when you explitily inherit constructors 106 like is being done for these. See the "Deducing from inherited constructors" section 107 in http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1021r4.html. 108 109 * platform/graphics/cairo/ImageBufferCairoBackend.cpp: 110 (WebCore::ImageBufferCairoBackend::transformColorSpace): 111 Update to use new name for gamma conversion functions. 112 1 113 2021-01-27 Ada Chan <ada.chan@apple.com> 2 114 -
trunk/Source/WebCore/css/CSSValueKeywords.in
r271362 r271992 1408 1408 sRGB 1409 1409 display-p3 1410 a98-rgb 1411 // lab 1410 1412 1411 1413 // prefers-default-appearance -
trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp
r271866 r271992 876 876 877 877 template<typename ColorType> 878 static Color parseColorFunctionFor SRGBOrDisplayP3Parameters(CSSParserTokenRange& args)879 { 880 ASSERT(args.peek().id() == CSSValueSRGB || args.peek().id() == CSSValueDisplayP3 );878 static Color parseColorFunctionForRGBTypes(CSSParserTokenRange& args) 879 { 880 ASSERT(args.peek().id() == CSSValueSRGB || args.peek().id() == CSSValueDisplayP3 || args.peek().id() == CSSValueA98Rgb); 881 881 consumeIdentRaw(args); 882 882 … … 937 937 switch (args.peek().id()) { 938 938 case CSSValueSRGB: 939 color = parseColorFunctionFor SRGBOrDisplayP3Parameters<SRGBA<float>>(args);939 color = parseColorFunctionForRGBTypes<SRGBA<float>>(args); 940 940 break; 941 941 case CSSValueDisplayP3: 942 color = parseColorFunctionForSRGBOrDisplayP3Parameters<DisplayP3<float>>(args); 942 color = parseColorFunctionForRGBTypes<DisplayP3<float>>(args); 943 break; 944 case CSSValueA98Rgb: 945 color = parseColorFunctionForRGBTypes<A98RGB<float>>(args); 943 946 break; 944 947 case CSSValueLab: -
trunk/Source/WebCore/platform/graphics/ColorConversion.cpp
r271723 r271992 63 63 }; 64 64 65 // https://drafts.csswg.org/css-color/#color-conversion-code 66 static constexpr ColorMatrix<3, 3> xyzToLinearA98RGBMatrix { 67 2.493496911941425f, -0.9313836179191239f, -0.4027107844507168f, 68 -0.8294889695615747f, 1.7626640603183463f, 0.0236246858419436f, 69 0.0358458302437845f, -0.0761723892680418f, 0.9568845240076872f 70 }; 71 72 // https://drafts.csswg.org/css-color/#color-conversion-code 73 static constexpr ColorMatrix<3, 3> linearA98RGBToXYZMatrix { 74 0.5766690429101305f, 0.1855582379065463f, 0.1882286462349947f, 75 0.29734497525053605f, 0.6273635662554661f, 0.07529145849399788f, 76 0.02703136138641234f, 0.07068885253582723f, 0.9913375368376388f 77 }; 78 65 79 // http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html 66 80 static constexpr ColorMatrix<3, 3> D50ToD65Matrix { … … 79 93 // Gamma conversions. 80 94 81 float linearToRGBColorComponentClamping(float c)95 float SRGBTransferFunction::fromLinearClamping(float c) 82 96 { 83 97 if (c < 0.0031308f) … … 87 101 } 88 102 89 float rgbToLinearColorComponentClamping(float c)103 float SRGBTransferFunction::toLinearClamping(float c) 90 104 { 91 105 if (c <= 0.04045f) … … 95 109 } 96 110 97 float linearToRGBColorComponentNonClamping(float c)98 { 99 float sign = c > 0 ? 1.0f : -1.0f;111 float SRGBTransferFunction::fromLinearNonClamping(float c) 112 { 113 float sign = std::signbit(c) ? -1.0f : 1.0f; 100 114 c = std::abs(c); 101 115 … … 106 120 } 107 121 108 float rgbToLinearColorComponentNonClamping(float c)109 { 110 float sign = c > 0 ? 1.0f : -1.0f;122 float SRGBTransferFunction::toLinearNonClamping(float c) 123 { 124 float sign = std::signbit(c) ? -1.0f : 1.0f; 111 125 c = std::abs(c); 112 126 … … 117 131 } 118 132 133 float A98RGBTransferFunction::fromLinearClamping(float c) 134 { 135 return clampTo<float>(fromLinearNonClamping(c), 0, 1); 136 } 137 138 float A98RGBTransferFunction::toLinearClamping(float c) 139 { 140 return clampTo<float>(toLinearNonClamping(c), 0, 1); 141 } 142 143 float A98RGBTransferFunction::fromLinearNonClamping(float c) 144 { 145 float sign = std::signbit(c) ? -1.0f : 1.0f; 146 return std::pow(std::abs(c), 256.0f / 563.0f) * sign; 147 } 148 149 float A98RGBTransferFunction::toLinearNonClamping(float c) 150 { 151 float sign = std::signbit(c) ? -1.0f : 1.0f; 152 return std::pow(std::abs(c), 563.0f / 256.0f) * sign; 153 } 154 155 template<typename TransferFunction, typename T> static auto toLinearClamping(const T& color) -> typename T::LinearCounterpart 156 { 157 auto [c1, c2, c3, alpha] = color; 158 return { TransferFunction::toLinearClamping(c1), TransferFunction::toLinearClamping(c2), TransferFunction::toLinearClamping(c3), alpha }; 159 } 160 161 template<typename TransferFunction, typename T> static auto fromLinearClamping(const T& color) -> typename T::GammaEncodedCounterpart 162 { 163 auto [c1, c2, c3, alpha] = color; 164 return { TransferFunction::fromLinearClamping(c1), TransferFunction::fromLinearClamping(c2), TransferFunction::fromLinearClamping(c3), alpha }; 165 } 166 167 template<typename TransferFunction, typename T> static auto toLinearNonClamping(const T& color) -> typename T::LinearCounterpart 168 { 169 auto [c1, c2, c3, alpha] = color; 170 return { TransferFunction::toLinearNonClamping(c1), TransferFunction::toLinearNonClamping(c2), TransferFunction::toLinearNonClamping(c3), alpha }; 171 } 172 173 template<typename TransferFunction, typename T> static auto fromLinearNonClamping(const T& color) -> typename T::GammaEncodedCounterpart 174 { 175 auto [c1, c2, c3, alpha] = color; 176 return { TransferFunction::fromLinearNonClamping(c1), TransferFunction::fromLinearNonClamping(c2), TransferFunction::fromLinearNonClamping(c3), alpha }; 177 } 178 119 179 LinearSRGBA<float> toLinearSRGBA(const SRGBA<float>& color) 120 180 { 121 return { 122 rgbToLinearColorComponentClamping(color.red), 123 rgbToLinearColorComponentClamping(color.green), 124 rgbToLinearColorComponentClamping(color.blue), 125 color.alpha 126 }; 181 return toLinearClamping<SRGBTransferFunction>(color); 127 182 } 128 183 129 184 LinearExtendedSRGBA<float> toLinearExtendedSRGBA(const ExtendedSRGBA<float>& color) 130 185 { 131 return { 132 rgbToLinearColorComponentNonClamping(color.red), 133 rgbToLinearColorComponentNonClamping(color.green), 134 rgbToLinearColorComponentNonClamping(color.blue), 135 color.alpha 136 }; 186 return toLinearNonClamping<SRGBTransferFunction>(color); 137 187 } 138 188 139 189 SRGBA<float> toSRGBA(const LinearSRGBA<float>& color) 140 190 { 141 return { 142 linearToRGBColorComponentClamping(color.red), 143 linearToRGBColorComponentClamping(color.green), 144 linearToRGBColorComponentClamping(color.blue), 145 color.alpha 146 }; 191 return fromLinearClamping<SRGBTransferFunction>(color); 147 192 } 148 193 149 194 ExtendedSRGBA<float> toExtendedSRGBA(const LinearExtendedSRGBA<float>& color) 150 195 { 151 return { 152 linearToRGBColorComponentNonClamping(color.red), 153 linearToRGBColorComponentNonClamping(color.green), 154 linearToRGBColorComponentNonClamping(color.blue), 155 color.alpha 156 }; 196 return fromLinearNonClamping<SRGBTransferFunction>(color); 157 197 } 158 198 159 199 LinearDisplayP3<float> toLinearDisplayP3(const DisplayP3<float>& color) 160 200 { 161 return { 162 rgbToLinearColorComponentClamping(color.red), 163 rgbToLinearColorComponentClamping(color.green), 164 rgbToLinearColorComponentClamping(color.blue), 165 color.alpha 166 }; 201 return toLinearClamping<SRGBTransferFunction>(color); 167 202 } 168 203 169 204 DisplayP3<float> toDisplayP3(const LinearDisplayP3<float>& color) 170 205 { 171 return { 172 linearToRGBColorComponentClamping(color.red), 173 linearToRGBColorComponentClamping(color.green), 174 linearToRGBColorComponentClamping(color.blue), 175 color.alpha 176 }; 177 } 178 179 // Matrix conversions. 206 return fromLinearClamping<SRGBTransferFunction>(color); 207 } 208 209 LinearA98RGB<float> toLinearA98RGB(const A98RGB<float>& color) 210 { 211 return toLinearClamping<A98RGBTransferFunction>(color); 212 } 213 214 A98RGB<float> toA98RGB(const LinearA98RGB<float>& color) 215 { 216 return fromLinearClamping<A98RGBTransferFunction>(color); 217 } 218 219 // Matrix conversions (to and from XYZ for all linear color types). 220 221 // - LinearSRGBA matrix conversions. 180 222 181 223 LinearSRGBA<float> toLinearSRGBA(const XYZA<float>& color) … … 189 231 } 190 232 233 // - LinearExtendedSRGBA matrix conversions. 234 191 235 LinearExtendedSRGBA<float> toLinearExtendedSRGBA(const XYZA<float>& color) 192 236 { … … 199 243 } 200 244 245 // - LinearDisplayP3 matrix conversions. 246 201 247 LinearDisplayP3<float> toLinearDisplayP3(const XYZA<float>& color) 202 248 { … … 207 253 { 208 254 return makeFromComponentsClampingExceptAlpha<XYZA<float>>(linearDisplayP3ToXYZMatrix.transformedColorComponents(asColorComponents(color))); 255 } 256 257 // - LinearA98RGB matrix conversions. 258 259 LinearA98RGB<float> toLinearA98RGB(const XYZA<float>& color) 260 { 261 return makeFromComponentsClampingExceptAlpha<LinearA98RGB<float>>(xyzToLinearA98RGBMatrix.transformedColorComponents(asColorComponents(color))); 262 } 263 264 XYZA<float> toXYZA(const LinearA98RGB<float>& color) 265 { 266 return makeFromComponentsClampingExceptAlpha<XYZA<float>>(linearA98RGBToXYZMatrix.transformedColorComponents(asColorComponents(color))); 209 267 } 210 268 … … 407 465 // Combination conversions (constructed from more basic conversions above). 408 466 467 // - SRGB combination functions. 468 409 469 XYZA<float> toXYZA(const SRGBA<float>& color) 410 470 { … … 417 477 } 418 478 479 // - ExtendedSRGB combination functions. 480 419 481 XYZA<float> toXYZA(const ExtendedSRGBA<float>& color) 420 482 { … … 427 489 } 428 490 491 // - DisplayP3 combination functions. 492 429 493 XYZA<float> toXYZA(const DisplayP3<float>& color) 430 494 { … … 437 501 } 438 502 503 // - A98RGB combination functions. 504 505 XYZA<float> toXYZA(const A98RGB<float>& color) 506 { 507 return toXYZA(toLinearA98RGB(color)); 508 } 509 510 A98RGB<float> toA98RGB(const XYZA<float>& color) 511 { 512 return toA98RGB(toLinearA98RGB(color)); 513 } 514 515 // - LCHA combination functions. 516 439 517 XYZA<float> toXYZA(const LCHA<float>& color) 440 518 { … … 447 525 } 448 526 527 // - HSLA combination functions. 528 449 529 XYZA<float> toXYZA(const HSLA<float>& color) 450 530 { -
trunk/Source/WebCore/platform/graphics/ColorConversion.h
r271723 r271992 30 30 namespace WebCore { 31 31 32 // These are the standard sRGB <-> LinearRGB / DisplayP3 <-> LinearDisplayP3 conversion functions (https://en.wikipedia.org/wiki/SRGB). 33 float linearToRGBColorComponentClamping(float); 34 float rgbToLinearColorComponentClamping(float); 35 float linearToRGBColorComponentNonClamping(float); 36 float rgbToLinearColorComponentNonClamping(float); 32 // Transfer functions for colors that can be gamma encoded. 33 34 struct SRGBTransferFunction { 35 static float fromLinearClamping(float); 36 static float toLinearClamping(float); 37 static float fromLinearNonClamping(float); 38 static float toLinearNonClamping(float); 39 }; 40 41 struct A98RGBTransferFunction { 42 static float fromLinearClamping(float); 43 static float toLinearClamping(float); 44 static float fromLinearNonClamping(float); 45 static float toLinearNonClamping(float); 46 }; 37 47 38 48 // All color types must at least implement the following conversions to and from the XYZA color space: … … 98 108 // Additions 99 109 WEBCORE_EXPORT SRGBA<float> toSRGBA(const HSLA<float>&); 110 111 // A98RGB 112 WEBCORE_EXPORT XYZA<float> toXYZA(const A98RGB<float>&); 113 WEBCORE_EXPORT A98RGB<float> toA98RGB(const XYZA<float>&); 114 // Additions 115 WEBCORE_EXPORT LinearA98RGB<float> toLinearA98RGB(const A98RGB<float>&); 116 117 // LinearA98RGB 118 WEBCORE_EXPORT XYZA<float> toXYZA(const LinearA98RGB<float>&); 119 WEBCORE_EXPORT LinearA98RGB<float> toLinearA98RGB(const XYZA<float>&); 120 // Additions 121 WEBCORE_EXPORT A98RGB<float> toA98RGB(const LinearA98RGB<float>& color); 100 122 101 123 … … 112 134 constexpr HSLA<float> toHSLA(const HSLA<float>& color) { return color; } 113 135 constexpr XYZA<float> toXYZA(const XYZA<float>& color) { return color; } 136 constexpr A98RGB<float> toA98RGB(const A98RGB<float>& color) { return color; } 114 137 115 138 … … 164 187 } 165 188 189 template<typename T> A98RGB<float> toA98RGB(const T& color) 190 { 191 return toA98RGB(toXYZA(color)); 192 } 193 194 template<typename T> LinearA98RGB<float> toLinearA98RGB(const T& color) 195 { 196 return toLinearA98RGB(toXYZA(color)); 197 } 198 199 200 template<typename T, typename Functor> constexpr decltype(auto) callWithColorType(const ColorComponents<T>& components, ColorSpace colorSpace, Functor&& functor) 201 { 202 switch (colorSpace) { 203 case ColorSpace::SRGB: 204 return std::invoke(std::forward<Functor>(functor), makeFromComponents<SRGBA<T>>(components)); 205 case ColorSpace::LinearRGB: 206 return std::invoke(std::forward<Functor>(functor), makeFromComponents<LinearSRGBA<T>>(components)); 207 case ColorSpace::DisplayP3: 208 return std::invoke(std::forward<Functor>(functor), makeFromComponents<DisplayP3<T>>(components)); 209 case ColorSpace::A98RGB: 210 return std::invoke(std::forward<Functor>(functor), makeFromComponents<A98RGB<T>>(components)); 211 case ColorSpace::Lab: 212 return std::invoke(std::forward<Functor>(functor), makeFromComponents<Lab<T>>(components)); 213 } 214 215 ASSERT_NOT_REACHED(); 216 return std::invoke(std::forward<Functor>(functor), makeFromComponents<SRGBA<T>>(components)); 217 } 218 166 219 } // namespace WebCore -
trunk/Source/WebCore/platform/graphics/ColorSerialization.cpp
r271362 r271992 97 97 case ColorSpace::DisplayP3: 98 98 return "display-p3"_s; 99 case ColorSpace::A98RGB: 100 return "a98-rgb"_s; 99 101 case ColorSpace::Lab: 100 102 return "lab"_s; … … 164 166 } 165 167 168 // A98RGB<float> overloads 169 170 String serializationForCSS(const A98RGB<float>& color) 171 { 172 return serialization(color); 173 } 174 175 String serializationForHTML(const A98RGB<float>& color) 176 { 177 return serialization(color); 178 } 179 180 String serializationForRenderTreeAsText(const A98RGB<float>& color) 181 { 182 return serialization(color); 183 } 184 166 185 // Lab<float> overloads 167 186 -
trunk/Source/WebCore/platform/graphics/ColorSerialization.h
r271362 r271992 32 32 class Color; 33 33 34 template<typename> struct A98RGB; 34 35 template<typename> struct DisplayP3; 35 36 template<typename> struct Lab; … … 57 58 WEBCORE_EXPORT String serializationForRenderTreeAsText(const DisplayP3<float>&); 58 59 60 WEBCORE_EXPORT String serializationForCSS(const A98RGB<float>&); 61 WEBCORE_EXPORT String serializationForHTML(const A98RGB<float>&); 62 WEBCORE_EXPORT String serializationForRenderTreeAsText(const A98RGB<float>&); 63 59 64 WEBCORE_EXPORT String serializationForCSS(const Lab<float>&); 60 65 WEBCORE_EXPORT String serializationForHTML(const Lab<float>&); -
trunk/Source/WebCore/platform/graphics/ColorSpace.cpp
r271362 r271992 1 1 /* 2 * Copyright (C) 2020 Apple Inc. All rights reserved.2 * Copyright (C) 2020-2021 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 43 43 ts << "DisplayP3"; 44 44 break; 45 case ColorSpace::A98RGB: 46 ts << "a98-rgb"; 47 break; 45 48 case ColorSpace::Lab: 46 49 ts << "L*a*b"; -
trunk/Source/WebCore/platform/graphics/ColorSpace.h
r271362 r271992 1 1 /* 2 * Copyright (C) 2009 Apple Inc. All rights reserved.2 * Copyright (C) 2009-2021 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 36 36 LinearRGB, 37 37 DisplayP3, 38 A98RGB, 38 39 Lab 39 40 }; -
trunk/Source/WebCore/platform/graphics/ColorTypes.h
r271723 r271992 32 32 namespace WebCore { 33 33 34 template<typename> struct SRGBA; 35 template<typename> struct ExtendedSRGBA; 36 template<typename> struct LinearSRGBA; 37 template<typename> struct LinearExtendedSRGBA; 38 template<typename> struct DisplayP3; 39 template<typename> struct LinearDisplayP3; 40 template<typename> struct A98RGB; 41 template<typename> struct LinearA98RGB; 42 template<typename> struct Lab; 43 template<typename> struct LCHA; 44 template<typename> struct HSLA; 45 template<typename> struct XYZ; 46 34 47 template<typename> struct AlphaTraits; 35 48 … … 118 131 static constexpr bool isInvertible = false; 119 132 }; 133 120 134 121 135 template<typename ColorType, typename T> constexpr ColorType makeFromComponents(const ColorComponents<T>& c) … … 270 284 }; 271 285 272 template<typename T> struct SRGBA : ColorWithAlphaHelper<SRGBA<T>> { 286 287 template<typename ColorType, typename std::enable_if_t<IsConvertibleToColorComponents<ColorType>>* = nullptr> 288 constexpr bool operator==(const ColorType& a, const ColorType& b) 289 { 290 return asColorComponents(a) == asColorComponents(b); 291 } 292 293 template<typename ColorType, typename std::enable_if_t<IsConvertibleToColorComponents<ColorType>>* = nullptr> 294 constexpr bool operator!=(const ColorType& a, const ColorType& b) 295 { 296 return !(a == b); 297 } 298 299 300 // MARK: - RGB Color Types. 301 302 template<template<typename> class C, typename T, typename M> struct RGBAType : ColorWithAlphaHelper<C<T>> { 273 303 using ComponentType = T; 274 using Model = RGBModel<T>; 275 static constexpr auto colorSpace { ColorSpace::SRGB }; 304 using Model = M; 276 305 277 constexpr SRGBA(T red, T green, T blue, T alpha = AlphaTraits<T>::opaque)306 constexpr RGBAType(T red, T green, T blue, T alpha = AlphaTraits<T>::opaque) 278 307 : red { red } 279 308 , green { green } … … 284 313 } 285 314 286 constexpr SRGBA()287 : SRGBA{ 0, 0, 0, 0 }315 constexpr RGBAType() 316 : RGBAType { 0, 0, 0, 0 } 288 317 { 289 318 } … … 295 324 }; 296 325 297 template<t ypename T> constexpr ColorComponents<T> asColorComponents(const SRGBA<T>& c)326 template<template<typename> class ColorType, typename T, typename M> constexpr ColorComponents<T> asColorComponents(const RGBAType<ColorType, T, M>& c) 298 327 { 299 328 return { c.red, c.green, c.blue, c.alpha }; 300 329 } 301 330 302 template<typename T> constexpr bool operator==(const SRGBA<T>& a, const SRGBA<T>& b) 303 { 304 return asColorComponents(a) == asColorComponents(b); 305 } 306 307 template<typename T> constexpr bool operator!=(const SRGBA<T>& a, const SRGBA<T>& b) 308 { 309 return !(a == b); 310 } 311 312 313 template<typename T> struct ExtendedSRGBA : ColorWithAlphaHelper<ExtendedSRGBA<T>> { 314 using ComponentType = T; 315 using Model = ExtendedRGBModel<T>; 316 317 constexpr ExtendedSRGBA(T red, T green, T blue, T alpha = AlphaTraits<T>::opaque) 318 : red { red } 319 , green { green } 320 , blue { blue } 321 , alpha { alpha } 322 { 323 } 324 325 constexpr ExtendedSRGBA() 326 : ExtendedSRGBA { 0, 0, 0, 0 } 327 { 328 } 329 330 T red; 331 T green; 332 T blue; 333 T alpha; 334 }; 335 336 template<typename T> constexpr ColorComponents<T> asColorComponents(const ExtendedSRGBA<T>& c) 337 { 338 return { c.red, c.green, c.blue, c.alpha }; 339 } 340 341 template<typename T> constexpr bool operator==(const ExtendedSRGBA<T>& a, const ExtendedSRGBA<T>& b) 342 { 343 return asColorComponents(a) == asColorComponents(b); 344 } 345 346 template<typename T> constexpr bool operator!=(const ExtendedSRGBA<T>& a, const ExtendedSRGBA<T>& b) 347 { 348 return !(a == b); 349 } 350 351 352 template<typename T> struct LinearSRGBA : ColorWithAlphaHelper<LinearSRGBA<T>> { 353 using ComponentType = T; 354 using Model = RGBModel<T>; 331 template<typename T> struct SRGBA : RGBAType<SRGBA, T, RGBModel<T>> { 332 using RGBAType<SRGBA, T, RGBModel<T>>::RGBAType; 333 using LinearCounterpart = LinearSRGBA<T>; 334 static constexpr auto colorSpace { ColorSpace::SRGB }; 335 }; 336 template<typename T> SRGBA(T, T, T, T) -> SRGBA<T>; 337 338 template<typename T> struct LinearSRGBA : RGBAType<LinearSRGBA, T, RGBModel<T>> { 339 using RGBAType<LinearSRGBA, T, RGBModel<T>>::RGBAType; 340 using GammaEncodedCounterpart = SRGBA<T>; 355 341 static constexpr auto colorSpace = ColorSpace::LinearRGB; 356 357 constexpr LinearSRGBA(T red, T green, T blue, T alpha = AlphaTraits<T>::opaque) 358 : red { red } 359 , green { green } 360 , blue { blue } 361 , alpha { alpha } 362 { 363 assertInRange(*this); 364 } 365 366 constexpr LinearSRGBA() 367 : LinearSRGBA { 0, 0, 0, 0 } 368 { 369 } 370 371 T red; 372 T green; 373 T blue; 374 T alpha; 375 }; 376 377 template<typename T> constexpr ColorComponents<T> asColorComponents(const LinearSRGBA<T>& c) 378 { 379 return { c.red, c.green, c.blue, c.alpha }; 380 } 381 382 template<typename T> constexpr bool operator==(const LinearSRGBA<T>& a, const LinearSRGBA<T>& b) 383 { 384 return asColorComponents(a) == asColorComponents(b); 385 } 386 387 template<typename T> constexpr bool operator!=(const LinearSRGBA<T>& a, const LinearSRGBA<T>& b) 388 { 389 return !(a == b); 390 } 391 392 393 template<typename T> struct LinearExtendedSRGBA : ColorWithAlphaHelper<LinearExtendedSRGBA<T>> { 394 using ComponentType = T; 395 using Model = ExtendedRGBModel<T>; 396 397 constexpr LinearExtendedSRGBA(T red, T green, T blue, T alpha = AlphaTraits<T>::opaque) 398 : red { red } 399 , green { green } 400 , blue { blue } 401 , alpha { alpha } 402 { 403 } 404 405 constexpr LinearExtendedSRGBA() 406 : LinearExtendedSRGBA { 0, 0, 0, 0 } 407 { 408 } 409 410 T red; 411 T green; 412 T blue; 413 T alpha; 414 }; 415 416 template<typename T> constexpr ColorComponents<T> asColorComponents(const LinearExtendedSRGBA<T>& c) 417 { 418 return { c.red, c.green, c.blue, c.alpha }; 419 } 420 421 template<typename T> constexpr bool operator==(const LinearExtendedSRGBA<T>& a, const LinearExtendedSRGBA<T>& b) 422 { 423 return asColorComponents(a) == asColorComponents(b); 424 } 425 426 template<typename T> constexpr bool operator!=(const LinearExtendedSRGBA<T>& a, const LinearExtendedSRGBA<T>& b) 427 { 428 return !(a == b); 429 } 430 431 432 template<typename T> struct DisplayP3 : ColorWithAlphaHelper<DisplayP3<T>> { 433 using ComponentType = T; 434 using Model = RGBModel<T>; 342 }; 343 template<typename T> LinearSRGBA(T, T, T, T) -> LinearSRGBA<T>; 344 345 346 template<typename T> struct ExtendedSRGBA : RGBAType<ExtendedSRGBA, T, ExtendedRGBModel<T>> { 347 using RGBAType<ExtendedSRGBA, T, ExtendedRGBModel<T>>::RGBAType; 348 using LinearCounterpart = LinearExtendedSRGBA<T>; 349 }; 350 template<typename T> ExtendedSRGBA(T, T, T, T) -> ExtendedSRGBA<T>; 351 352 template<typename T> struct LinearExtendedSRGBA : RGBAType<LinearExtendedSRGBA, T, ExtendedRGBModel<T>> { 353 using RGBAType<LinearExtendedSRGBA, T, ExtendedRGBModel<T>>::RGBAType; 354 using GammaEncodedCounterpart = ExtendedSRGBA<T>; 355 }; 356 template<typename T> LinearExtendedSRGBA(T, T, T, T) -> LinearExtendedSRGBA<T>; 357 358 359 template<typename T> struct DisplayP3 : RGBAType<DisplayP3, T, RGBModel<T>> { 360 using RGBAType<DisplayP3, T, RGBModel<T>>::RGBAType; 361 using LinearCounterpart = LinearDisplayP3<T>; 435 362 static constexpr auto colorSpace = ColorSpace::DisplayP3; 436 437 constexpr DisplayP3(T red, T green, T blue, T alpha = AlphaTraits<T>::opaque) 438 : red { red } 439 , green { green } 440 , blue { blue } 441 , alpha { alpha } 442 { 443 assertInRange(*this); 444 } 445 446 constexpr DisplayP3() 447 : DisplayP3 { 0, 0, 0, 0 } 448 { 449 } 450 451 T red; 452 T green; 453 T blue; 454 T alpha; 455 }; 456 457 template<typename T> constexpr ColorComponents<T> asColorComponents(const DisplayP3<T>& c) 458 { 459 return { c.red, c.green, c.blue, c.alpha }; 460 } 461 462 template<typename T> constexpr bool operator==(const DisplayP3<T>& a, const DisplayP3<T>& b) 463 { 464 return asColorComponents(a) == asColorComponents(b); 465 } 466 467 template<typename T> constexpr bool operator!=(const DisplayP3<T>& a, const DisplayP3<T>& b) 468 { 469 return !(a == b); 470 } 471 472 473 template<typename T> struct LinearDisplayP3 : ColorWithAlphaHelper<LinearDisplayP3<T>> { 474 using ComponentType = T; 475 using Model = RGBModel<T>; 476 477 constexpr LinearDisplayP3(T red, T green, T blue, T alpha = AlphaTraits<T>::opaque) 478 : red { red } 479 , green { green } 480 , blue { blue } 481 , alpha { alpha } 482 { 483 assertInRange(*this); 484 } 485 486 constexpr LinearDisplayP3() 487 : LinearDisplayP3 { 0, 0, 0, 0 } 488 { 489 } 490 491 T red; 492 T green; 493 T blue; 494 T alpha; 495 }; 496 497 template<typename T> constexpr ColorComponents<T> asColorComponents(const LinearDisplayP3<T>& c) 498 { 499 return { c.red, c.green, c.blue, c.alpha }; 500 } 501 502 template<typename T> constexpr bool operator==(const LinearDisplayP3<T>& a, const LinearDisplayP3<T>& b) 503 { 504 return asColorComponents(a) == asColorComponents(b); 505 } 506 507 template<typename T> constexpr bool operator!=(const LinearDisplayP3<T>& a, const LinearDisplayP3<T>& b) 508 { 509 return !(a == b); 510 } 511 363 }; 364 template<typename T> DisplayP3(T, T, T, T) -> DisplayP3<T>; 365 366 template<typename T> struct LinearDisplayP3 : RGBAType<LinearDisplayP3, T, RGBModel<T>> { 367 using RGBAType<LinearDisplayP3, T, RGBModel<T>>::RGBAType; 368 using GammaEncodedCounterpart = DisplayP3<T>; 369 }; 370 template<typename T> LinearDisplayP3(T, T, T, T) -> LinearDisplayP3<T>; 371 372 373 template<typename T> struct A98RGB : RGBAType<A98RGB, T, RGBModel<T>> { 374 using RGBAType<A98RGB, T, RGBModel<T>>::RGBAType; 375 using LinearCounterpart = LinearA98RGB<T>; 376 static constexpr auto colorSpace = ColorSpace::A98RGB; 377 }; 378 template<typename T> A98RGB(T, T, T, T) -> A98RGB<T>; 379 380 template<typename T> struct LinearA98RGB : RGBAType<LinearA98RGB, T, RGBModel<T>> { 381 using RGBAType<LinearA98RGB, T, RGBModel<T>>::RGBAType; 382 using GammaEncodedCounterpart = A98RGB<T>; 383 }; 384 template<typename T> LinearA98RGB(T, T, T, T) -> LinearA98RGB<T>; 385 386 387 // MARK: - Lab Color Type. 512 388 513 389 template<typename T> struct Lab : ColorWithAlphaHelper<Lab<T>> { … … 541 417 } 542 418 543 template<typename T> constexpr bool operator==(const Lab<T>& a, const Lab<T>& b) 544 { 545 return asColorComponents(a) == asColorComponents(b); 546 } 547 548 template<typename T> constexpr bool operator!=(const Lab<T>& a, const Lab<T>& b) 549 { 550 return !(a == b); 551 } 552 419 // MARK: - LCHA Color Type. 553 420 554 421 template<typename T> struct LCHA : ColorWithAlphaHelper<LCHA<T>> { … … 581 448 } 582 449 583 template<typename T> constexpr bool operator==(const LCHA<T>& a, const LCHA<T>& b) 584 { 585 return asColorComponents(a) == asColorComponents(b); 586 } 587 588 template<typename T> constexpr bool operator!=(const LCHA<T>& a, const LCHA<T>& b) 589 { 590 return !(a == b); 591 } 592 450 451 // MARK: - HSLA Color Type. 593 452 594 453 template<typename T> struct HSLA : ColorWithAlphaHelper<HSLA<T>> { … … 616 475 }; 617 476 618 template<typename T> HSLA(T, T, T, T) -> HSLA<T>;619 620 477 template<typename T> constexpr ColorComponents<T> asColorComponents(const HSLA<T>& c) 621 478 { … … 623 480 } 624 481 625 template<typename T> constexpr bool operator==(const HSLA<T>& a, const HSLA<T>& b) 626 { 627 return asColorComponents(a) == asColorComponents(b); 628 } 629 630 template<typename T> constexpr bool operator!=(const HSLA<T>& a, const HSLA<T>& b) 631 { 632 return !(a == b); 633 } 634 482 // MARK: - XYZ Color Type. 635 483 636 484 template<typename T> struct XYZA : ColorWithAlphaHelper<XYZA<T>> { … … 663 511 } 664 512 665 template<typename T> constexpr bool operator==(const XYZA<T>& a, const XYZA<T>& b)666 {667 return asColorComponents(a) == asColorComponents(b);668 }669 670 template<typename T> constexpr bool operator!=(const XYZA<T>& a, const XYZA<T>& b)671 {672 return !(a == b);673 }674 675 676 template<typename T, typename Functor> constexpr decltype(auto) callWithColorType(const ColorComponents<T>& components, ColorSpace colorSpace, Functor&& functor)677 {678 switch (colorSpace) {679 case ColorSpace::SRGB:680 return std::invoke(std::forward<Functor>(functor), makeFromComponents<SRGBA<T>>(components));681 case ColorSpace::LinearRGB:682 return std::invoke(std::forward<Functor>(functor), makeFromComponents<LinearSRGBA<T>>(components));683 case ColorSpace::DisplayP3:684 return std::invoke(std::forward<Functor>(functor), makeFromComponents<DisplayP3<T>>(components));685 case ColorSpace::Lab:686 return std::invoke(std::forward<Functor>(functor), makeFromComponents<Lab<T>>(components));687 }688 689 ASSERT_NOT_REACHED();690 return std::invoke(std::forward<Functor>(functor), makeFromComponents<SRGBA<T>>(components));691 }692 513 693 514 // Packed Color Formats -
trunk/Source/WebCore/platform/graphics/cairo/ImageBufferCairoBackend.cpp
r271695 r271992 105 105 for (unsigned i = 0; i < 256; i++) { 106 106 float color = i / 255.0f; 107 color = rgbToLinearColorComponentClamping(color);107 color = SRGBTransferFunction::toLinearClamping(color); 108 108 array[i] = static_cast<uint8_t>(round(color * 255)); 109 109 } … … 116 116 for (unsigned i = 0; i < 256; i++) { 117 117 float color = i / 255.0f; 118 color = linearToRGBColorComponentClamping(color);118 color = SRGBTransferFunction::fromLinearClamping(color); 119 119 array[i] = static_cast<uint8_t>(round(color * 255)); 120 120 } -
trunk/Source/WebCore/platform/graphics/cg/ColorSpaceCG.cpp
r271362 r271992 83 83 } 84 84 85 CGColorSpaceRef a98RGBColorSpaceRef() 86 { 87 static CGColorSpaceRef a98RGBColorSpace; 88 static std::once_flag onceFlag; 89 std::call_once(onceFlag, [] { 90 #if PLATFORM(COCOA) 91 a98RGBColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceAdobeRGB1998); 92 #else 93 a98RGBColorSpace = sRGBColorSpaceRef(); 94 #endif 95 }); 96 return a98RGBColorSpace; 97 } 98 85 99 CGColorSpaceRef labColorSpaceRef() 86 100 { -
trunk/Source/WebCore/platform/graphics/cg/ColorSpaceCG.h
r271362 r271992 36 36 WEBCORE_EXPORT CGColorSpaceRef displayP3ColorSpaceRef(); 37 37 WEBCORE_EXPORT CGColorSpaceRef labColorSpaceRef(); 38 WEBCORE_EXPORT CGColorSpaceRef a98RGBColorSpaceRef(); 38 39 WEBCORE_EXPORT CGColorSpaceRef extendedSRGBColorSpaceRef(); 39 40 … … 47 48 case ColorSpace::DisplayP3: 48 49 return displayP3ColorSpaceRef(); 50 case ColorSpace::A98RGB: 51 return a98RGBColorSpaceRef(); 49 52 case ColorSpace::Lab: 50 53 return labColorSpaceRef();
Note: See TracChangeset
for help on using the changeset viewer.