diff options
Diffstat (limited to 'Source/WebCore/rendering/RenderView.cpp')
-rw-r--r-- | Source/WebCore/rendering/RenderView.cpp | 155 |
1 files changed, 81 insertions, 74 deletions
diff --git a/Source/WebCore/rendering/RenderView.cpp b/Source/WebCore/rendering/RenderView.cpp index cd3893a55..4a3a2bc83 100644 --- a/Source/WebCore/rendering/RenderView.cpp +++ b/Source/WebCore/rendering/RenderView.cpp @@ -25,14 +25,15 @@ #include "Document.h" #include "Element.h" #include "FloatQuad.h" +#include "FlowThreadController.h" #include "Frame.h" #include "FrameView.h" #include "GraphicsContext.h" #include "HTMLFrameOwnerElement.h" #include "HitTestResult.h" #include "Page.h" -#include "RenderFlowThread.h" #include "RenderLayer.h" +#include "RenderNamedFlowThread.h" #include "RenderSelectionInfo.h" #include "RenderWidget.h" #include "RenderWidgetProtector.h" @@ -54,10 +55,8 @@ RenderView::RenderView(Node* node, FrameView* view) , m_maximalOutlineSize(0) , m_pageLogicalHeight(0) , m_pageLogicalHeightChanged(false) - , m_isRenderFlowThreadOrderDirty(false) , m_layoutState(0) , m_layoutStateDisableCount(0) - , m_currentRenderFlowThread(0) { // Clear our anonymous bit, set because RenderObject assumes // any renderer with document as the node is anonymous. @@ -69,7 +68,7 @@ RenderView::RenderView(Node* node, FrameView* view) m_minPreferredLogicalWidth = 0; m_maxPreferredLogicalWidth = 0; - setPreferredLogicalWidthsDirty(true, false); + setPreferredLogicalWidthsDirty(true, MarkOnlyThis); setPositioned(true); // to 0,0 :) } @@ -78,6 +77,11 @@ RenderView::~RenderView() { } +bool RenderView::hitTest(const HitTestRequest& request, HitTestResult& result) +{ + return layer()->hitTest(request, result); +} + void RenderView::computeLogicalHeight() { if (!printing() && m_frameView) @@ -95,8 +99,6 @@ void RenderView::computePreferredLogicalWidths() ASSERT(preferredLogicalWidthsDirty()); RenderBlock::computePreferredLogicalWidths(); - - m_maxPreferredLogicalWidth = m_minPreferredLogicalWidth; } bool RenderView::isChildAllowed(RenderObject* child, RenderStyle*) const @@ -115,10 +117,13 @@ void RenderView::layout() // Use calcWidth/Height to get the new width/height, since this will take the full page zoom factor into account. bool relayoutChildren = !printing() && (!m_frameView || width() != viewWidth() || height() != viewHeight()); if (relayoutChildren) { - setChildNeedsLayout(true, false); + setChildNeedsLayout(true, MarkOnlyThis); for (RenderObject* child = firstChild(); child; child = child->nextSibling()) { - if (child->style()->logicalHeight().isPercent() || child->style()->logicalMinHeight().isPercent() || child->style()->logicalMaxHeight().isPercent()) - child->setChildNeedsLayout(true, false); + if ((child->isBox() && toRenderBox(child)->hasRelativeLogicalHeight()) + || child->style()->logicalHeight().isPercent() + || child->style()->logicalMinHeight().isPercent() + || child->style()->logicalMaxHeight().isPercent()) + child->setChildNeedsLayout(true, MarkOnlyThis); } } @@ -134,8 +139,8 @@ void RenderView::layout() if (needsLayout()) { RenderBlock::layout(); - if (hasRenderFlowThreads()) - layoutRenderFlowThreads(); + if (hasRenderNamedFlowThreads()) + flowThreadController()->layoutRenderNamedFlowThreads(); } ASSERT(layoutDelta() == LayoutSize()); @@ -145,7 +150,7 @@ void RenderView::layout() setNeedsLayout(false); } -void RenderView::mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool fixed, bool useTransforms, TransformState& transformState, bool* wasFixed) const +void RenderView::mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool fixed, bool useTransforms, TransformState& transformState, ApplyContainerFlipOrNot, bool* wasFixed) const { // If a container was specified, and was not 0 or the RenderView, // then we should have found it by now. @@ -214,6 +219,8 @@ void RenderView::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) { // If we ever require layout but receive a paint anyway, something has gone horribly wrong. ASSERT(!needsLayout()); + // RenderViews should never be called to paint with an offset not on device pixels. + ASSERT(LayoutPoint(IntPoint(paintOffset.x(), paintOffset.y())) == paintOffset); paintObject(paintInfo, paintOffset); } @@ -246,8 +253,8 @@ void RenderView::paintBoxDecorations(PaintInfo& paintInfo, const LayoutPoint&) } #if USE(ACCELERATED_COMPOSITING) - if (RenderLayer* compositingLayer = layer->enclosingCompositingLayer()) { - if (!compositingLayer->backing()->paintingGoesToWindow()) { + if (RenderLayer* compositingLayer = layer->enclosingCompositingLayerForRepaint()) { + if (!compositingLayer->backing()->paintsIntoWindow()) { frameView()->setCannotBlitToWindow(); break; } @@ -291,18 +298,21 @@ void RenderView::paintBoxDecorations(PaintInfo& paintInfo, const LayoutPoint&) } } -bool RenderView::shouldRepaint(const IntRect& r) const +bool RenderView::shouldRepaint(const LayoutRect& r) const { if (printing() || r.width() == 0 || r.height() == 0) return false; if (!m_frameView) return false; - + + if (m_frameView->repaintsDisabled()) + return false; + return true; } -void RenderView::repaintViewRectangle(const IntRect& ur, bool immediate) +void RenderView::repaintViewRectangle(const LayoutRect& ur, bool immediate) { if (!shouldRepaint(ur)) return; @@ -311,23 +321,22 @@ void RenderView::repaintViewRectangle(const IntRect& ur, bool immediate) // or even invisible. Element* elt = document()->ownerElement(); if (!elt) - m_frameView->repaintContentRectangle(ur, immediate); + m_frameView->repaintContentRectangle(pixelSnappedIntRect(ur), immediate); else if (RenderBox* obj = elt->renderBox()) { - IntRect vr = viewRect(); - IntRect r = intersection(ur, vr); + LayoutRect vr = viewRect(); + LayoutRect r = intersection(ur, vr); // Subtract out the contentsX and contentsY offsets to get our coords within the viewing // rectangle. r.moveBy(-vr.location()); - + // FIXME: Hardcoded offsets here are not good. - r.move(obj->borderLeft() + obj->paddingLeft(), - obj->borderTop() + obj->paddingTop()); + r.moveBy(obj->contentBoxRect().location()); obj->repaintRectangle(r, immediate); } } -void RenderView::repaintRectangleInViewAndCompositedLayers(const IntRect& ur, bool immediate) +void RenderView::repaintRectangleInViewAndCompositedLayers(const LayoutRect& ur, bool immediate) { if (!shouldRepaint(ur)) return; @@ -336,11 +345,11 @@ void RenderView::repaintRectangleInViewAndCompositedLayers(const IntRect& ur, bo #if USE(ACCELERATED_COMPOSITING) if (compositor()->inCompositingMode()) - compositor()->repaintCompositedLayersAbsoluteRect(ur); + compositor()->repaintCompositedLayersAbsoluteRect(pixelSnappedIntRect(ur)); #endif } -void RenderView::computeRectForRepaint(RenderBoxModelObject* repaintContainer, IntRect& rect, bool fixed) const +void RenderView::computeRectForRepaint(RenderBoxModelObject* repaintContainer, LayoutRect& rect, bool fixed) const { // If a container was specified, and was not 0 or the RenderView, // then we should have found it by now. @@ -414,12 +423,12 @@ IntRect RenderView::selectionBounds(bool clipToVisibleContent) const } // Now create a single bounding box rect that encloses the whole selection. - IntRect selRect; + LayoutRect selRect; SelectionMap::iterator end = selectedObjects.end(); for (SelectionMap::iterator i = selectedObjects.begin(); i != end; ++i) { RenderSelectionInfo* info = i->second; // RenderSelectionInfo::rect() is in the coordinates of the repaintContainer, so map to page coordinates. - IntRect currRect = info->rect(); + LayoutRect currRect = info->rect(); if (RenderBoxModelObject* repaintContainer = info->repaintContainer()) { FloatQuad absQuad = repaintContainer->localToAbsoluteQuad(FloatRect(currRect)); currRect = absQuad.enclosingBoundingBox(); @@ -427,7 +436,7 @@ IntRect RenderView::selectionBounds(bool clipToVisibleContent) const selRect.unite(currRect); delete info; } - return selRect; + return pixelSnappedIntRect(selRect); } #if USE(ACCELERATED_COMPOSITING) @@ -700,21 +709,21 @@ void RenderView::notifyWidgets(WidgetNotification notification) releaseWidgets(renderWidgets); } -IntRect RenderView::viewRect() const +LayoutRect RenderView::viewRect() const { if (printing()) - return IntRect(IntPoint(), size()); + return LayoutRect(LayoutPoint(), size()); if (m_frameView) return m_frameView->visibleContentRect(); - return IntRect(); + return LayoutRect(); } IntRect RenderView::unscaledDocumentRect() const { - IntRect overflowRect(layoutOverflowRect()); + LayoutRect overflowRect(layoutOverflowRect()); flipForWritingMode(overflowRect); - return overflowRect; + return pixelSnappedIntRect(overflowRect); } LayoutRect RenderView::backgroundRect(RenderBox* backgroundRenderer) const @@ -882,64 +891,62 @@ void RenderView::styleDidChange(StyleDifference diff, const RenderStyle* oldStyl RenderBlock::styleDidChange(diff, oldStyle); for (RenderObject* renderer = firstChild(); renderer; renderer = renderer->nextSibling()) { - if (renderer->isRenderFlowThread()) { - RenderFlowThread* flowRenderer = toRenderFlowThread(renderer); + if (renderer->isRenderNamedFlowThread()) { + RenderNamedFlowThread* flowRenderer = toRenderNamedFlowThread(renderer); flowRenderer->setStyle(RenderFlowThread::createFlowThreadStyle(style())); } } } -RenderFlowThread* RenderView::ensureRenderFlowThreadWithName(const AtomicString& flowThread) +bool RenderView::hasRenderNamedFlowThreads() const { - if (!m_renderFlowThreadList) - m_renderFlowThreadList = adoptPtr(new RenderFlowThreadList()); - else { - for (RenderFlowThreadList::iterator iter = m_renderFlowThreadList->begin(); iter != m_renderFlowThreadList->end(); ++iter) { - RenderFlowThread* flowRenderer = *iter; - if (flowRenderer->flowThread() == flowThread) - return flowRenderer; - } - } + return m_flowThreadController && m_flowThreadController->hasRenderNamedFlowThreads(); +} - RenderFlowThread* flowRenderer = new (renderArena()) RenderFlowThread(document(), flowThread); - flowRenderer->setStyle(RenderFlowThread::createFlowThreadStyle(style())); - addChild(flowRenderer); +FlowThreadController* RenderView::flowThreadController() +{ + if (!m_flowThreadController) + m_flowThreadController = FlowThreadController::create(this); - m_renderFlowThreadList->add(flowRenderer); - setIsRenderFlowThreadOrderDirty(true); + return m_flowThreadController.get(); +} - return flowRenderer; +RenderBlock::IntervalArena* RenderView::intervalArena() +{ + if (!m_intervalArena) + m_intervalArena = IntervalArena::create(); + return m_intervalArena.get(); } -void RenderView::layoutRenderFlowThreads() +void RenderView::setFixedPositionedObjectsNeedLayout() { - ASSERT(m_renderFlowThreadList); + ASSERT(m_frameView); - if (isRenderFlowThreadOrderDirty()) { - // Arrange the thread list according to dependencies. - RenderFlowThreadList sortedList; - for (RenderFlowThreadList::iterator iter = m_renderFlowThreadList->begin(); iter != m_renderFlowThreadList->end(); ++iter) { - RenderFlowThread* flowRenderer = *iter; - if (sortedList.contains(flowRenderer)) - continue; - flowRenderer->pushDependencies(sortedList); - sortedList.add(flowRenderer); - } - m_renderFlowThreadList->swap(sortedList); - setIsRenderFlowThreadOrderDirty(false); - } + PositionedObjectsListHashSet* positionedObjects = this->positionedObjects(); + if (!positionedObjects) + return; - for (RenderFlowThreadList::iterator iter = m_renderFlowThreadList->begin(); iter != m_renderFlowThreadList->end(); ++iter) { - RenderFlowThread* flowRenderer = *iter; - flowRenderer->layoutIfNeeded(); + PositionedObjectsListHashSet::const_iterator end = positionedObjects->end(); + for (PositionedObjectsListHashSet::const_iterator it = positionedObjects->begin(); it != end; ++it) { + RenderBox* currBox = *it; + currBox->setNeedsLayout(true); } } -RenderBlock::IntervalArena* RenderView::intervalArena() +void RenderView::insertFixedPositionedObject(RenderBox* object) { - if (!m_intervalArena) - m_intervalArena = IntervalArena::create(); - return m_intervalArena.get(); + if (!m_positionedObjects) + m_positionedObjects = adoptPtr(new PositionedObjectsListHashSet); + + m_positionedObjects->add(object); +} + +void RenderView::removeFixedPositionedObject(RenderBox* object) +{ + if (!m_positionedObjects) + return; + + m_positionedObjects->remove(object); } } // namespace WebCore |