| 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/ColumnBalancer.h" | 5 #include "core/layout/ColumnBalancer.h" |
| 6 | 6 |
| 7 #include "core/layout/LayoutMultiColumnFlowThread.h" | 7 #include "core/layout/LayoutMultiColumnFlowThread.h" |
| 8 #include "core/layout/LayoutMultiColumnSet.h" | 8 #include "core/layout/LayoutMultiColumnSet.h" |
| 9 #include "core/layout/api/LineLayoutBlockFlow.h" | 9 #include "core/layout/api/LineLayoutBlockFlow.h" |
| 10 | 10 |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 LayoutUnit startOffset = index > 0 ? m_contentRuns[index - 1].breakOffset() | 166 LayoutUnit startOffset = index > 0 ? m_contentRuns[index - 1].breakOffset() |
| 167 : logicalTopInFlowThread(); | 167 : logicalTopInFlowThread(); |
| 168 LayoutUnit height = m_contentRuns[index].columnLogicalHeight(startOffset); | 168 LayoutUnit height = m_contentRuns[index].columnLogicalHeight(startOffset); |
| 169 return rowLogicalTop + std::max(height, m_tallestUnbreakableLogicalHeight); | 169 return rowLogicalTop + std::max(height, m_tallestUnbreakableLogicalHeight); |
| 170 } | 170 } |
| 171 | 171 |
| 172 void InitialColumnHeightFinder::examineBoxAfterEntering( | 172 void InitialColumnHeightFinder::examineBoxAfterEntering( |
| 173 const LayoutBox& box, | 173 const LayoutBox& box, |
| 174 LayoutUnit childLogicalHeight, | 174 LayoutUnit childLogicalHeight, |
| 175 EBreak previousBreakAfterValue) { | 175 EBreak previousBreakAfterValue) { |
| 176 if (m_lastBreakSeen > flowThreadOffset()) { |
| 177 // We have moved backwards. We're probably in a parallel flow, caused by |
| 178 // floats, sibling table cells, etc. |
| 179 m_lastBreakSeen = LayoutUnit(); |
| 180 } |
| 176 if (isLogicalTopWithinBounds(flowThreadOffset() - box.paginationStrut())) { | 181 if (isLogicalTopWithinBounds(flowThreadOffset() - box.paginationStrut())) { |
| 177 if (box.needsForcedBreakBefore(previousBreakAfterValue)) { | 182 if (box.needsForcedBreakBefore(previousBreakAfterValue)) { |
| 178 addContentRun(flowThreadOffset()); | 183 addContentRun(flowThreadOffset()); |
| 179 } else { | 184 } else if (isFirstAfterBreak(flowThreadOffset()) && |
| 180 if (isFirstAfterBreak(flowThreadOffset())) { | 185 m_lastBreakSeen != flowThreadOffset()) { |
| 181 // This box is first after a soft break. | 186 // This box is first after a soft break. |
| 182 recordStrutBeforeOffset(flowThreadOffset(), box.paginationStrut()); | 187 m_lastBreakSeen = flowThreadOffset(); |
| 183 } | 188 recordStrutBeforeOffset(flowThreadOffset(), box.paginationStrut()); |
| 184 } | 189 } |
| 185 } | 190 } |
| 186 | 191 |
| 187 if (box.getPaginationBreakability() != LayoutBox::AllowAnyBreaks) { | 192 if (box.getPaginationBreakability() != LayoutBox::AllowAnyBreaks) { |
| 188 m_tallestUnbreakableLogicalHeight = | 193 m_tallestUnbreakableLogicalHeight = |
| 189 std::max(m_tallestUnbreakableLogicalHeight, childLogicalHeight); | 194 std::max(m_tallestUnbreakableLogicalHeight, childLogicalHeight); |
| 190 return; | 195 return; |
| 191 } | 196 } |
| 192 // Need to examine inner multicol containers to find their tallest unbreakable | 197 // Need to examine inner multicol containers to find their tallest unbreakable |
| 193 // piece of content. | 198 // piece of content. |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 void InitialColumnHeightFinder::examineLine(const RootInlineBox& line) { | 231 void InitialColumnHeightFinder::examineLine(const RootInlineBox& line) { |
| 227 LayoutUnit lineTop = line.lineTopWithLeading(); | 232 LayoutUnit lineTop = line.lineTopWithLeading(); |
| 228 LayoutUnit lineTopInFlowThread = flowThreadOffset() + lineTop; | 233 LayoutUnit lineTopInFlowThread = flowThreadOffset() + lineTop; |
| 229 LayoutUnit minimumLogialHeight = | 234 LayoutUnit minimumLogialHeight = |
| 230 columnLogicalHeightRequirementForLine(line.block().styleRef(), line); | 235 columnLogicalHeightRequirementForLine(line.block().styleRef(), line); |
| 231 m_tallestUnbreakableLogicalHeight = | 236 m_tallestUnbreakableLogicalHeight = |
| 232 std::max(m_tallestUnbreakableLogicalHeight, minimumLogialHeight); | 237 std::max(m_tallestUnbreakableLogicalHeight, minimumLogialHeight); |
| 233 ASSERT( | 238 ASSERT( |
| 234 isFirstAfterBreak(lineTopInFlowThread) || !line.paginationStrut() || | 239 isFirstAfterBreak(lineTopInFlowThread) || !line.paginationStrut() || |
| 235 !isLogicalTopWithinBounds(lineTopInFlowThread - line.paginationStrut())); | 240 !isLogicalTopWithinBounds(lineTopInFlowThread - line.paginationStrut())); |
| 236 if (isFirstAfterBreak(lineTopInFlowThread)) | 241 if (isFirstAfterBreak(lineTopInFlowThread) && |
| 242 m_lastBreakSeen != lineTopInFlowThread) { |
| 243 m_lastBreakSeen = lineTopInFlowThread; |
| 237 recordStrutBeforeOffset(lineTopInFlowThread, line.paginationStrut()); | 244 recordStrutBeforeOffset(lineTopInFlowThread, line.paginationStrut()); |
| 245 } |
| 238 } | 246 } |
| 239 | 247 |
| 240 void InitialColumnHeightFinder::recordStrutBeforeOffset( | 248 void InitialColumnHeightFinder::recordStrutBeforeOffset( |
| 241 LayoutUnit offsetInFlowThread, | 249 LayoutUnit offsetInFlowThread, |
| 242 LayoutUnit strut) { | 250 LayoutUnit strut) { |
| 243 unsigned columnCount = columnSet().usedColumnCount(); | 251 unsigned columnCount = columnSet().usedColumnCount(); |
| 244 ASSERT(m_shortestStruts.size() == columnCount); | 252 ASSERT(m_shortestStruts.size() == columnCount); |
| 245 unsigned index = groupAtOffset(offsetInFlowThread) | 253 unsigned index = groupAtOffset(offsetInFlowThread) |
| 246 .columnIndexAtOffset(offsetInFlowThread - strut, | 254 .columnIndexAtOffset(offsetInFlowThread - strut, |
| 247 LayoutBox::AssociateWithLatterPage); | 255 LayoutBox::AssociateWithFormerPage); |
| 248 if (index >= columnCount) | 256 if (index >= columnCount) |
| 249 return; | 257 return; |
| 250 m_shortestStruts[index] = std::min(m_shortestStruts[index], strut); | 258 m_shortestStruts[index] = std::min(m_shortestStruts[index], strut); |
| 251 } | 259 } |
| 252 | 260 |
| 253 LayoutUnit InitialColumnHeightFinder::spaceUsedByStrutsAt( | 261 LayoutUnit InitialColumnHeightFinder::spaceUsedByStrutsAt( |
| 254 LayoutUnit offsetInFlowThread) const { | 262 LayoutUnit offsetInFlowThread) const { |
| 255 unsigned stopBeforeColumn = | 263 unsigned stopBeforeColumn = |
| 256 groupAtOffset(offsetInFlowThread) | 264 groupAtOffset(offsetInFlowThread) |
| 257 .columnIndexAtOffset(offsetInFlowThread, | 265 .columnIndexAtOffset(offsetInFlowThread, |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 if (group.columnLogicalTopForOffset(lineTopInFlowThread) != | 482 if (group.columnLogicalTopForOffset(lineTopInFlowThread) != |
| 475 group.columnLogicalTopForOffset(lineBottomWithOverflow)) { | 483 group.columnLogicalTopForOffset(lineBottomWithOverflow)) { |
| 476 LayoutUnit shortage = | 484 LayoutUnit shortage = |
| 477 lineBottomWithOverflow - | 485 lineBottomWithOverflow - |
| 478 group.columnLogicalTopForOffset(lineBottomWithOverflow); | 486 group.columnLogicalTopForOffset(lineBottomWithOverflow); |
| 479 recordSpaceShortage(shortage); | 487 recordSpaceShortage(shortage); |
| 480 } | 488 } |
| 481 } | 489 } |
| 482 | 490 |
| 483 } // namespace blink | 491 } // namespace blink |
| OLD | NEW |