| Index: Source/core/html/HTMLCanvasElement.cpp
|
| diff --git a/Source/core/html/HTMLCanvasElement.cpp b/Source/core/html/HTMLCanvasElement.cpp
|
| index 4194576bfe663da40695f117babccc4487846fb2..7bc778110214f91b55eb0f5bd5b810742368f521 100644
|
| --- a/Source/core/html/HTMLCanvasElement.cpp
|
| +++ b/Source/core/html/HTMLCanvasElement.cpp
|
| @@ -357,7 +357,7 @@ void HTMLCanvasElement::paint(GraphicsContext* context, const LayoutRect& r)
|
| if (m_context) {
|
| if (!paintsIntoCanvasBuffer() && !document().printing())
|
| return;
|
| - m_context->paintRenderingResultsToCanvas(CanvasRenderingContext::Front);
|
| + m_context->paintRenderingResultsToCanvas(FrontBuffer);
|
| }
|
|
|
| if (hasImageBuffer()) {
|
| @@ -405,10 +405,10 @@ String HTMLCanvasElement::toEncodingMimeType(const String& mimeType)
|
|
|
| const AtomicString HTMLCanvasElement::imageSourceURL() const
|
| {
|
| - return AtomicString(toDataURLInternal("image/png", 0, true));
|
| + return AtomicString(toDataURLInternal("image/png", 0, FrontBuffer));
|
| }
|
|
|
| -String HTMLCanvasElement::toDataURLInternal(const String& mimeType, const double* quality, bool isSaving) const
|
| +String HTMLCanvasElement::toDataURLInternal(const String& mimeType, const double* quality, SourceDrawingBuffer sourceBuffer) const
|
| {
|
| if (m_size.isEmpty() || !canCreateImageBuffer(size()))
|
| return String("data:,");
|
| @@ -419,14 +419,13 @@ String HTMLCanvasElement::toDataURLInternal(const String& mimeType, const double
|
| return ImageDataToDataURL(ImageDataBuffer(imageData->size(), imageData->data()), encodingMimeType, quality);
|
| }
|
|
|
| - // Try to get ImageData first, as that may avoid lossy conversions.
|
| - RefPtrWillBeRawPtr<ImageData> imageData = getImageData();
|
| -
|
| - if (imageData)
|
| - return ImageDataToDataURL(ImageDataBuffer(imageData->size(), imageData->data()), encodingMimeType, quality);
|
| -
|
| if (m_context->is3d()) {
|
| - m_context->paintRenderingResultsToCanvas(isSaving ? CanvasRenderingContext::Front : CanvasRenderingContext::Back);
|
| + // Get non-premultiplied data because of inaccurate premultiplied alpha conversion of buffer()->toDataURL().
|
| + RefPtrWillBeRawPtr<ImageData> imageData =
|
| + toWebGLRenderingContext(m_context.get())->paintRenderingResultsToImageData(sourceBuffer);
|
| + if (imageData)
|
| + return ImageDataToDataURL(ImageDataBuffer(imageData->size(), imageData->data()), encodingMimeType, quality);
|
| + m_context->paintRenderingResultsToCanvas(sourceBuffer);
|
| }
|
|
|
| return buffer()->toDataURL(encodingMimeType, quality);
|
| @@ -439,14 +438,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, BackBuffer);
|
| }
|
|
|
| SecurityOrigin* HTMLCanvasElement::securityOrigin() const
|
| @@ -687,12 +679,11 @@ void HTMLCanvasElement::ensureUnacceleratedImageBuffer()
|
| m_didFailToCreateImageBuffer = !m_imageBuffer;
|
| }
|
|
|
| -Image* HTMLCanvasElement::copiedImage() const
|
| +Image* HTMLCanvasElement::copiedImage(SourceDrawingBuffer 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(sourceBuffer);
|
| m_copiedImage = buffer()->copyImage(CopyBackingStore, Unscaled);
|
| updateExternallyAllocatedMemory();
|
| }
|
| @@ -759,7 +750,7 @@ PassRefPtr<Image> HTMLCanvasElement::getSourceImageForCanvas(SourceImageMode mod
|
| }
|
|
|
| if (m_context && m_context->is3d()) {
|
| - m_context->paintRenderingResultsToCanvas(CanvasRenderingContext::Back);
|
| + m_context->paintRenderingResultsToCanvas(BackBuffer);
|
| *status = ExternalSourceImageStatus;
|
|
|
| // can't create SkImage from WebGLImageBufferSurface (contains only SkBitmap)
|
|
|