diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-03 09:55:33 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-03 09:55:33 +0100 |
commit | cd44dc59cdfc39534aef4d417e9f3c412e3be139 (patch) | |
tree | 8d89889ba95ed6ec9322e733846cc9cce9d7dff1 /Source/WebCore/rendering/RenderRegion.cpp | |
parent | d11f84f5b5cdc0d92a08af01b13472fdd5f9acb9 (diff) | |
download | qtwebkit-cd44dc59cdfc39534aef4d417e9f3c412e3be139.tar.gz |
Imported WebKit commit fce473cb4d55aa9fe9d0b0322a2fffecb731b961 (http://svn.webkit.org/repository/webkit/trunk@106560)
Diffstat (limited to 'Source/WebCore/rendering/RenderRegion.cpp')
-rw-r--r-- | Source/WebCore/rendering/RenderRegion.cpp | 121 |
1 files changed, 104 insertions, 17 deletions
diff --git a/Source/WebCore/rendering/RenderRegion.cpp b/Source/WebCore/rendering/RenderRegion.cpp index 35d903cc1..b1abd83bd 100644 --- a/Source/WebCore/rendering/RenderRegion.cpp +++ b/Source/WebCore/rendering/RenderRegion.cpp @@ -47,14 +47,12 @@ RenderRegion::RenderRegion(Node* node, RenderFlowThread* flowThread) , m_parentFlowThread(0) , m_isValid(false) , m_hasCustomRegionStyle(false) +#ifndef NDEBUG + , m_insideRegionPaint(false) +#endif { } -RenderRegion::~RenderRegion() -{ - deleteAllRenderBoxRegionInfo(); -} - LayoutRect RenderRegion::regionOverflowRect() const { // FIXME: Would like to just use hasOverflowClip() but we aren't a block yet. When RenderRegion is eliminated and @@ -98,12 +96,66 @@ bool RenderRegion::isLastRegion() const return m_flowThread->lastRegion() == this; } +void RenderRegion::setRegionBoxesRegionStyle() +{ + if (!hasCustomRegionStyle()) + return; + + for (RenderBoxRegionInfoMap::iterator iter = m_renderBoxRegionInfo.begin(), end = m_renderBoxRegionInfo.end(); iter != end; ++iter) { + const RenderBox* box = iter->first; + if (!box->canHaveRegionStyle()) + continue; + + // Save original box style to be restored later, after paint. + RefPtr<RenderStyle> boxOriginalStyle = box->style(); + + // Set the style to be used for box as the style computed in region. + (const_cast<RenderBox*>(box))->setStyleInternal(renderBoxRegionStyle(box)); + + m_renderBoxRegionStyle.set(box, boxOriginalStyle); + } +} + +void RenderRegion::restoreRegionBoxesOriginalStyle() +{ + if (!hasCustomRegionStyle()) + return; + + for (RenderBoxRegionInfoMap::iterator iter = m_renderBoxRegionInfo.begin(), end = m_renderBoxRegionInfo.end(); iter != end; ++iter) { + const RenderBox* box = iter->first; + RenderBoxRegionStyleMap::iterator it = m_renderBoxRegionStyle.find(box); + if (it == m_renderBoxRegionStyle.end()) + continue; + + // Restore the box style to the original style and store the box style in region for later use. + RefPtr<RenderStyle> boxRegionStyle = box->style(); + (const_cast<RenderBox*>(box))->setStyleInternal(it->second); + m_renderBoxRegionStyle.set(box, boxRegionStyle); + } +} + void RenderRegion::paintReplaced(PaintInfo& paintInfo, const LayoutPoint& paintOffset) { // Delegate painting of content in region to RenderFlowThread. if (!m_flowThread || !isValid()) return; + + if (Frame* frame = this->frame()) { + if (Page* page = frame->page()) + page->addRelevantRepaintedObject(this, paintInfo.rect); + } + +#ifndef NDEBUG + m_insideRegionPaint = true; +#endif + + setRegionBoxesRegionStyle(); m_flowThread->paintIntoRegion(paintInfo, this, LayoutPoint(paintOffset.x() + borderLeft() + paddingLeft(), paintOffset.y() + borderTop() + paddingTop())); + restoreRegionBoxesOriginalStyle(); + +#ifndef NDEBUG + m_insideRegionPaint = false; +#endif } // Hit Testing @@ -206,30 +258,27 @@ RenderBoxRegionInfo* RenderRegion::setRenderBoxRegionInfo(const RenderBox* box, if (!m_isValid || !m_flowThread) return 0; - RenderBoxRegionInfo* existingBoxInfo = m_renderBoxRegionInfo.get(box); - if (existingBoxInfo) { - *existingBoxInfo = RenderBoxRegionInfo(logicalLeftInset, logicalRightInset, containingBlockChainIsInset); - return existingBoxInfo; - } - - RenderBoxRegionInfo* newBoxInfo = new RenderBoxRegionInfo(logicalLeftInset, logicalRightInset, containingBlockChainIsInset); - m_renderBoxRegionInfo.set(box, newBoxInfo); - return newBoxInfo; + OwnPtr<RenderBoxRegionInfo>& boxInfo = m_renderBoxRegionInfo.add(box, nullptr).first->second; + if (boxInfo) + *boxInfo = RenderBoxRegionInfo(logicalLeftInset, logicalRightInset, containingBlockChainIsInset); + else + boxInfo = adoptPtr(new RenderBoxRegionInfo(logicalLeftInset, logicalRightInset, containingBlockChainIsInset)); + + return boxInfo.get(); } -RenderBoxRegionInfo* RenderRegion::takeRenderBoxRegionInfo(const RenderBox* box) +PassOwnPtr<RenderBoxRegionInfo> RenderRegion::takeRenderBoxRegionInfo(const RenderBox* box) { return m_renderBoxRegionInfo.take(box); } void RenderRegion::removeRenderBoxRegionInfo(const RenderBox* box) { - delete m_renderBoxRegionInfo.take(box); + m_renderBoxRegionInfo.remove(box); } void RenderRegion::deleteAllRenderBoxRegionInfo() { - deleteAllValues(m_renderBoxRegionInfo); m_renderBoxRegionInfo.clear(); } @@ -242,4 +291,42 @@ LayoutUnit RenderRegion::offsetFromLogicalTopOfFirstPage() const return regionRect().x(); } +PassRefPtr<RenderStyle> RenderRegion::renderBoxRegionStyle(const RenderBox* renderBox) +{ + // The box for which we are asking for style in region should have its info present + // in the region box info map. + ASSERT(m_renderBoxRegionInfo.find(renderBox) != m_renderBoxRegionInfo.end()); + + RenderBoxRegionStyleMap::iterator it = m_renderBoxRegionStyle.find(renderBox); + if (it != m_renderBoxRegionStyle.end()) + return it->second; + return computeStyleInRegion(renderBox); +} + +PassRefPtr<RenderStyle> RenderRegion::computeStyleInRegion(const RenderBox* box) +{ + ASSERT(box); + ASSERT(box->view()); + ASSERT(box->view()->document()); + ASSERT(!box->isAnonymous()); + ASSERT(box->node() && box->node()->isElementNode()); + + Element* element = toElement(box->node()); + RefPtr<RenderStyle> renderBoxRegionStyle = box->view()->document()->styleSelector()->styleForElement(element, 0, false, false, this); + m_renderBoxRegionStyle.add(box, renderBoxRegionStyle); + + if (!box->hasBoxDecorations()) { + bool hasBoxDecorations = box->isTableCell() || renderBoxRegionStyle->hasBackground() || renderBoxRegionStyle->hasBorder() || renderBoxRegionStyle->hasAppearance() || renderBoxRegionStyle->boxShadow(); + (const_cast<RenderBox*>(box))->setHasBoxDecorations(hasBoxDecorations); + } + + return renderBoxRegionStyle.release(); +} + +void RenderRegion::clearBoxStyleInRegion(const RenderBox* box) +{ + ASSERT(box); + m_renderBoxRegionStyle.remove(box); +} + } // namespace WebCore |