Index: third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp |
diff --git a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp |
index 769e0a20e143c3f7ff006a1028efb586ea801771..9b0b81c7e8ca9629aca5eb9813020d7ca062c018 100644 |
--- a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp |
+++ b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp |
@@ -5,7 +5,10 @@ |
#include "modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.h" |
#include "bindings/modules/v8/UnionTypesModules.h" |
+#include "core/frame/ImageBitmap.h" |
#include "platform/NotImplemented.h" |
+#include "platform/graphics/ImageBuffer.h" |
+#include "platform/graphics/StaticBitmapImage.h" |
#include "wtf/Assertions.h" |
#define UNIMPLEMENTED ASSERT_NOT_REACHED |
@@ -31,13 +34,12 @@ DEFINE_TRACE(OffscreenCanvasRenderingContext2D) |
// BaseRenderingContext2D implementation |
bool OffscreenCanvasRenderingContext2D::originClean() const |
{ |
- notImplemented(); |
- return true; |
+ return m_originClean; |
} |
void OffscreenCanvasRenderingContext2D::setOriginTainted() |
{ |
- notImplemented(); |
+ m_originClean = false; |
} |
bool OffscreenCanvasRenderingContext2D::wouldTaintOrigin(CanvasImageSource* source) |
@@ -48,80 +50,101 @@ bool OffscreenCanvasRenderingContext2D::wouldTaintOrigin(CanvasImageSource* sour |
int OffscreenCanvasRenderingContext2D::width() const |
{ |
- return getOffscreenCanvas()->height(); |
+ return getOffscreenCanvas()->width(); |
} |
int OffscreenCanvasRenderingContext2D::height() const |
{ |
- return getOffscreenCanvas()->width(); |
+ return getOffscreenCanvas()->height(); |
} |
bool OffscreenCanvasRenderingContext2D::hasImageBuffer() const |
{ |
- notImplemented(); |
- return false; |
+ return !!m_imageBuffer; |
} |
ImageBuffer* OffscreenCanvasRenderingContext2D::imageBuffer() const |
{ |
- notImplemented(); |
- return nullptr; |
+ if (!m_imageBuffer) { |
+ // TODO: crbug.com/593514 Add support for GPU rendering |
+ OffscreenCanvasRenderingContext2D* nonConstThis = const_cast<OffscreenCanvasRenderingContext2D*>(this); |
+ nonConstThis->m_imageBuffer = ImageBuffer::create(IntSize(width(), height()), m_hasAlpha ? NonOpaque : Opaque, InitializeImagePixels); |
+ // TODO: crbug.com/593349 Restore matrix and clip state on the new ImageBuffer. |
+ } |
+ |
+ return m_imageBuffer.get(); |
} |
-bool OffscreenCanvasRenderingContext2D::parseColorOrCurrentColor(Color&, const String& colorString) const |
+PassRefPtrWillBeRawPtr<ImageBitmap> OffscreenCanvasRenderingContext2D::transferToImageBitmap(ExceptionState& exceptionState) |
{ |
- notImplemented(); |
- return false; |
+ if (!imageBuffer()) |
+ return nullptr; |
+ // TODO: crbug.com/593514 Add support for GPU rendering |
+ RefPtr<SkImage> skImage = m_imageBuffer->newSkImageSnapshot(PreferNoAcceleration, SnapshotReasonUnknown); |
+ RefPtr<StaticBitmapImage> image = StaticBitmapImage::create(skImage.release()); |
+ m_imageBuffer.clear(); // "Transfer" means no retained buffer |
+ return ImageBitmap::create(image.release()); |
+} |
+ |
+bool OffscreenCanvasRenderingContext2D::parseColorOrCurrentColor(Color& color, const String& colorString) const |
+{ |
+ return ::blink::parseColorOrCurrentColor(color, colorString, nullptr); |
} |
SkCanvas* OffscreenCanvasRenderingContext2D::drawingCanvas() const |
{ |
- notImplemented(); |
- return nullptr; |
+ ImageBuffer* buffer = imageBuffer(); |
+ if (!buffer) |
+ return nullptr; |
+ return imageBuffer()->canvas(); |
} |
SkCanvas* OffscreenCanvasRenderingContext2D::existingDrawingCanvas() const |
{ |
- notImplemented(); |
- return nullptr; |
+ if (!m_imageBuffer) |
+ return nullptr; |
+ return m_imageBuffer->canvas(); |
} |
void OffscreenCanvasRenderingContext2D::disableDeferral(DisableDeferralReason) |
-{ |
- notImplemented(); |
-} |
+{ } |
AffineTransform OffscreenCanvasRenderingContext2D::baseTransform() const |
{ |
- notImplemented(); |
- return 0; |
+ if (!m_imageBuffer) |
+ return AffineTransform(); // identity |
+ return m_imageBuffer->baseTransform(); |
} |
void OffscreenCanvasRenderingContext2D::didDraw(const SkIRect& dirtyRect) |
-{ |
- notImplemented(); |
-} |
+{ } |
bool OffscreenCanvasRenderingContext2D::stateHasFilter() |
{ |
- notImplemented(); |
+ // TODO: crbug.com/593838 make hasFilter accept nullptr |
+ // return state().hasFilter(nullptr, nullptr, IntSize(width(), height()), this); |
return false; |
} |
SkImageFilter* OffscreenCanvasRenderingContext2D::stateGetFilter() |
{ |
- notImplemented(); |
+ // TODO: make getFilter accept nullptr |
+ // return state().getFilter(nullptr, nullptr, IntSize(width(), height()), this); |
return nullptr; |
} |
void OffscreenCanvasRenderingContext2D::validateStateStack() |
{ |
- notImplemented(); |
+#if ENABLE(ASSERT) |
+ SkCanvas* skCanvas = existingDrawingCanvas(); |
+ if (skCanvas) { |
+ ASSERT(static_cast<size_t>(skCanvas->getSaveCount()) == m_stateStack.size()); |
+ } |
+#endif |
} |
bool OffscreenCanvasRenderingContext2D::isContextLost() const |
{ |
- notImplemented(); |
return false; |
} |