RenderHTMLCanvas.cpp [plain text]
#include "config.h"
#include "RenderHTMLCanvas.h"
#include "Document.h"
#include "GraphicsContext.h"
#include "HTMLCanvasElement.h"
#include "HTMLNames.h"
#include "RenderView.h"
namespace WebCore {
using namespace HTMLNames;
RenderHTMLCanvas::RenderHTMLCanvas(Node* n)
: RenderReplaced(n)
{
}
const char* RenderHTMLCanvas::renderName() const
{
return "RenderHTMLCanvas";
}
void RenderHTMLCanvas::paint(PaintInfo& i, int tx, int ty)
{
if (!shouldPaint(i, tx, ty))
return;
int x = tx + m_x;
int y = ty + m_y;
if (shouldPaintBackgroundOrBorder() && (i.phase == PaintPhaseForeground || i.phase == PaintPhaseSelection))
paintBoxDecorations(i, x, y);
if ((i.phase == PaintPhaseOutline || i.phase == PaintPhaseSelfOutline) && style()->outlineWidth() && style()->visibility() == VISIBLE)
paintOutline(i.p, x, y, width(), height(), style());
if (i.phase != PaintPhaseForeground && i.phase != PaintPhaseSelection)
return;
if (!shouldPaintWithinRoot(i))
return;
bool drawSelectionTint = selectionState() != SelectionNone && !document()->printing();
if (i.phase == PaintPhaseSelection) {
if (selectionState() == SelectionNone)
return;
drawSelectionTint = false;
}
if (element() && element()->hasTagName(canvasTag))
static_cast<HTMLCanvasElement*>(element())->paint(i.p,
IntRect(x + borderLeft() + paddingLeft(), y + borderTop() + paddingTop(), contentWidth(), contentHeight()));
if (drawSelectionTint)
i.p->fillRect(selectionRect(), selectionBackgroundColor());
}
void RenderHTMLCanvas::layout()
{
ASSERT(needsLayout());
ASSERT(minMaxKnown());
IntRect oldBounds;
bool checkForRepaint = checkForRepaintDuringLayout();
if (checkForRepaint) {
oldBounds = getAbsoluteRepaintRect();
oldBounds.move(view()->layoutDelta());
}
calcWidth();
calcHeight();
if (checkForRepaint)
repaintAfterLayoutIfNeeded(oldBounds, oldBounds);
setNeedsLayout(false);
}
}