Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(550)

Unified Diff: Source/core/html/HTMLCanvasElement.cpp

Issue 749653002: WebGL: clarify which Front or Back buffer is used by each API. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Address nits Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698