Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1052)

Unified Diff: Source/core/rendering/RenderMultiColumnFlowThread.cpp

Issue 551263005: *** DO NOT LAND *** Implement column-span:all without reparenting renderers. Work in progress. (Closed) Base URL: git:blink.git@new-multicol-no-renderer-reparenting
Patch Set: Copy margin properties from a spanner to its spanner set, to simplify code. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/rendering/RenderMultiColumnFlowThread.cpp
diff --git a/Source/core/rendering/RenderMultiColumnFlowThread.cpp b/Source/core/rendering/RenderMultiColumnFlowThread.cpp
index bfe606ee19699df4ef2c4e7e8d5c0a31d6618872..fff2e8bd0c4b7195193de545668d0879ed6b8174 100644
--- a/Source/core/rendering/RenderMultiColumnFlowThread.cpp
+++ b/Source/core/rendering/RenderMultiColumnFlowThread.cpp
@@ -356,56 +356,51 @@ bool RenderMultiColumnFlowThread::hasColumnSpanner(const RenderObject* renderer)
return m_spannerMap.get(renderer);
}
-LayoutUnit RenderMultiColumnFlowThread::spannerLogicalTopAdjustment(RenderBox* renderer, LayoutUnit logicalTop) const
+LayoutUnit RenderMultiColumnFlowThread::enterColumnSpanner(RenderBox* renderer, LayoutUnit logicalTop)
{
- ASSERT(m_spannerMap.get(renderer) == m_lastSetWorkedOn);
- RenderMultiColumnSet* previousSet = m_lastSetWorkedOn->previousSiblingMultiColumnSet();
- if (!previousSet || previousSet->isRenderMultiColumnSpannerSet() || !previousSet->pageLogicalHeight())
- return LayoutUnit();
-
- RenderBlock* cb = renderer->containingBlock();
- LayoutUnit logicalTopInFlowThread = cb->offsetFromLogicalTopOfFirstPage() + logicalTop;
- LayoutUnit columnLogicalTopInFlowThread = previousSet->pageLogicalTopForOffset(logicalTopInFlowThread);
- if (columnLogicalTopInFlowThread == logicalTopInFlowThread)
- return LayoutUnit(); // Exactly at the top of a column. No need to adjust.
- return columnLogicalTopInFlowThread + previousSet->pageLogicalHeight() - logicalTopInFlowThread;
-}
-
-void RenderMultiColumnFlowThread::enterColumnSpanner(RenderBox* renderer, LayoutUnit& logicalTop)
-{
- ASSERT(m_spannerMap.get(renderer));
ASSERT(renderer->isDescendantOf(this));
-
- if (m_spannerMap.get(renderer) == m_lastSetWorkedOn) {
+ RenderMultiColumnSpannerSet* spannerSet = m_spannerMap.get(renderer);
+ ASSERT(spannerSet);
+ RenderMultiColumnSet* previousSet = spannerSet->previousSiblingMultiColumnSet();
+ if (!previousSet) {
// The first set is entered at the beginning of flow thread layout. If the first set happens
// to be a spanner, we have nothing more to do here.
- ASSERT(!m_lastSetWorkedOn->previousSiblingMultiColumnSet());
- return;
+ return LayoutUnit();
}
- RenderMultiColumnSet* previousSet = m_lastSetWorkedOn;
- m_lastSetWorkedOn = m_lastSetWorkedOn->nextSiblingMultiColumnSet();
- ASSERT(m_lastSetWorkedOn);
- ASSERT(m_lastSetWorkedOn->isRenderMultiColumnSpannerSet());
- ASSERT(toRenderMultiColumnSpannerSet(m_lastSetWorkedOn)->renderer() == renderer);
-
- logicalTop += spannerLogicalTopAdjustment(renderer, logicalTop);
RenderBlock* cb = renderer->containingBlock();
LayoutUnit logicalTopInFlowThread = cb->offsetFromLogicalTopOfFirstPage() + logicalTop;
+ LayoutUnit adjustment;
+ if (!previousSet->isRenderMultiColumnSpannerSet() && previousSet->pageLogicalHeight()) {
+ // Pad flow thread offset to a column boundary, so that contents that's supposed to come
+ // after the spanner (or the spanner itself) don't bleed into the column preceding the
+ // spanner.
+ LayoutUnit columnLogicalTopInFlowThread = previousSet->pageLogicalTopForOffset(logicalTopInFlowThread);
+ if (columnLogicalTopInFlowThread != logicalTopInFlowThread) {
+ adjustment = columnLogicalTopInFlowThread + previousSet->pageLogicalHeight() - logicalTopInFlowThread;
+ logicalTopInFlowThread += adjustment;
+ }
+ }
+
if (!previousSet->isRenderMultiColumnSpannerSet())
previousSet->endFlow(logicalTopInFlowThread);
- m_lastSetWorkedOn->beginFlow(logicalTopInFlowThread);
+ spannerSet->beginFlow(logicalTopInFlowThread);
+
+ m_lastSetWorkedOn = spannerSet;
+ return adjustment;
}
void RenderMultiColumnFlowThread::leaveColumnSpanner(RenderBox* renderer, LayoutUnit logicalBottom)
{
+ ASSERT(m_lastSetWorkedOn == m_spannerMap.get(renderer));
+
RenderBlock* cb = renderer->containingBlock();
LayoutUnit logicalBottomInFlowThread = cb->offsetFromLogicalTopOfFirstPage() + logicalBottom;
m_lastSetWorkedOn->endFlow(logicalBottomInFlowThread);
RenderMultiColumnSet* nextSet = m_lastSetWorkedOn->nextSiblingMultiColumnSet();
- if (nextSet && !nextSet->isRenderMultiColumnSpannerSet()) {
+ if (nextSet) {
m_lastSetWorkedOn = nextSet;
- if (m_lastSetWorkedOn)
+ if (!m_lastSetWorkedOn->isRenderMultiColumnSpannerSet())
m_lastSetWorkedOn->beginFlow(logicalBottomInFlowThread);
}
}
@@ -501,6 +496,16 @@ void RenderMultiColumnFlowThread::flowThreadDescendantWillBeRemoved(RenderObject
}
}
+void RenderMultiColumnFlowThread::flowThreadDescendantStyleDidChange(RenderObject* descendant)
+{
+ ASSERT(descendant->isDescendantOf(this));
+ if (RenderMultiColumnSpannerSet* spanner = m_spannerMap.get(descendant)) {
+ RefPtr<RenderStyle> newStyle = RenderStyle::clone(style());
+ spanner->updateMarginProperties(newStyle.get(), descendant);
+ setStyle(newStyle);
+ }
+}
+
void RenderMultiColumnFlowThread::computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop, LogicalExtentComputedValues& computedValues) const
{
// We simply remain at our intrinsic height.
« no previous file with comments | « Source/core/rendering/RenderMultiColumnFlowThread.h ('k') | Source/core/rendering/RenderMultiColumnSpannerSet.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698