| 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 099ed9080c084be9c1987ce7a1e9d5a4746a0cb6..69ffa190b2c8e54a756886d1f640920dc23d2686 100644
|
| --- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
|
| +++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
|
| @@ -931,9 +931,10 @@ class UnacceleratedSurfaceFactory
|
| virtual std::unique_ptr<ImageBufferSurface> createSurface(
|
| const IntSize& size,
|
| OpacityMode opacityMode,
|
| - sk_sp<SkColorSpace> colorSpace) {
|
| + sk_sp<SkColorSpace> colorSpace,
|
| + SkColorType colorType) {
|
| return wrapUnique(new UnacceleratedImageBufferSurface(
|
| - size, opacityMode, InitializeImagePixels, colorSpace));
|
| + size, opacityMode, InitializeImagePixels, colorSpace, colorType));
|
| }
|
|
|
| virtual ~UnacceleratedSurfaceFactory() {}
|
| @@ -950,16 +951,15 @@ bool HTMLCanvasElement::shouldUseDisplayList(const IntSize& deviceSize) {
|
| }
|
|
|
| std::unique_ptr<ImageBufferSurface>
|
| -HTMLCanvasElement::createWebGLImageBufferSurface(
|
| - const IntSize& deviceSize,
|
| - OpacityMode opacityMode,
|
| - sk_sp<SkColorSpace> colorSpace) {
|
| +HTMLCanvasElement::createWebGLImageBufferSurface(const IntSize& deviceSize,
|
| + OpacityMode opacityMode) {
|
| DCHECK(is3D());
|
| // 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.
|
| auto surface = wrapUnique(new AcceleratedImageBufferSurface(
|
| - deviceSize, opacityMode, std::move(colorSpace)));
|
| + deviceSize, opacityMode, m_context->skColorSpace(),
|
| + m_context->colorType()));
|
| if (surface->isValid())
|
| return std::move(surface);
|
| return nullptr;
|
| @@ -969,7 +969,6 @@ std::unique_ptr<ImageBufferSurface>
|
| HTMLCanvasElement::createAcceleratedImageBufferSurface(
|
| const IntSize& deviceSize,
|
| OpacityMode opacityMode,
|
| - sk_sp<SkColorSpace> colorSpace,
|
| int* msaaSampleCount) {
|
| if (!shouldAccelerate(deviceSize))
|
| return nullptr;
|
| @@ -994,7 +993,8 @@ HTMLCanvasElement::createAcceleratedImageBufferSurface(
|
| std::unique_ptr<ImageBufferSurface> surface =
|
| wrapUnique(new Canvas2DImageBufferSurface(
|
| std::move(contextProvider), deviceSize, *msaaSampleCount, opacityMode,
|
| - Canvas2DLayerBridge::EnableAcceleration, std::move(colorSpace)));
|
| + Canvas2DLayerBridge::EnableAcceleration, m_context->skColorSpace(),
|
| + m_context->colorType()));
|
| if (!surface->isValid()) {
|
| CanvasMetrics::countCanvasContextUsage(
|
| CanvasMetrics::GPUAccelerated2DCanvasImageBufferCreationFailed);
|
| @@ -1009,12 +1009,11 @@ HTMLCanvasElement::createAcceleratedImageBufferSurface(
|
| std::unique_ptr<ImageBufferSurface>
|
| HTMLCanvasElement::createUnacceleratedImageBufferSurface(
|
| const IntSize& deviceSize,
|
| - OpacityMode opacityMode,
|
| - sk_sp<SkColorSpace> colorSpace) {
|
| + OpacityMode opacityMode) {
|
| if (shouldUseDisplayList(deviceSize)) {
|
| auto surface = wrapUnique(new RecordingImageBufferSurface(
|
| deviceSize, wrapUnique(new UnacceleratedSurfaceFactory), opacityMode,
|
| - colorSpace));
|
| + m_context->skColorSpace(), m_context->colorType()));
|
| if (surface->isValid()) {
|
| CanvasMetrics::countCanvasContextUsage(
|
| CanvasMetrics::DisplayList2DCanvasImageBufferCreated);
|
| @@ -1026,7 +1025,8 @@ HTMLCanvasElement::createUnacceleratedImageBufferSurface(
|
|
|
| auto surfaceFactory = wrapUnique(new UnacceleratedSurfaceFactory());
|
| auto surface = surfaceFactory->createSurface(deviceSize, opacityMode,
|
| - std::move(colorSpace));
|
| + m_context->skColorSpace(),
|
| + m_context->colorType());
|
| if (surface->isValid()) {
|
| CanvasMetrics::countCanvasContextUsage(
|
| CanvasMetrics::Unaccelerated2DCanvasImageBufferCreated);
|
| @@ -1063,14 +1063,13 @@ void HTMLCanvasElement::createImageBufferInternal(
|
| if (externalSurface->isValid())
|
| surface = std::move(externalSurface);
|
| } else if (is3D()) {
|
| - surface = createWebGLImageBufferSurface(size(), opacityMode,
|
| - m_context->skColorSpace());
|
| + surface = createWebGLImageBufferSurface(size(), opacityMode);
|
| } else {
|
| - surface = createAcceleratedImageBufferSurface(
|
| - size(), opacityMode, m_context->skColorSpace(), &msaaSampleCount);
|
| - if (!surface)
|
| - surface = createUnacceleratedImageBufferSurface(
|
| - size(), opacityMode, m_context->skColorSpace());
|
| + surface = createAcceleratedImageBufferSurface(size(), opacityMode,
|
| + &msaaSampleCount);
|
| + if (!surface) {
|
| + surface = createUnacceleratedImageBufferSurface(size(), opacityMode);
|
| + }
|
| }
|
| if (!surface)
|
| return;
|
|
|