| Index: Source/core/html/HTMLCanvasElement.cpp
|
| diff --git a/Source/core/html/HTMLCanvasElement.cpp b/Source/core/html/HTMLCanvasElement.cpp
|
| index 85d444a1d1a0dd25a56f8204dedf14e0b354e1fa..4b2d2ccf9f32fded785b61365cd30cadedeed002 100644
|
| --- a/Source/core/html/HTMLCanvasElement.cpp
|
| +++ b/Source/core/html/HTMLCanvasElement.cpp
|
| @@ -74,7 +74,7 @@ HTMLCanvasElement::HTMLCanvasElement(Document& document)
|
| , m_externallyAllocatedMemory(0)
|
| , m_deviceScaleFactor(1)
|
| , m_originClean(true)
|
| - , m_hasCreatedImageBuffer(false)
|
| + , m_didFailToCreateImageBuffer(false)
|
| , m_didClearImageBuffer(false)
|
| {
|
| ScriptWrappable::init(this);
|
| @@ -231,7 +231,7 @@ void HTMLCanvasElement::reset()
|
| return;
|
|
|
| bool ok;
|
| - bool hadImageBuffer = hasCreatedImageBuffer();
|
| + bool hadImageBuffer = hasImageBuffer();
|
|
|
| int w = getAttribute(widthAttr).toInt(&ok);
|
| if (!ok || w < 0)
|
| @@ -258,7 +258,7 @@ void HTMLCanvasElement::reset()
|
|
|
| // If the size of an existing buffer matches, we can just clear it instead of reallocating.
|
| // This optimization is only done for 2D canvases for now.
|
| - if (m_hasCreatedImageBuffer && oldSize == newSize && m_deviceScaleFactor == newDeviceScaleFactor && m_context && m_context->is2d()) {
|
| + if (hadImageBuffer && oldSize == newSize && m_deviceScaleFactor == newDeviceScaleFactor && m_context && m_context->is2d()) {
|
| if (!m_didClearImageBuffer)
|
| clearImageBuffer();
|
| return;
|
| @@ -316,7 +316,7 @@ void HTMLCanvasElement::paint(GraphicsContext* context, const LayoutRect& r, boo
|
| m_context->paintRenderingResultsToCanvas();
|
| }
|
|
|
| - if (hasCreatedImageBuffer()) {
|
| + if (hasImageBuffer()) {
|
| ImageBuffer* imageBuffer = buffer();
|
| if (imageBuffer) {
|
| CompositeOperator compositeOperator = !m_context || m_context->hasAlpha() ? CompositeSourceOver : CompositeCopy;
|
| @@ -352,7 +352,7 @@ void HTMLCanvasElement::clearPresentationCopy()
|
| void HTMLCanvasElement::setSurfaceSize(const IntSize& size)
|
| {
|
| m_size = size;
|
| - m_hasCreatedImageBuffer = false;
|
| + m_didFailToCreateImageBuffer = false;
|
| m_contextStateSaver.clear();
|
| m_imageBuffer.clear();
|
| setExternallyAllocatedMemory(0);
|
| @@ -447,7 +447,7 @@ void HTMLCanvasElement::createImageBuffer()
|
| {
|
| ASSERT(!m_imageBuffer);
|
|
|
| - m_hasCreatedImageBuffer = true;
|
| + m_didFailToCreateImageBuffer = true;
|
| m_didClearImageBuffer = true;
|
|
|
| IntSize deviceSize = convertLogicalToDevice(size());
|
| @@ -468,6 +468,7 @@ void HTMLCanvasElement::createImageBuffer()
|
| m_imageBuffer = ImageBuffer::create(size(), m_deviceScaleFactor, renderingMode, opacityMode, msaaSampleCount);
|
| if (!m_imageBuffer)
|
| return;
|
| + m_didFailToCreateImageBuffer = false;
|
| setExternallyAllocatedMemory(4 * width() * height());
|
| m_imageBuffer->context()->setShouldClampToSourceRect(false);
|
| m_imageBuffer->context()->setImageInterpolationQuality(DefaultInterpolationQuality);
|
| @@ -500,15 +501,17 @@ GraphicsContext* HTMLCanvasElement::drawingContext() const
|
|
|
| GraphicsContext* HTMLCanvasElement::existingDrawingContext() const
|
| {
|
| - if (!m_hasCreatedImageBuffer)
|
| + if (m_didFailToCreateImageBuffer) {
|
| + ASSERT(!hasImageBuffer());
|
| return 0;
|
| + }
|
|
|
| return drawingContext();
|
| }
|
|
|
| ImageBuffer* HTMLCanvasElement::buffer() const
|
| {
|
| - if (!m_hasCreatedImageBuffer)
|
| + if (!hasImageBuffer() && !m_didFailToCreateImageBuffer)
|
| const_cast<HTMLCanvasElement*>(this)->createImageBuffer();
|
| return m_imageBuffer.get();
|
| }
|
| @@ -525,7 +528,7 @@ Image* HTMLCanvasElement::copiedImage() const
|
|
|
| void HTMLCanvasElement::clearImageBuffer()
|
| {
|
| - ASSERT(m_hasCreatedImageBuffer);
|
| + ASSERT(hasImageBuffer() && !m_didFailToCreateImageBuffer);
|
| ASSERT(!m_didClearImageBuffer);
|
| ASSERT(m_context);
|
|
|
| @@ -546,7 +549,7 @@ void HTMLCanvasElement::clearCopiedImage()
|
|
|
| AffineTransform HTMLCanvasElement::baseTransform() const
|
| {
|
| - ASSERT(m_hasCreatedImageBuffer);
|
| + ASSERT(hasImageBuffer() && !m_didFailToCreateImageBuffer);
|
| IntSize unscaledSize = size();
|
| IntSize size = convertLogicalToDevice(unscaledSize);
|
| AffineTransform transform;
|
|
|