Chromium Code Reviews| 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(); |
| } |