| Index: third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
|
| diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
|
| index 9b76d81154ffca54ad38e1ee1334b1b386e07d0d..0a544fa3f6a7d45e7721e441dafffc94c6124d37 100644
|
| --- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
|
| +++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
|
| @@ -818,9 +818,9 @@ bool HTMLCanvasElement::shouldAccelerate(const IntSize& size) const
|
|
|
| class UnacceleratedSurfaceFactory : public RecordingImageBufferFallbackSurfaceFactory {
|
| public:
|
| - virtual std::unique_ptr<ImageBufferSurface> createSurface(const IntSize& size, OpacityMode opacityMode)
|
| + virtual std::unique_ptr<ImageBufferSurface> createSurface(const IntSize& size, OpacityMode opacityMode, sk_sp<SkColorSpace> colorSpace)
|
| {
|
| - return wrapUnique(new UnacceleratedImageBufferSurface(size, opacityMode));
|
| + return wrapUnique(new UnacceleratedImageBufferSurface(size, opacityMode, InitializeImagePixels, colorSpace));
|
| }
|
|
|
| virtual ~UnacceleratedSurfaceFactory() { }
|
| @@ -837,7 +837,7 @@ bool HTMLCanvasElement::shouldUseDisplayList(const IntSize& deviceSize)
|
| return true;
|
| }
|
|
|
| -std::unique_ptr<ImageBufferSurface> HTMLCanvasElement::createImageBufferSurface(const IntSize& deviceSize, int* msaaSampleCount)
|
| +std::unique_ptr<ImageBufferSurface> HTMLCanvasElement::createImageBufferSurface(const IntSize& deviceSize, int* msaaSampleCount, sk_sp<SkColorSpace> colorSpace)
|
| {
|
| OpacityMode opacityMode = !m_context || m_context->hasAlpha() ? NonOpaque : Opaque;
|
|
|
| @@ -846,13 +846,13 @@ std::unique_ptr<ImageBufferSurface> HTMLCanvasElement::createImageBufferSurface(
|
| // If 3d, but the use of the canvas will be for non-accelerated content
|
| // then make a non-accelerated ImageBuffer. This means copying the internal
|
| // Image will require a pixel readback, but that is unavoidable in this case.
|
| - return wrapUnique(new AcceleratedImageBufferSurface(deviceSize, opacityMode));
|
| + return wrapUnique(new AcceleratedImageBufferSurface(deviceSize, opacityMode, colorSpace));
|
| }
|
|
|
| if (shouldAccelerate(deviceSize)) {
|
| if (document().settings())
|
| *msaaSampleCount = document().settings()->accelerated2dCanvasMSAASampleCount();
|
| - std::unique_ptr<ImageBufferSurface> surface = wrapUnique(new Canvas2DImageBufferSurface(deviceSize, *msaaSampleCount, opacityMode, Canvas2DLayerBridge::EnableAcceleration));
|
| + std::unique_ptr<ImageBufferSurface> surface = wrapUnique(new Canvas2DImageBufferSurface(deviceSize, *msaaSampleCount, opacityMode, Canvas2DLayerBridge::EnableAcceleration, colorSpace));
|
| if (surface->isValid()) {
|
| CanvasMetrics::countCanvasContextUsage(CanvasMetrics::GPUAccelerated2DCanvasImageBufferCreated);
|
| return surface;
|
| @@ -863,14 +863,14 @@ std::unique_ptr<ImageBufferSurface> HTMLCanvasElement::createImageBufferSurface(
|
| std::unique_ptr<RecordingImageBufferFallbackSurfaceFactory> surfaceFactory = wrapUnique(new UnacceleratedSurfaceFactory());
|
|
|
| if (shouldUseDisplayList(deviceSize)) {
|
| - std::unique_ptr<ImageBufferSurface> surface = wrapUnique(new RecordingImageBufferSurface(deviceSize, std::move(surfaceFactory), opacityMode));
|
| + std::unique_ptr<ImageBufferSurface> surface = wrapUnique(new RecordingImageBufferSurface(deviceSize, std::move(surfaceFactory), opacityMode, colorSpace));
|
| if (surface->isValid()) {
|
| CanvasMetrics::countCanvasContextUsage(CanvasMetrics::DisplayList2DCanvasImageBufferCreated);
|
| return surface;
|
| }
|
| surfaceFactory = wrapUnique(new UnacceleratedSurfaceFactory()); // recreate because previous one was released
|
| }
|
| - auto surface = surfaceFactory->createSurface(deviceSize, opacityMode);
|
| + auto surface = surfaceFactory->createSurface(deviceSize, opacityMode, colorSpace);
|
| if (!surface->isValid()) {
|
| CanvasMetrics::countCanvasContextUsage(CanvasMetrics::Unaccelerated2DCanvasImageBufferCreationFailed);
|
| } else {
|
| @@ -901,7 +901,7 @@ void HTMLCanvasElement::createImageBufferInternal(std::unique_ptr<ImageBufferSur
|
| if (externalSurface) {
|
| surface = std::move(externalSurface);
|
| } else {
|
| - surface = createImageBufferSurface(size(), &msaaSampleCount);
|
| + surface = createImageBufferSurface(size(), &msaaSampleCount, m_context->skColorSpace());
|
| }
|
| m_imageBuffer = ImageBuffer::create(std::move(surface));
|
| if (!m_imageBuffer)
|
|
|