| Index: Source/core/html/HTMLCanvasElement.cpp
|
| diff --git a/Source/core/html/HTMLCanvasElement.cpp b/Source/core/html/HTMLCanvasElement.cpp
|
| index 85d444a1d1a0dd25a56f8204dedf14e0b354e1fa..ab2cac8fd3711c11546d0c00510ab383a08dbe7d 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);
|
| @@ -406,9 +406,8 @@ PassRefPtr<ImageData> HTMLCanvasElement::getImageData()
|
|
|
| IntSize HTMLCanvasElement::convertLogicalToDevice(const IntSize& logicalSize) const
|
| {
|
| - float width = ceilf(logicalSize.width() * m_deviceScaleFactor);
|
| - float height = ceilf(logicalSize.height() * m_deviceScaleFactor);
|
| - return IntSize(width, height);
|
| + FloatSize deviceSize = logicalSize * m_deviceScaleFactor;
|
| + return expandedIntSize(deviceSize);
|
| }
|
|
|
| SecurityOrigin* HTMLCanvasElement::securityOrigin() const
|
| @@ -447,7 +446,7 @@ void HTMLCanvasElement::createImageBuffer()
|
| {
|
| ASSERT(!m_imageBuffer);
|
|
|
| - m_hasCreatedImageBuffer = true;
|
| + m_didFailToCreateImageBuffer = true;
|
| m_didClearImageBuffer = true;
|
|
|
| IntSize deviceSize = convertLogicalToDevice(size());
|
| @@ -468,6 +467,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 +500,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 +527,7 @@ Image* HTMLCanvasElement::copiedImage() const
|
|
|
| void HTMLCanvasElement::clearImageBuffer()
|
| {
|
| - ASSERT(m_hasCreatedImageBuffer);
|
| + ASSERT(hasImageBuffer() && !m_didFailToCreateImageBuffer);
|
| ASSERT(!m_didClearImageBuffer);
|
| ASSERT(m_context);
|
|
|
| @@ -546,7 +548,7 @@ void HTMLCanvasElement::clearCopiedImage()
|
|
|
| AffineTransform HTMLCanvasElement::baseTransform() const
|
| {
|
| - ASSERT(m_hasCreatedImageBuffer);
|
| + ASSERT(hasImageBuffer() && !m_didFailToCreateImageBuffer);
|
| IntSize unscaledSize = size();
|
| IntSize size = convertLogicalToDevice(unscaledSize);
|
| AffineTransform transform;
|
|
|