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

Side by Side Diff: third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.cpp

Issue 1461923005: When balancing columns, we must check inner multicols for unbreakable content. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: code review - std::max FTW Created 5 years 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 unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 6
7 #include "core/layout/MultiColumnFragmentainerGroup.h" 7 #include "core/layout/MultiColumnFragmentainerGroup.h"
8 8
9 #include "core/layout/ColumnBalancer.h" 9 #include "core/layout/ColumnBalancer.h"
10 #include "core/layout/LayoutMultiColumnSet.h" 10 #include "core/layout/LayoutMultiColumnSet.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 bool MultiColumnFragmentainerGroup::recalculateColumnHeight(BalancedColumnHeight Calculation calculationMode) 61 bool MultiColumnFragmentainerGroup::recalculateColumnHeight(BalancedColumnHeight Calculation calculationMode)
62 { 62 {
63 LayoutUnit oldColumnHeight = m_columnHeight; 63 LayoutUnit oldColumnHeight = m_columnHeight;
64 64
65 m_maxColumnHeight = calculateMaxColumnHeight(); 65 m_maxColumnHeight = calculateMaxColumnHeight();
66 66
67 // Only the last row may have auto height, and thus be balanced. There are n o good reasons to 67 // Only the last row may have auto height, and thus be balanced. There are n o good reasons to
68 // balance the preceding rows, and that could potentially lead to an insane number of layout 68 // balance the preceding rows, and that could potentially lead to an insane number of layout
69 // passes as well. 69 // passes as well.
70 if (isLastGroup() && m_columnSet.heightIsAuto()) { 70 if (isLastGroup() && m_columnSet.heightIsAuto()) {
71 LayoutUnit newColumnHeight = calculateColumnHeight(calculationMode); 71 LayoutUnit newColumnHeight;
72 if (calculationMode == GuessFromFlowThreadPortion) {
73 // Initial balancing: Start with the lowest imaginable column height . Also calculate the
74 // height of the tallest piece of unbreakable content. Columns shoul d never get any
75 // shorter than that (unless constrained by max-height). Propagate t his to our
76 // containing column set, in case there is an outer multicol contain er that also needs
77 // to balance. After having calculated the initial column height, th e multicol container
78 // needs another layout pass with the column height that we just cal culated.
79 InitialColumnHeightFinder initialHeightFinder(*this);
80 LayoutUnit tallestUnbreakableLogicalHeight = initialHeightFinder.tal lestUnbreakableLogicalHeight();
81 m_columnSet.propagateTallestUnbreakableLogicalHeight(tallestUnbreaka bleLogicalHeight);
82 newColumnHeight = std::max(initialHeightFinder.initialMinimalBalance dHeight(), tallestUnbreakableLogicalHeight);
83 } else {
84 // Rebalancing: After having laid out again, we'll need to rebalance if the height
85 // wasn't enough and we're allowed to stretch it, and then re-lay ou t. There are further
86 // details on the column balancing machinery in ColumnBalancer and i ts derivates.
87 newColumnHeight = rebalanceColumnHeightIfNeeded();
88 }
72 setAndConstrainColumnHeight(newColumnHeight); 89 setAndConstrainColumnHeight(newColumnHeight);
73 // After having calculated an initial column height, the multicol contai ner typically needs at
74 // least one more layout pass with a new column height, but if a height was specified, we only
75 // need to do this if we think that we need less space than specified. C onversely, if we
76 // determined that the columns need to be as tall as the specified heigh t of the container, we
77 // have already laid it out correctly, and there's no need for another p ass.
78 } else { 90 } else {
79 // The position of the column set may have changed, in which case height available for 91 // The position of the column set may have changed, in which case height available for
80 // columns may have changed as well. 92 // columns may have changed as well.
81 setAndConstrainColumnHeight(m_columnHeight); 93 setAndConstrainColumnHeight(m_columnHeight);
82 } 94 }
83 95
84 if (m_columnHeight == oldColumnHeight) 96 if (m_columnHeight == oldColumnHeight)
85 return false; // No change. We're done. 97 return false; // No change. We're done.
86 98
87 return true; // Need another pass. 99 return true; // Need another pass.
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 return maxHeight; 336 return maxHeight;
325 } 337 }
326 338
327 void MultiColumnFragmentainerGroup::setAndConstrainColumnHeight(LayoutUnit newHe ight) 339 void MultiColumnFragmentainerGroup::setAndConstrainColumnHeight(LayoutUnit newHe ight)
328 { 340 {
329 m_columnHeight = newHeight; 341 m_columnHeight = newHeight;
330 if (m_columnHeight > m_maxColumnHeight) 342 if (m_columnHeight > m_maxColumnHeight)
331 m_columnHeight = m_maxColumnHeight; 343 m_columnHeight = m_maxColumnHeight;
332 } 344 }
333 345
334 LayoutUnit MultiColumnFragmentainerGroup::calculateColumnHeight(BalancedColumnHe ightCalculation calculationMode) const 346 LayoutUnit MultiColumnFragmentainerGroup::rebalanceColumnHeightIfNeeded() const
335 { 347 {
336 if (calculationMode == GuessFromFlowThreadPortion) {
337 // Initial balancing. Start with the lowest imaginable column height. We use the tallest
338 // content run (after having "inserted" implicit breaks), and find its s tart offset (by
339 // looking at the previous run's end offset, or, if there's no previous run, the set's start
340 // offset in the flow thread).
341 return InitialColumnHeightFinder::initialMinimalBalancedHeight(*this);
342 }
343
344 if (actualColumnCount() <= m_columnSet.usedColumnCount()) { 348 if (actualColumnCount() <= m_columnSet.usedColumnCount()) {
345 // With the current column height, the content fits without creating ove rflowing columns. We're done. 349 // With the current column height, the content fits without creating ove rflowing columns. We're done.
346 return m_columnHeight; 350 return m_columnHeight;
347 } 351 }
348 352
349 if (m_columnHeight >= m_maxColumnHeight) { 353 if (m_columnHeight >= m_maxColumnHeight) {
350 // We cannot stretch any further. We'll just have to live with the overf lowing columns. This 354 // We cannot stretch any further. We'll just have to live with the overf lowing columns. This
351 // typically happens if the max column height is less than the height of the tallest piece 355 // typically happens if the max column height is less than the height of the tallest piece
352 // of unbreakable content (e.g. lines). 356 // of unbreakable content (e.g. lines).
353 return m_columnHeight; 357 return m_columnHeight;
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
549 append(MultiColumnFragmentainerGroup(m_columnSet)); 553 append(MultiColumnFragmentainerGroup(m_columnSet));
550 return last(); 554 return last();
551 } 555 }
552 556
553 void MultiColumnFragmentainerGroupList::deleteExtraGroups() 557 void MultiColumnFragmentainerGroupList::deleteExtraGroups()
554 { 558 {
555 shrink(1); 559 shrink(1);
556 } 560 }
557 561
558 } // namespace blink 562 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698