| Index: third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp | 
| diff --git a/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp b/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp | 
| index c94e05c81040f6398d1c29b041800fc63abdf881..ebd8677aa0f0974de3f7cdf621489e95a648d402 100644 | 
| --- a/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp | 
| +++ b/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp | 
| @@ -18,6 +18,8 @@ | 
| #include "platform/graphics/ImageBuffer.h" | 
| #include "platform/graphics/OffscreenCanvasFrameDispatcherImpl.h" | 
| #include "platform/graphics/StaticBitmapImage.h" | 
| +#include "platform/graphics/UnacceleratedImageBufferSurface.h" | 
| +#include "platform/graphics/gpu/AcceleratedImageBufferSurface.h" | 
| #include "platform/image-encoders/ImageEncoderUtils.h" | 
| #include "platform/instrumentation/tracing/TraceEvent.h" | 
| #include "platform/wtf/MathExtras.h" | 
| @@ -109,7 +111,7 @@ PassRefPtr<Image> OffscreenCanvas::GetSourceImageForCanvas( | 
| SourceImageStatus* status, | 
| AccelerationHint hint, | 
| SnapshotReason reason, | 
| -    const FloatSize& size) const { | 
| +    const FloatSize& size) { | 
| if (!context_) { | 
| *status = kInvalidSourceImageStatus; | 
| sk_sp<SkSurface> surface = | 
| @@ -237,6 +239,38 @@ OffscreenCanvasFrameDispatcher* OffscreenCanvas::GetOrCreateFrameDispatcher() { | 
| return frame_dispatcher_.get(); | 
| } | 
|  | 
| +void OffscreenCanvas::DiscardImageBuffer() { | 
| +  image_buffer_.reset(); | 
| +  needs_matrix_clip_restore_ = true; | 
| +} | 
| + | 
| +ImageBuffer* OffscreenCanvas::GetOrCreateImageBuffer() { | 
| +  if (!image_buffer_) { | 
| +    IntSize surface_size(width(), height()); | 
| +    OpacityMode opacity_mode = | 
| +        context_->CreationAttributes().hasAlpha() ? kNonOpaque : kOpaque; | 
| +    std::unique_ptr<ImageBufferSurface> surface; | 
| +    if (RuntimeEnabledFeatures::accelerated2dCanvasEnabled()) { | 
| +      surface.reset( | 
| +          new AcceleratedImageBufferSurface(surface_size, opacity_mode)); | 
| +    } | 
| + | 
| +    if (!surface || !surface->IsValid()) { | 
| +      surface.reset(new UnacceleratedImageBufferSurface( | 
| +          surface_size, opacity_mode, kInitializeImagePixels)); | 
| +    } | 
| + | 
| +    image_buffer_ = ImageBuffer::Create(std::move(surface)); | 
| + | 
| +    if (needs_matrix_clip_restore_) { | 
| +      needs_matrix_clip_restore_ = false; | 
| +      context_->RestoreCanvasMatrixClipStack(image_buffer_->Canvas()); | 
| +    } | 
| +  } | 
| + | 
| +  return image_buffer_.get(); | 
| +} | 
| + | 
| ScriptPromise OffscreenCanvas::Commit(RefPtr<StaticBitmapImage> image, | 
| bool is_web_gl_software_rendering, | 
| ScriptState* script_state, | 
|  |