Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(526)

Unified Diff: third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp

Issue 2656623002: Add rec-2020 and p3 color spaces to canvas (Closed)
Patch Set: Rebaseline Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp
index d415f99fe1604ea00994d1fd1785ee94118de95e..bd781c8500381138b634443d9e3d8d3221d1efcd 100644
--- a/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp
@@ -30,9 +30,11 @@
#include "platform/RuntimeEnabledFeatures.h"
#include "platform/weborigin/SecurityOrigin.h"
-const char* const kLinearRGBCanvasColorSpaceName = "linear-rgb";
-const char* const kSRGBCanvasColorSpaceName = "srgb";
-const char* const kLegacyCanvasColorSpaceName = "legacy-srgb";
+constexpr const char* kLegacyCanvasColorSpaceName = "legacy-srgb";
+constexpr const char* kSRGBCanvasColorSpaceName = "srgb";
+constexpr const char* kLinearRGBCanvasColorSpaceName = "linear-rgb";
+constexpr const char* kRec2020CanvasColorSpaceName = "rec-2020";
+constexpr const char* kP3CanvasColorSpaceName = "p3";
namespace blink {
@@ -51,6 +53,10 @@ CanvasRenderingContext::CanvasRenderingContext(
else if (m_creationAttributes.colorSpace() ==
kLinearRGBCanvasColorSpaceName)
m_colorSpace = kLinearRGBCanvasColorSpace;
+ else if (m_creationAttributes.colorSpace() == kRec2020CanvasColorSpaceName)
+ m_colorSpace = kRec2020CanvasColorSpace;
+ else if (m_creationAttributes.colorSpace() == kP3CanvasColorSpaceName)
+ m_colorSpace = kP3CanvasColorSpace;
}
// Make m_creationAttributes reflect the effective colorSpace rather than the
// requested one
@@ -59,31 +65,62 @@ CanvasRenderingContext::CanvasRenderingContext(
WTF::String CanvasRenderingContext::colorSpaceAsString() const {
switch (m_colorSpace) {
+ case kLegacyCanvasColorSpace:
+ return kLegacyCanvasColorSpaceName;
case kSRGBCanvasColorSpace:
return kSRGBCanvasColorSpaceName;
case kLinearRGBCanvasColorSpace:
return kLinearRGBCanvasColorSpaceName;
- case kLegacyCanvasColorSpace:
- return kLegacyCanvasColorSpaceName;
+ case kRec2020CanvasColorSpace:
+ return kRec2020CanvasColorSpaceName;
+ case kP3CanvasColorSpace:
+ return kP3CanvasColorSpaceName;
};
CHECK(false);
return "";
}
sk_sp<SkColorSpace> CanvasRenderingContext::skColorSpace() const {
+ if (!RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled() ||
+ !RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) {
+ return nullptr;
+ }
switch (m_colorSpace) {
+ case kLegacyCanvasColorSpace:
+ // Legacy colorspace ensures color matching with CSS is preserved.
+ // So if CSS is color corrected from sRGB to display space, then
+ // canvas must do the same
+ return SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named);
case kSRGBCanvasColorSpace:
return SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named);
case kLinearRGBCanvasColorSpace:
return SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named);
- case kLegacyCanvasColorSpace:
- if (RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) {
- // Legacy colorspace ensures color matching with CSS is preserved.
- // So if CSS is color corrected from sRGB to display space, then
- // canvas must do the same
- return SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named);
- }
- return nullptr;
+ case kRec2020CanvasColorSpace: {
+ // TODO(zakerinasab): Replace this with proper constructor from Skia
+ // when it is provided.
+ // https://en.wikipedia.org/wiki/Rec._2020
+ SkColorSpacePrimaries kPrimaries = {0.708, 0.292, 0.170, 0.797,
+ 0.131, 0.046, 0.3127, 0.3290};
+ SkMatrix44 kToXYZD50;
+ if (!kPrimaries.toXYZD50(&kToXYZD50))
+ return nullptr;
+ return SkColorSpace::MakeRGB(
+ SkColorSpace::RenderTargetGamma::kLinear_RenderTargetGamma,
+ kToXYZD50);
+ }
+ case kP3CanvasColorSpace: {
+ // TODO(zakerinasab): Replace this with proper constructor from Skia
+ // when it is provided.
+ // https://en.wikipedia.org/wiki/DCI-P3
+ SkColorSpacePrimaries kPrimaries = {0.680, 0.320, 0.265, 0.690,
+ 0.150, 0.060, 0.3127, 0.3290};
+ SkMatrix44 kToXYZD50;
+ if (!kPrimaries.toXYZD50(&kToXYZD50))
+ return nullptr;
+ return SkColorSpace::MakeRGB(
+ SkColorSpace::RenderTargetGamma::kLinear_RenderTargetGamma,
+ kToXYZD50);
+ }
};
CHECK(false);
return nullptr;
@@ -101,6 +138,8 @@ ColorBehavior CanvasRenderingContext::colorBehaviorForMediaDrawnToCanvas()
SkColorType CanvasRenderingContext::colorType() const {
switch (m_colorSpace) {
case kLinearRGBCanvasColorSpace:
+ case kRec2020CanvasColorSpace:
+ case kP3CanvasColorSpace:
return kRGBA_F16_SkColorType;
default:
return kN32_SkColorType;

Powered by Google App Engine
This is Rietveld 408576698