| OLD | NEW |
| 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 "core/layout/MultiColumnFragmentainerGroup.h" | 5 #include "core/layout/MultiColumnFragmentainerGroup.h" |
| 6 | 6 |
| 7 #include "core/layout/ColumnBalancer.h" | 7 #include "core/layout/ColumnBalancer.h" |
| 8 #include "core/layout/FragmentationContext.h" | 8 #include "core/layout/FragmentationContext.h" |
| 9 #include "core/layout/LayoutMultiColumnSet.h" | 9 #include "core/layout/LayoutMultiColumnSet.h" |
| 10 | 10 |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 // Our flow thread portion determines our column count. We have as many | 294 // Our flow thread portion determines our column count. We have as many |
| 295 // columns as needed to fit all the content. | 295 // columns as needed to fit all the content. |
| 296 LayoutUnit flowThreadPortionHeight = logicalHeightInFlowThread(); | 296 LayoutUnit flowThreadPortionHeight = logicalHeightInFlowThread(); |
| 297 if (!flowThreadPortionHeight) | 297 if (!flowThreadPortionHeight) |
| 298 return 1; | 298 return 1; |
| 299 | 299 |
| 300 unsigned count = (flowThreadPortionHeight / m_columnHeight).floor(); | 300 unsigned count = (flowThreadPortionHeight / m_columnHeight).floor(); |
| 301 // flowThreadPortionHeight may be saturated, so detect the remainder manually. | 301 // flowThreadPortionHeight may be saturated, so detect the remainder manually. |
| 302 if (count * m_columnHeight < flowThreadPortionHeight) | 302 if (count * m_columnHeight < flowThreadPortionHeight) |
| 303 count++; | 303 count++; |
| 304 ASSERT(count >= 1); | 304 DCHECK_GE(count, 1u); |
| 305 return count; | 305 return count; |
| 306 } | 306 } |
| 307 | 307 |
| 308 LayoutUnit MultiColumnFragmentainerGroup::heightAdjustedForRowOffset( | 308 LayoutUnit MultiColumnFragmentainerGroup::heightAdjustedForRowOffset( |
| 309 LayoutUnit height) const { | 309 LayoutUnit height) const { |
| 310 // Let's avoid zero height, as that would cause an infinite amount of columns | 310 // Let's avoid zero height, as that would cause an infinite amount of columns |
| 311 // to be created. | 311 // to be created. |
| 312 return std::max( | 312 return std::max( |
| 313 height - logicalTop() - m_columnSet.logicalTopFromMulticolContentEdge(), | 313 height - logicalTop() - m_columnSet.logicalTopFromMulticolContentEdge(), |
| 314 LayoutUnit(1)); | 314 LayoutUnit(1)); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 if (shortageFinder.forcedBreaksCount() + 1 >= m_columnSet.usedColumnCount()) { | 362 if (shortageFinder.forcedBreaksCount() + 1 >= m_columnSet.usedColumnCount()) { |
| 363 // Too many forced breaks to allow any implicit breaks. Initial balancing | 363 // Too many forced breaks to allow any implicit breaks. Initial balancing |
| 364 // should already have set a good height. There's nothing more we should do. | 364 // should already have set a good height. There's nothing more we should do. |
| 365 return m_columnHeight; | 365 return m_columnHeight; |
| 366 } | 366 } |
| 367 | 367 |
| 368 // If the initial guessed column height wasn't enough, stretch it now. Stretch | 368 // If the initial guessed column height wasn't enough, stretch it now. Stretch |
| 369 // by the lowest amount of space. | 369 // by the lowest amount of space. |
| 370 LayoutUnit minSpaceShortage = shortageFinder.minimumSpaceShortage(); | 370 LayoutUnit minSpaceShortage = shortageFinder.minimumSpaceShortage(); |
| 371 | 371 |
| 372 ASSERT(minSpaceShortage > 0); // We should never _shrink_ the height! | 372 DCHECK_GT(minSpaceShortage, 0); // We should never _shrink_ the height! |
| 373 ASSERT(minSpaceShortage != | 373 DCHECK_NE(minSpaceShortage, |
| 374 LayoutUnit::max()); // If this happens, we probably have a bug. | 374 LayoutUnit::max()); // If this happens, we probably have a bug. |
| 375 if (minSpaceShortage == LayoutUnit::max()) | 375 if (minSpaceShortage == LayoutUnit::max()) |
| 376 return m_columnHeight; // So bail out rather than looping infinitely. | 376 return m_columnHeight; // So bail out rather than looping infinitely. |
| 377 | 377 |
| 378 return m_columnHeight + minSpaceShortage; | 378 return m_columnHeight + minSpaceShortage; |
| 379 } | 379 } |
| 380 | 380 |
| 381 LayoutRect MultiColumnFragmentainerGroup::columnRectAt( | 381 LayoutRect MultiColumnFragmentainerGroup::columnRectAt( |
| 382 unsigned columnIndex) const { | 382 unsigned columnIndex) const { |
| 383 LayoutUnit columnLogicalWidth = m_columnSet.pageLogicalWidth(); | 383 LayoutUnit columnLogicalWidth = m_columnSet.pageLogicalWidth(); |
| 384 LayoutUnit columnLogicalHeight = logicalHeightInFlowThreadAt(columnIndex); | 384 LayoutUnit columnLogicalHeight = logicalHeightInFlowThreadAt(columnIndex); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 } | 571 } |
| 572 } else { | 572 } else { |
| 573 if (isFlippedColumnProgression) { | 573 if (isFlippedColumnProgression) { |
| 574 firstColumn = columnIndexAtVisualPoint(rect.minXMaxYCorner()); | 574 firstColumn = columnIndexAtVisualPoint(rect.minXMaxYCorner()); |
| 575 lastColumn = columnIndexAtVisualPoint(rect.minXMinYCorner()); | 575 lastColumn = columnIndexAtVisualPoint(rect.minXMinYCorner()); |
| 576 } else { | 576 } else { |
| 577 firstColumn = columnIndexAtVisualPoint(rect.minXMinYCorner()); | 577 firstColumn = columnIndexAtVisualPoint(rect.minXMinYCorner()); |
| 578 lastColumn = columnIndexAtVisualPoint(rect.minXMaxYCorner()); | 578 lastColumn = columnIndexAtVisualPoint(rect.minXMaxYCorner()); |
| 579 } | 579 } |
| 580 } | 580 } |
| 581 ASSERT(firstColumn <= lastColumn); | 581 DCHECK_LE(firstColumn, lastColumn); |
| 582 } | 582 } |
| 583 | 583 |
| 584 MultiColumnFragmentainerGroupList::MultiColumnFragmentainerGroupList( | 584 MultiColumnFragmentainerGroupList::MultiColumnFragmentainerGroupList( |
| 585 LayoutMultiColumnSet& columnSet) | 585 LayoutMultiColumnSet& columnSet) |
| 586 : m_columnSet(columnSet) { | 586 : m_columnSet(columnSet) { |
| 587 append(MultiColumnFragmentainerGroup(m_columnSet)); | 587 append(MultiColumnFragmentainerGroup(m_columnSet)); |
| 588 } | 588 } |
| 589 | 589 |
| 590 // An explicit empty destructor of MultiColumnFragmentainerGroupList should be | 590 // An explicit empty destructor of MultiColumnFragmentainerGroupList should be |
| 591 // in MultiColumnFragmentainerGroup.cpp, because if an implicit destructor is | 591 // in MultiColumnFragmentainerGroup.cpp, because if an implicit destructor is |
| 592 // used, msvc 2015 tries to generate its destructor (because the class is | 592 // used, msvc 2015 tries to generate its destructor (because the class is |
| 593 // dll-exported class) and causes a compile error because of lack of | 593 // dll-exported class) and causes a compile error because of lack of |
| 594 // MultiColumnFragmentainerGroup::operator=. Since | 594 // MultiColumnFragmentainerGroup::operator=. Since |
| 595 // MultiColumnFragmentainerGroup is non-copyable, we cannot define the | 595 // MultiColumnFragmentainerGroup is non-copyable, we cannot define the |
| 596 // operator=. | 596 // operator=. |
| 597 MultiColumnFragmentainerGroupList::~MultiColumnFragmentainerGroupList() {} | 597 MultiColumnFragmentainerGroupList::~MultiColumnFragmentainerGroupList() {} |
| 598 | 598 |
| 599 MultiColumnFragmentainerGroup& | 599 MultiColumnFragmentainerGroup& |
| 600 MultiColumnFragmentainerGroupList::addExtraGroup() { | 600 MultiColumnFragmentainerGroupList::addExtraGroup() { |
| 601 append(MultiColumnFragmentainerGroup(m_columnSet)); | 601 append(MultiColumnFragmentainerGroup(m_columnSet)); |
| 602 return last(); | 602 return last(); |
| 603 } | 603 } |
| 604 | 604 |
| 605 void MultiColumnFragmentainerGroupList::deleteExtraGroups() { | 605 void MultiColumnFragmentainerGroupList::deleteExtraGroups() { |
| 606 shrink(1); | 606 shrink(1); |
| 607 } | 607 } |
| 608 | 608 |
| 609 } // namespace blink | 609 } // namespace blink |
| OLD | NEW |