summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/RenderRegion.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-02-03 09:55:33 +0100
committerSimon Hausmann <simon.hausmann@nokia.com>2012-02-03 09:55:33 +0100
commitcd44dc59cdfc39534aef4d417e9f3c412e3be139 (patch)
tree8d89889ba95ed6ec9322e733846cc9cce9d7dff1 /Source/WebCore/rendering/RenderRegion.cpp
parentd11f84f5b5cdc0d92a08af01b13472fdd5f9acb9 (diff)
downloadqtwebkit-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.cpp121
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