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

Unified Diff: third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp

Issue 2212163002: Add some plumbing for the color management of canvases (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase again Created 4 years, 4 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/platform/graphics/Canvas2DLayerBridge.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
index 7e5da03a0c642ed733aba3070828fada5abb067f..4a0048c6f28f48e1abb46b7c278b5c5d87a9153f 100644
--- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
+++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
@@ -60,13 +60,13 @@ enum {
namespace blink {
-static PassRefPtr<SkSurface> createSkSurface(GrContext* gr, const IntSize& size, int msaaSampleCount, OpacityMode opacityMode, bool* surfaceIsAccelerated)
+static PassRefPtr<SkSurface> createSkSurface(GrContext* gr, const IntSize& size, int msaaSampleCount, OpacityMode opacityMode, sk_sp<SkColorSpace> colorSpace, bool* surfaceIsAccelerated)
{
if (gr)
gr->resetContext();
SkAlphaType alphaType = (Opaque == opacityMode) ? kOpaque_SkAlphaType : kPremul_SkAlphaType;
- SkImageInfo info = SkImageInfo::MakeN32(size.width(), size.height(), alphaType);
+ SkImageInfo info = SkImageInfo::MakeN32(size.width(), size.height(), alphaType, colorSpace);
SkSurfaceProps disableLCDProps(0, kUnknown_SkPixelGeometry);
sk_sp<SkSurface> surface;
@@ -90,7 +90,7 @@ static PassRefPtr<SkSurface> createSkSurface(GrContext* gr, const IntSize& size,
return fromSkSp(surface);
}
-Canvas2DLayerBridge::Canvas2DLayerBridge(std::unique_ptr<WebGraphicsContext3DProvider> contextProvider, const IntSize& size, int msaaSampleCount, OpacityMode opacityMode, AccelerationMode accelerationMode)
+Canvas2DLayerBridge::Canvas2DLayerBridge(std::unique_ptr<WebGraphicsContext3DProvider> contextProvider, const IntSize& size, int msaaSampleCount, OpacityMode opacityMode, AccelerationMode accelerationMode, sk_sp<SkColorSpace> colorSpace)
: m_contextProvider(std::move(contextProvider))
, m_logger(wrapUnique(new Logger))
, m_weakPtrFactory(this)
@@ -110,6 +110,7 @@ Canvas2DLayerBridge::Canvas2DLayerBridge(std::unique_ptr<WebGraphicsContext3DPro
, m_accelerationMode(accelerationMode)
, m_opacityMode(opacityMode)
, m_size(size)
+ , m_colorSpace(colorSpace)
{
DCHECK(m_contextProvider);
DCHECK(!m_contextProvider->isSoftwareRendering());
@@ -465,7 +466,7 @@ SkSurface* Canvas2DLayerBridge::getOrCreateSurface(AccelerationHint hint)
}
bool surfaceIsAccelerated;
- m_surface = createSkSurface(wantAcceleration ? m_contextProvider->grContext() : nullptr, m_size, m_msaaSampleCount, m_opacityMode, &surfaceIsAccelerated);
+ m_surface = createSkSurface(wantAcceleration ? m_contextProvider->grContext() : nullptr, m_size, m_msaaSampleCount, m_opacityMode, m_colorSpace, &surfaceIsAccelerated);
if (!m_surface)
reportSurfaceCreationFailure();
@@ -742,7 +743,7 @@ bool Canvas2DLayerBridge::restoreSurface()
if (sharedGL && sharedGL->GetGraphicsResetStatusKHR() == GL_NO_ERROR) {
GrContext* grCtx = m_contextProvider->grContext();
bool surfaceIsAccelerated;
- RefPtr<SkSurface> surface(createSkSurface(grCtx, m_size, m_msaaSampleCount, m_opacityMode, &surfaceIsAccelerated));
+ RefPtr<SkSurface> surface(createSkSurface(grCtx, m_size, m_msaaSampleCount, m_opacityMode, m_colorSpace, &surfaceIsAccelerated));
if (!m_surface)
reportSurfaceCreationFailure();
@@ -761,6 +762,31 @@ bool Canvas2DLayerBridge::restoreSurface()
return m_surface.get();
}
+static gfx::ColorSpace SkColorSpaceToColorSpace(const SkColorSpace* skColorSpace)
+{
+ // TODO(crbug.com/634102): Eliminate this clumsy conversion by unifying
+ // SkColorSpace and gfx::ColorSpace.
+ if (!skColorSpace)
+ return gfx::ColorSpace();
+
+ gfx::ColorSpace::TransferID transferID = gfx::ColorSpace::TransferID::UNSPECIFIED;
+ switch (skColorSpace->gammaNamed()) {
+ case SkColorSpace::kSRGB_GammaNamed:
+ transferID = gfx::ColorSpace::TransferID::IEC61966_2_1;
+ break;
+ case SkColorSpace::kLinear_GammaNamed:
+ transferID = gfx::ColorSpace::TransferID::LINEAR;
+ break;
+ default:
+ // TODO(crbug.com/634102): Not all curve type are supported
+ DCHECK(false);
+ }
+
+ // TODO(crbug.com/634102): No primary conversions are performed.
+ // Rec-709 is assumed.
+ return gfx::ColorSpace(gfx::ColorSpace::PrimaryID::BT709, transferID, gfx::ColorSpace::MatrixID::RGB, gfx::ColorSpace::RangeID::FULL);
+}
+
bool Canvas2DLayerBridge::PrepareTextureMailbox(
cc::TextureMailbox* outMailbox,
std::unique_ptr<cc::SingleReleaseCallback>* outReleaseCallback)
@@ -800,6 +826,8 @@ bool Canvas2DLayerBridge::PrepareTextureMailbox(
if (!prepareMailboxFromImage(image.release(), outMailbox))
return false;
outMailbox->set_nearest_neighbor(getGLFilter() == GL_NEAREST);
+ gfx::ColorSpace colorSpace = SkColorSpaceToColorSpace(m_colorSpace.get());
+ outMailbox->set_color_space(colorSpace);
auto func = WTF::bind(&Canvas2DLayerBridge::mailboxReleased,
m_weakPtrFactory.createWeakPtr(),

Powered by Google App Engine
This is Rietveld 408576698