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

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

Issue 750273003: canvas: calling toDataURL without context doesn't create a buffer of canvas 2d. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: fix typo 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
« no previous file with comments | « LayoutTests/fast/canvas/webgl/resources/draw-webgl-to-canvas-2d.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/html/HTMLCanvasElement.cpp
diff --git a/Source/core/html/HTMLCanvasElement.cpp b/Source/core/html/HTMLCanvasElement.cpp
index 0c2e016f5a37b52b713efadfedaaa698a737ddc0..4194576bfe663da40695f117babccc4487846fb2 100644
--- a/Source/core/html/HTMLCanvasElement.cpp
+++ b/Source/core/html/HTMLCanvasElement.cpp
@@ -62,17 +62,32 @@ 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.
+
+bool canCreateImageBuffer(const IntSize& deviceSize)
+{
+ if (deviceSize.width() * deviceSize.height() > MaxCanvasArea)
+ return false;
+ if (deviceSize.width() > MaxSkiaDim || deviceSize.height() > MaxSkiaDim)
+ return false;
+ if (!deviceSize.width() || !deviceSize.height())
+ return false;
+ return true;
+}
+
+} // namespace
DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(CanvasObserver);
@@ -395,10 +410,14 @@ const AtomicString HTMLCanvasElement::imageSourceURL() const
String HTMLCanvasElement::toDataURLInternal(const String& mimeType, const double* quality, bool isSaving) const
{
- if (m_size.isEmpty() || !buffer())
+ if (m_size.isEmpty() || !canCreateImageBuffer(size()))
return String("data:,");
String encodingMimeType = toEncodingMimeType(mimeType);
+ if (!m_context) {
+ RefPtrWillBeRawPtr<ImageData> imageData = ImageData::create(m_size);
Noel Gordon 2015/01/06 10:43:58 /me poking around here because ... Cluster fuzz p
dshwang 2015/01/06 11:55:56 thx for noting.
+ return ImageDataToDataURL(ImageDataBuffer(imageData->size(), imageData->data()), encodingMimeType, quality);
+ }
// Try to get ImageData first, as that may avoid lossy conversions.
RefPtrWillBeRawPtr<ImageData> imageData = getImageData();
@@ -406,7 +425,7 @@ String HTMLCanvasElement::toDataURLInternal(const String& mimeType, const double
if (imageData)
return ImageDataToDataURL(ImageDataBuffer(imageData->size(), imageData->data()), encodingMimeType, quality);
- if (m_context && m_context->is3d()) {
+ if (m_context->is3d()) {
m_context->paintRenderingResultsToCanvas(isSaving ? CanvasRenderingContext::Front : CanvasRenderingContext::Back);
}
@@ -556,18 +575,11 @@ void HTMLCanvasElement::createImageBufferInternal()
m_didFailToCreateImageBuffer = true;
m_imageBufferIsClear = true;
- IntSize deviceSize = size();
- if (deviceSize.width() * deviceSize.height() > MaxCanvasArea)
- return;
-
- if (deviceSize.width() > MaxSkiaDim || deviceSize.height() > MaxSkiaDim)
- return;
-
- if (!deviceSize.width() || !deviceSize.height())
+ if (!canCreateImageBuffer(size()))
return;
int msaaSampleCount;
- OwnPtr<ImageBufferSurface> surface = createImageBufferSurface(deviceSize, &msaaSampleCount);
+ OwnPtr<ImageBufferSurface> surface = createImageBufferSurface(size(), &msaaSampleCount);
if (!surface->isValid())
return;
« no previous file with comments | « LayoutTests/fast/canvas/webgl/resources/draw-webgl-to-canvas-2d.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698