Index: Source/core/html/HTMLCanvasElement.cpp |
diff --git a/Source/core/html/HTMLCanvasElement.cpp b/Source/core/html/HTMLCanvasElement.cpp |
index ee5bd175465dce5115e97674feaae44f0317a9c8..46163224afe2ee71e0502a50d2ade75f47efeb66 100644 |
--- a/Source/core/html/HTMLCanvasElement.cpp |
+++ b/Source/core/html/HTMLCanvasElement.cpp |
@@ -62,17 +62,26 @@ namespace blink { |
using namespace HTMLNames; |
+namespace { |
+ |
// These values come from the WhatWG spec. |
-static const int DefaultWidth = 300; |
-static const int DefaultHeight = 150; |
+const int DefaultWidth = 300; |
+const int DefaultHeight = 150; |
// Firefox limits width/height to 32767 pixels, but slows down dramatically before it |
// reaches that limit. We limit by area instead, giving us larger maximum dimensions, |
// in exchange for a smaller maximum canvas size. |
-static const int MaxCanvasArea = 32768 * 8192; // Maximum canvas area in CSS pixels |
+const int MaxCanvasArea = 32768 * 8192; // Maximum canvas area in CSS pixels |
//In Skia, we will also limit width/height to 32767. |
-static const int MaxSkiaDim = 32767; // Maximum width/height in CSS pixels. |
+const int MaxSkiaDim = 32767; // Maximum width/height in CSS pixels. |
+ |
+CanvasRenderingContext::SourceBuffer convertSourceBuffer(HTMLCanvasElement::SourceBuffer sourceBuffer) |
+{ |
+ return static_cast<CanvasRenderingContext::SourceBuffer>(sourceBuffer); |
+} |
+ |
+} // namespace |
DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(CanvasObserver); |
@@ -387,24 +396,24 @@ String HTMLCanvasElement::toEncodingMimeType(const String& mimeType) |
const AtomicString HTMLCanvasElement::imageSourceURL() const |
{ |
- return AtomicString(toDataURLInternal("image/png", 0, true)); |
+ return AtomicString(toDataURLInternal("image/png", 0, Front)); |
} |
-String HTMLCanvasElement::toDataURLInternal(const String& mimeType, const double* quality, bool isSaving) const |
+String HTMLCanvasElement::toDataURLInternal(const String& mimeType, const double* quality, SourceBuffer sourceBuffer) const |
{ |
- if (m_size.isEmpty() || !buffer()) |
+ if (m_size.isEmpty() || !buffer() || !m_context) |
dshwang
2014/11/22 19:32:18
I changed a behavior of toDataURL without context.
|
return String("data:,"); |
String encodingMimeType = toEncodingMimeType(mimeType); |
- // Try to get ImageData first, as that may avoid lossy conversions. |
- RefPtrWillBeRawPtr<ImageData> imageData = getImageData(); |
dshwang
2014/11/21 09:05:40
getImageData() is implemented by only webgl, so I
|
- |
- if (imageData) |
- return ImageDataToDataURL(ImageDataBuffer(imageData->size(), imageData->data()), encodingMimeType, quality); |
- |
- if (m_context && m_context->is3d()) { |
- m_context->paintRenderingResultsToCanvas(isSaving ? CanvasRenderingContext::Front : CanvasRenderingContext::Back); |
+ if (m_context->is3d()) { |
+ // Get pure non-premultiplied data because of inaccurate premultiplied alpha conversion of buffer()->toDataURL(). |
+ RefPtrWillBeRawPtr<ImageData> imageData = |
+ toWebGLRenderingContext(m_context.get())->paintRenderingResultsToImageData(convertSourceBuffer(sourceBuffer)); |
+ // |imageData| is null when premultipliedAlpha == true. |
+ if (imageData) |
+ return ImageDataToDataURL(ImageDataBuffer(imageData->size(), imageData->data()), encodingMimeType, quality); |
+ m_context->paintRenderingResultsToCanvas(convertSourceBuffer(sourceBuffer)); |
} |
return buffer()->toDataURL(encodingMimeType, quality); |
@@ -417,14 +426,7 @@ String HTMLCanvasElement::toDataURL(const String& mimeType, const double* qualit |
return String(); |
} |
- return toDataURLInternal(mimeType, quality); |
-} |
- |
-PassRefPtrWillBeRawPtr<ImageData> HTMLCanvasElement::getImageData() const |
-{ |
- if (!m_context || !m_context->is3d()) |
- return nullptr; |
- return toWebGLRenderingContext(m_context.get())->paintRenderingResultsToImageData(); |
+ return toDataURLInternal(mimeType, quality, Back); |
} |
SecurityOrigin* HTMLCanvasElement::securityOrigin() const |
@@ -672,12 +674,11 @@ void HTMLCanvasElement::ensureUnacceleratedImageBuffer() |
m_didFailToCreateImageBuffer = !m_imageBuffer; |
} |
-Image* HTMLCanvasElement::copiedImage() const |
+Image* HTMLCanvasElement::copiedImage(SourceBuffer sourceBuffer) const |
{ |
if (!m_copiedImage && buffer()) { |
- if (m_context && m_context->is3d()) { |
- m_context->paintRenderingResultsToCanvas(CanvasRenderingContext::Front); |
- } |
+ if (m_context && m_context->is3d()) |
+ m_context->paintRenderingResultsToCanvas(convertSourceBuffer(sourceBuffer)); |
m_copiedImage = buffer()->copyImage(CopyBackingStore, Unscaled); |
updateExternallyAllocatedMemory(); |
} |