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

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

Issue 2708403003: Implement canvas color space IDL format for 2D canvas (Closed)
Patch Set: Addressing GPU pixel test failures Created 3 years, 10 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 5db6d549ebb8dce8372800b6678c7c54e51b9c49..77bedfa4a87b0e00b44897391efa685335493fb5 100644
--- a/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp
@@ -33,10 +33,14 @@
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* kRec2020CanvasColorSpaceName = "rec2020";
constexpr const char* kP3CanvasColorSpaceName = "p3";
+constexpr const char* kRGBA8CanvasPixelFormatName = "8-8-8-8";
+constexpr const char* kRGB10A2CanvasPixelFormatName = "10-10-10-2";
+constexpr const char* kRGBA12CanvasPixelFormatName = "12-12-12-12";
+constexpr const char* kF16CanvasPixelFormatName = "float16";
+
namespace blink {
CanvasRenderingContext::CanvasRenderingContext(
@@ -46,22 +50,34 @@ CanvasRenderingContext::CanvasRenderingContext(
: m_canvas(canvas),
m_offscreenCanvas(offscreenCanvas),
m_colorSpace(kLegacyCanvasColorSpace),
+ m_pixelFormat(kRGBA8CanvasPixelFormat),
+ m_linearPixelMath(false),
m_creationAttributes(attrs) {
if (RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled() &&
RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) {
- if (m_creationAttributes.colorSpace() == kSRGBCanvasColorSpaceName)
- m_colorSpace = kSRGBCanvasColorSpace;
- else if (m_creationAttributes.colorSpace() ==
- kLinearRGBCanvasColorSpaceName)
- m_colorSpace = kLinearRGBCanvasColorSpace;
- else if (m_creationAttributes.colorSpace() == kRec2020CanvasColorSpaceName)
+ // Set the default color space to SRGB and continue
+ m_colorSpace = kSRGBCanvasColorSpace;
+ if (m_creationAttributes.colorSpace() == kRec2020CanvasColorSpaceName)
m_colorSpace = kRec2020CanvasColorSpace;
else if (m_creationAttributes.colorSpace() == kP3CanvasColorSpaceName)
m_colorSpace = kP3CanvasColorSpace;
+
+ // For now, we only support RGBA8 (for SRGB) and F16 (for all). Everything
+ // else falls back to SRGB + RGBA8.
+ if (m_creationAttributes.pixelFormat() == kF16CanvasPixelFormatName) {
+ m_pixelFormat = kF16CanvasPixelFormat;
+ m_linearPixelMath = true;
+ } else {
+ m_colorSpace = kSRGBCanvasColorSpace;
+ m_pixelFormat = kRGBA8CanvasPixelFormat;
+ }
}
- // Make m_creationAttributes reflect the effective colorSpace rather than the
- // requested one
+
+ // Make m_creationAttributes reflect the effective colorSpace, pixelFormat and
+ // linearPixelMath rather than the requested one.
m_creationAttributes.setColorSpace(colorSpaceAsString());
+ m_creationAttributes.setPixelFormat(pixelFormatAsString());
+ m_creationAttributes.setLinearPixelMath(linearPixelMath());
}
WTF::String CanvasRenderingContext::colorSpaceAsString() const {
@@ -70,8 +86,6 @@ WTF::String CanvasRenderingContext::colorSpaceAsString() const {
return kLegacyCanvasColorSpaceName;
case kSRGBCanvasColorSpace:
return kSRGBCanvasColorSpaceName;
- case kLinearRGBCanvasColorSpace:
- return kLinearRGBCanvasColorSpaceName;
case kRec2020CanvasColorSpace:
return kRec2020CanvasColorSpaceName;
case kP3CanvasColorSpace:
@@ -81,13 +95,29 @@ WTF::String CanvasRenderingContext::colorSpaceAsString() const {
return "";
}
+WTF::String CanvasRenderingContext::pixelFormatAsString() const {
+ switch (m_pixelFormat) {
+ case kRGBA8CanvasPixelFormat:
+ return kRGBA8CanvasPixelFormatName;
+ case kRGB10A2CanvasPixelFormat:
+ return kRGB10A2CanvasPixelFormatName;
+ case kRGBA12CanvasPixelFormat:
+ return kRGBA12CanvasPixelFormatName;
+ case kF16CanvasPixelFormat:
+ return kF16CanvasPixelFormatName;
+ };
+ CHECK(false);
+ return "";
+}
+
gfx::ColorSpace CanvasRenderingContext::gfxColorSpace() const {
switch (m_colorSpace) {
case kLegacyCanvasColorSpace:
+ return gfx::ColorSpace::CreateSRGB();
case kSRGBCanvasColorSpace:
+ if (m_pixelFormat == kF16CanvasPixelFormat)
+ return gfx::ColorSpace::CreateSCRGBLinear();
return gfx::ColorSpace::CreateSRGB();
- case kLinearRGBCanvasColorSpace:
- return gfx::ColorSpace::CreateSCRGBLinear();
case kRec2020CanvasColorSpace:
return gfx::ColorSpace(gfx::ColorSpace::PrimaryID::BT2020,
gfx::ColorSpace::TransferID::IEC61966_2_1);
@@ -117,14 +147,9 @@ ColorBehavior CanvasRenderingContext::colorBehaviorForMediaDrawnToCanvas()
}
SkColorType CanvasRenderingContext::colorType() const {
- switch (m_colorSpace) {
- case kLinearRGBCanvasColorSpace:
- case kRec2020CanvasColorSpace:
- case kP3CanvasColorSpace:
- return kRGBA_F16_SkColorType;
- default:
- return kN32_SkColorType;
- }
+ if (m_pixelFormat == kF16CanvasPixelFormat)
+ return kRGBA_F16_SkColorType;
+ return kN32_SkColorType;
}
void CanvasRenderingContext::dispose() {

Powered by Google App Engine
This is Rietveld 408576698