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

Unified Diff: third_party/WebKit/Source/core/layout/ColumnBalancer.cpp

Issue 1420713003: Deduct pagination struts when calculating initial column height. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Code review Created 5 years, 1 month 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: third_party/WebKit/Source/core/layout/ColumnBalancer.cpp
diff --git a/third_party/WebKit/Source/core/layout/ColumnBalancer.cpp b/third_party/WebKit/Source/core/layout/ColumnBalancer.cpp
index 524d8c054e26a6efdf186efa713cf896241fc1b5..1af0adc0c5e6262bc329d11a68e5fe3b8fa4f3f9 100644
--- a/third_party/WebKit/Source/core/layout/ColumnBalancer.cpp
+++ b/third_party/WebKit/Source/core/layout/ColumnBalancer.cpp
@@ -78,6 +78,9 @@ void ColumnBalancer::traverseSubtree(const LayoutBox& box)
InitialColumnHeightFinder::InitialColumnHeightFinder(const MultiColumnFragmentainerGroup& group)
: ColumnBalancer(group)
{
+ m_shortestStruts.resize(group.columnSet().usedColumnCount());
+ for (auto& strut : m_shortestStruts)
+ strut = LayoutUnit::max();
traverse();
// We have now found each explicit / forced break, and their location. Now we need to figure out
// how many additional implicit / soft breaks we need and guess where they will occur, in order
@@ -95,8 +98,13 @@ LayoutUnit InitialColumnHeightFinder::initialMinimalBalancedHeight() const
void InitialColumnHeightFinder::examineBoxAfterEntering(const LayoutBox& box)
{
ASSERT(isFirstAfterBreak(flowThreadOffset()) || !box.paginationStrut());
- if (box.hasForcedBreakBefore())
+ if (box.hasForcedBreakBefore()) {
addContentRun(flowThreadOffset());
+ } else if (isFirstAfterBreak(flowThreadOffset())) {
+ // This box is first after a soft break.
+ recordStrutBeforeOffset(flowThreadOffset(), box.paginationStrut());
+ }
+
if (box.hasForcedBreakAfter())
addContentRun(flowThreadOffset() + box.logicalHeight());
}
@@ -107,10 +115,41 @@ void InitialColumnHeightFinder::examineBoxBeforeLeaving(const LayoutBox& box)
void InitialColumnHeightFinder::examineLine(const RootInlineBox& line)
{
+ LayoutUnit lineTop = line.lineTopWithLeading();
+ LayoutUnit lineTopInFlowThread = flowThreadOffset() + lineTop;
+ ASSERT(isFirstAfterBreak(lineTopInFlowThread) || !line.paginationStrut());
+ if (isFirstAfterBreak(lineTopInFlowThread))
+ recordStrutBeforeOffset(lineTopInFlowThread, line.paginationStrut());
+}
+
+void InitialColumnHeightFinder::recordStrutBeforeOffset(LayoutUnit offsetInFlowThread, LayoutUnit strut)
+{
+ const LayoutMultiColumnSet& columnSet = group().columnSet();
+ ASSERT(columnSet.usedColumnCount() >= 1);
+ unsigned columnCount = columnSet.usedColumnCount();
+ ASSERT(m_shortestStruts.size() == columnCount);
+ unsigned index = group().columnIndexAtOffset(offsetInFlowThread - strut, MultiColumnFragmentainerGroup::AssumeNewColumns);
+ if (index >= columnCount)
+ return;
+ m_shortestStruts[index] = std::min(m_shortestStruts[index], strut);
+}
+
+LayoutUnit InitialColumnHeightFinder::spaceUsedByStrutsAt(LayoutUnit offsetInFlowThread) const
+{
+ unsigned stopBeforeColumn = group().columnIndexAtOffset(offsetInFlowThread, MultiColumnFragmentainerGroup::AssumeNewColumns) + 1;
+ stopBeforeColumn = std::min(stopBeforeColumn, group().columnSet().usedColumnCount());
+ ASSERT(stopBeforeColumn <= m_shortestStruts.size());
+ LayoutUnit totalStrutSpace;
+ for (unsigned i = 0; i < stopBeforeColumn; i++) {
+ if (m_shortestStruts[i] != LayoutUnit::max())
+ totalStrutSpace += m_shortestStruts[i];
+ }
+ return totalStrutSpace;
}
void InitialColumnHeightFinder::addContentRun(LayoutUnit endOffsetInFlowThread)
{
+ endOffsetInFlowThread -= spaceUsedByStrutsAt(endOffsetInFlowThread);
if (!m_contentRuns.isEmpty() && endOffsetInFlowThread <= m_contentRuns.last().breakOffset())
return;
// Append another item as long as we haven't exceeded used column count. What ends up in the

Powered by Google App Engine
This is Rietveld 408576698