summaryrefslogtreecommitdiffstats
path: root/WebCore/html/HTMLCanvasElement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/html/HTMLCanvasElement.cpp')
-rw-r--r--WebCore/html/HTMLCanvasElement.cpp43
1 files changed, 30 insertions, 13 deletions
diff --git a/WebCore/html/HTMLCanvasElement.cpp b/WebCore/html/HTMLCanvasElement.cpp
index f3ca1fd..7481d96 100644
--- a/WebCore/html/HTMLCanvasElement.cpp
+++ b/WebCore/html/HTMLCanvasElement.cpp
@@ -42,7 +42,6 @@
#include "Page.h"
#include "RenderHTMLCanvas.h"
#include "Settings.h"
-#include <kjs/interpreter.h>
#include <math.h>
#include <stdio.h>
@@ -59,14 +58,15 @@ static const int defaultHeight = 150;
// in exchange for a smaller maximum canvas size.
const float HTMLCanvasElement::MaxCanvasArea = 32768 * 8192; // Maximum canvas area in CSS pixels
-HTMLCanvasElement::HTMLCanvasElement(Document* doc)
- : HTMLElement(canvasTag, doc)
+HTMLCanvasElement::HTMLCanvasElement(const QualifiedName& tagName, Document* doc)
+ : HTMLElement(tagName, doc)
, m_size(defaultWidth, defaultHeight)
, m_observer(0)
, m_originClean(true)
, m_ignoreReset(false)
, m_createdImageBuffer(false)
{
+ ASSERT(hasTagName(canvasTag));
}
HTMLCanvasElement::~HTMLCanvasElement()
@@ -155,16 +155,15 @@ void HTMLCanvasElement::willDraw(const FloatRect& rect)
{
m_imageBuffer->clearImage();
- if (RenderObject* ro = renderer()) {
-#ifdef CANVAS_INCREMENTAL_REPAINT
- // Handle CSS triggered scaling
- float widthScale = static_cast<float>(ro->width()) / static_cast<float>(m_size.width());
- float heightScale = static_cast<float>(ro->height()) / static_cast<float>(m_size.height());
- FloatRect r(rect.x() * widthScale, rect.y() * heightScale, rect.width() * widthScale, rect.height() * heightScale);
- ro->repaintRectangle(enclosingIntRect(r));
-#else
- ro->repaint();
-#endif
+ if (RenderBox* ro = renderBox()) {
+ FloatRect destRect = ro->contentBoxRect();
+ FloatRect r = mapRect(rect, FloatRect(0, 0, m_size.width(), m_size.height()), destRect);
+ r.intersect(destRect);
+ if (m_dirtyRect.contains(r))
+ return;
+
+ m_dirtyRect.unite(r);
+ ro->repaintRectangle(enclosingIntRect(m_dirtyRect));
}
if (m_observer)
@@ -207,6 +206,9 @@ void HTMLCanvasElement::reset()
void HTMLCanvasElement::paint(GraphicsContext* context, const IntRect& r)
{
+ // Clear the dirty rect
+ m_dirtyRect = FloatRect();
+
if (context->paintingDisabled())
return;
@@ -253,7 +255,10 @@ void HTMLCanvasElement::createImageBuffer() const
IntSize size = convertLogicalToDevice(unscaledSize);
if (!size.width() || !size.height())
return;
+
m_imageBuffer.set(ImageBuffer::create(size, false).release());
+ m_imageBuffer->context()->scale(FloatSize(size.width() / unscaledSize.width(), size.height() / unscaledSize.height()));
+ m_imageBuffer->context()->setShadowsIgnoreTransforms(true);
}
GraphicsContext* HTMLCanvasElement::drawingContext() const
@@ -267,5 +272,17 @@ ImageBuffer* HTMLCanvasElement::buffer() const
createImageBuffer();
return m_imageBuffer.get();
}
+
+TransformationMatrix HTMLCanvasElement::baseTransform() const
+{
+ ASSERT(m_createdImageBuffer);
+ FloatSize unscaledSize(width(), height());
+ IntSize size = convertLogicalToDevice(unscaledSize);
+ TransformationMatrix transform;
+ if (size.width() && size.height())
+ transform.scale(size.width() / unscaledSize.width(), size.height() / unscaledSize.height());
+ transform.multiply(m_imageBuffer->baseTransform());
+ return transform;
+}
}