Index: Source/core/html/HTMLCanvasElement.cpp |
diff --git a/Source/core/html/HTMLCanvasElement.cpp b/Source/core/html/HTMLCanvasElement.cpp |
index a41bd5beb6c08ff3077a3349eed785e68b5293e3..a6b3d958f42631f5ebcfa7fbb1413c2180284ed3 100644 |
--- a/Source/core/html/HTMLCanvasElement.cpp |
+++ b/Source/core/html/HTMLCanvasElement.cpp |
@@ -463,28 +463,43 @@ const AtomicString HTMLCanvasElement::imageSourceURL() const |
return AtomicString(toDataURLInternal("image/png", 0, FrontBuffer)); |
} |
+ImageData* HTMLCanvasElement::toImageData(SourceDrawingBuffer sourceBuffer) const |
+{ |
+ ImageData* imageData; |
+ if (is3D()) { |
+ // Get non-premultiplied data because of inaccurate premultiplied alpha conversion of buffer()->toDataURL(). |
+ imageData = m_context->paintRenderingResultsToImageData(sourceBuffer); |
+ if (imageData) |
+ return imageData; |
+ |
+ m_context->paintRenderingResultsToCanvas(sourceBuffer); |
+ imageData = ImageData::create(m_size); |
+ SkImageInfo imageInfo = SkImageInfo::Make(width(), height(), kRGBA_8888_SkColorType, kUnpremul_SkAlphaType); |
+ buffer()->bitmap().readPixels(imageInfo, imageData->data()->data(), imageInfo.minRowBytes(), 0, 0); |
+ return imageData; |
+ } |
+ |
+ imageData = ImageData::create(m_size); |
+ |
+ if (m_context) { |
+ ASSERT(m_context->is2d()); |
+ SkImageInfo imageInfo = SkImageInfo::Make(width(), height(), kRGBA_8888_SkColorType, kUnpremul_SkAlphaType); |
+ buffer()->bitmap().readPixels(imageInfo, imageData->data()->data(), imageInfo.minRowBytes(), 0, 0); |
+ } |
+ return imageData; |
+} |
+ |
String HTMLCanvasElement::toDataURLInternal(const String& mimeType, const double* quality, SourceDrawingBuffer sourceBuffer) const |
{ |
if (!isPaintable()) |
return String("data:,"); |
String encodingMimeType = toEncodingMimeType(mimeType); |
- if (!m_context) { |
- ImageData* imageData = ImageData::create(m_size); |
- ScopedDisposal<ImageData> disposer(imageData); |
- return ImageDataBuffer(imageData->size(), imageData->data()->data()).toDataURL(encodingMimeType, quality); |
- } |
- if (m_context->is3d()) { |
- // Get non-premultiplied data because of inaccurate premultiplied alpha conversion of buffer()->toDataURL(). |
- ImageData* imageData = m_context->paintRenderingResultsToImageData(sourceBuffer); |
- ScopedDisposal<ImageData> disposer(imageData); |
- if (imageData) |
- return ImageDataBuffer(imageData->size(), imageData->data()->data()).toDataURL(encodingMimeType, quality); |
- m_context->paintRenderingResultsToCanvas(sourceBuffer); |
- } |
+ ImageData* imageData = toImageData(sourceBuffer); |
+ ScopedDisposal<ImageData> disposer(imageData); |
- return buffer()->toDataURL(encodingMimeType, quality); |
+ return ImageDataBuffer(imageData->size(), imageData->data()->data()).toDataURL(encodingMimeType, quality); |
} |
String HTMLCanvasElement::toDataURL(const String& mimeType, const ScriptValue& qualityArgument, ExceptionState& exceptionState) const |