Chromium Code Reviews| Index: third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp |
| diff --git a/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp b/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp |
| index 581ef40acf18ab343ba51e8eef7d3fcbd696f578..d0cade0c34f97efa531d4ca11464e8b9d923ed2b 100644 |
| --- a/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp |
| +++ b/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp |
| @@ -38,6 +38,7 @@ |
| #include "platform/graphics/ExpensiveCanvasHeuristicParameters.h" |
| #include "platform/graphics/GraphicsContext.h" |
| #include "platform/graphics/ImageBufferClient.h" |
| +#include "platform/graphics/RecordingImageBufferSurface.h" |
| #include "platform/graphics/StaticBitmapImage.h" |
| #include "platform/graphics/UnacceleratedImageBufferSurface.h" |
| #include "platform/graphics/gpu/DrawingBuffer.h" |
| @@ -80,7 +81,8 @@ std::unique_ptr<ImageBuffer> ImageBuffer::create(const IntSize& size, OpacityMod |
| } |
| ImageBuffer::ImageBuffer(std::unique_ptr<ImageBufferSurface> surface) |
| - : m_snapshotState(InitialSnapshotState) |
| + : m_weakPtrFactory(this) |
| + , m_snapshotState(InitialSnapshotState) |
| , m_surface(std::move(surface)) |
| , m_client(0) |
| , m_gpuMemoryUsage(0) |
| @@ -400,6 +402,33 @@ void ImageBuffer::updateGPUMemoryUsage() const |
| } |
| } |
| +class RecordingSurfaceFactory : public RecordingImageBufferFallbackSurfaceFactory { |
|
Stephen White
2016/07/14 18:53:05
As discussed, rename to UnacceleratedSurfaceFactor
sebastienlc
2016/07/14 22:26:53
Done.
|
| +public: |
| + virtual std::unique_ptr<ImageBufferSurface> createSurface(const IntSize& size, OpacityMode opacityMode) |
| + { |
| + return wrapUnique(new UnacceleratedImageBufferSurface(size, opacityMode)); |
| + } |
| + |
| + virtual ~RecordingSurfaceFactory() { } |
| +}; |
| + |
| +void ImageBuffer::disableAcceleration() |
| +{ |
| + // Get current frame. |
| + SkImage* image = m_surface->newImageSnapshot(PreferNoAcceleration, SnapshotReasonPaint).get(); |
| + |
| + // Create and configure a recording (unaccelerated) surface. |
| + std::unique_ptr<RecordingImageBufferFallbackSurfaceFactory> surfaceFactory = wrapUnique(new RecordingSurfaceFactory()); |
| + std::unique_ptr<ImageBufferSurface> surface = wrapUnique(new RecordingImageBufferSurface(m_surface->size(), std::move(surfaceFactory), m_surface->getOpacityMode())); |
| + surface->canvas()->drawImage(image, 0, 0); |
| + surface->setImageBuffer(this); |
| + |
| + // Replace the current surface with the new surface. |
| + m_surface = std::move(surface); |
| + |
| + didDisableAcceleration(); |
| +} |
| + |
| bool ImageDataBuffer::encodeImage(const String& mimeType, const double& quality, Vector<unsigned char>* encodedImage) const |
| { |
| if (mimeType == "image/jpeg") { |