OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Apple Inc. All rights reserved. | 2 * Copyright (C) 2012 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 LayoutMultiColumnSet* layoutObject = new LayoutMultiColumnSet(&flowThread); | 46 LayoutMultiColumnSet* layoutObject = new LayoutMultiColumnSet(&flowThread); |
47 layoutObject->setDocumentForAnonymous(&document); | 47 layoutObject->setDocumentForAnonymous(&document); |
48 layoutObject->setStyle(ComputedStyle::createAnonymousStyleWithDisplay( | 48 layoutObject->setStyle(ComputedStyle::createAnonymousStyleWithDisplay( |
49 parentStyle, EDisplay::kBlock)); | 49 parentStyle, EDisplay::kBlock)); |
50 return layoutObject; | 50 return layoutObject; |
51 } | 51 } |
52 | 52 |
53 unsigned LayoutMultiColumnSet::fragmentainerGroupIndexAtFlowThreadOffset( | 53 unsigned LayoutMultiColumnSet::fragmentainerGroupIndexAtFlowThreadOffset( |
54 LayoutUnit flowThreadOffset, | 54 LayoutUnit flowThreadOffset, |
55 PageBoundaryRule rule) const { | 55 PageBoundaryRule rule) const { |
56 ASSERT(m_fragmentainerGroups.size() > 0); | 56 DCHECK_GT(m_fragmentainerGroups.size(), 0u); |
57 if (flowThreadOffset <= 0) | 57 if (flowThreadOffset <= 0) |
58 return 0; | 58 return 0; |
59 // TODO(mstensho): Introduce an interval tree or similar to speed up this. | 59 // TODO(mstensho): Introduce an interval tree or similar to speed up this. |
60 for (unsigned index = 0; index < m_fragmentainerGroups.size(); index++) { | 60 for (unsigned index = 0; index < m_fragmentainerGroups.size(); index++) { |
61 const auto& row = m_fragmentainerGroups[index]; | 61 const auto& row = m_fragmentainerGroups[index]; |
62 if (rule == AssociateWithLatterPage) { | 62 if (rule == AssociateWithLatterPage) { |
63 if (row.logicalTopInFlowThread() <= flowThreadOffset && | 63 if (row.logicalTopInFlowThread() <= flowThreadOffset && |
64 row.logicalBottomInFlowThread() > flowThreadOffset) | 64 row.logicalBottomInFlowThread() > flowThreadOffset) |
65 return index; | 65 return index; |
66 } else if (row.logicalTopInFlowThread() < flowThreadOffset && | 66 } else if (row.logicalTopInFlowThread() < flowThreadOffset && |
67 row.logicalBottomInFlowThread() >= flowThreadOffset) { | 67 row.logicalBottomInFlowThread() >= flowThreadOffset) { |
68 return index; | 68 return index; |
69 } | 69 } |
70 } | 70 } |
71 return m_fragmentainerGroups.size() - 1; | 71 return m_fragmentainerGroups.size() - 1; |
72 } | 72 } |
73 | 73 |
74 const MultiColumnFragmentainerGroup& | 74 const MultiColumnFragmentainerGroup& |
75 LayoutMultiColumnSet::fragmentainerGroupAtVisualPoint( | 75 LayoutMultiColumnSet::fragmentainerGroupAtVisualPoint( |
76 const LayoutPoint& visualPoint) const { | 76 const LayoutPoint& visualPoint) const { |
77 ASSERT(m_fragmentainerGroups.size() > 0); | 77 DCHECK_GT(m_fragmentainerGroups.size(), 0u); |
78 LayoutUnit blockOffset = | 78 LayoutUnit blockOffset = |
79 isHorizontalWritingMode() ? visualPoint.y() : visualPoint.x(); | 79 isHorizontalWritingMode() ? visualPoint.y() : visualPoint.x(); |
80 for (unsigned index = 0; index < m_fragmentainerGroups.size(); index++) { | 80 for (unsigned index = 0; index < m_fragmentainerGroups.size(); index++) { |
81 const auto& row = m_fragmentainerGroups[index]; | 81 const auto& row = m_fragmentainerGroups[index]; |
82 if (row.logicalTop() + row.logicalHeight() > blockOffset) | 82 if (row.logicalTop() + row.logicalHeight() > blockOffset) |
83 return row; | 83 return row; |
84 } | 84 } |
85 return m_fragmentainerGroups.last(); | 85 return m_fragmentainerGroups.last(); |
86 } | 86 } |
87 | 87 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 // we need to balance at all), so we want that last fragmentainer group to | 176 // we need to balance at all), so we want that last fragmentainer group to |
177 // be the same one in all layout passes that follow. | 177 // be the same one in all layout passes that follow. |
178 return false; | 178 return false; |
179 } | 179 } |
180 return true; | 180 return true; |
181 } | 181 } |
182 | 182 |
183 LayoutUnit LayoutMultiColumnSet::nextLogicalTopForUnbreakableContent( | 183 LayoutUnit LayoutMultiColumnSet::nextLogicalTopForUnbreakableContent( |
184 LayoutUnit flowThreadOffset, | 184 LayoutUnit flowThreadOffset, |
185 LayoutUnit contentLogicalHeight) const { | 185 LayoutUnit contentLogicalHeight) const { |
186 ASSERT(flowThreadOffset.mightBeSaturated() || | 186 DCHECK(flowThreadOffset.mightBeSaturated() || |
187 pageLogicalTopForOffset(flowThreadOffset) == flowThreadOffset); | 187 pageLogicalTopForOffset(flowThreadOffset) == flowThreadOffset); |
188 FragmentationContext* enclosingFragmentationContext = | 188 FragmentationContext* enclosingFragmentationContext = |
189 multiColumnFlowThread()->enclosingFragmentationContext(); | 189 multiColumnFlowThread()->enclosingFragmentationContext(); |
190 if (!enclosingFragmentationContext) { | 190 if (!enclosingFragmentationContext) { |
191 // If there's no enclosing fragmentation context, there'll ever be only one | 191 // If there's no enclosing fragmentation context, there'll ever be only one |
192 // row, and all columns there will have the same height. | 192 // row, and all columns there will have the same height. |
193 return flowThreadOffset; | 193 return flowThreadOffset; |
194 } | 194 } |
195 | 195 |
196 // Assert the problematic situation. If we have no problem with the column | 196 // Assert the problematic situation. If we have no problem with the column |
197 // height, why are we even here? | 197 // height, why are we even here? |
198 ASSERT(pageLogicalHeightForOffset(flowThreadOffset) < contentLogicalHeight); | 198 DCHECK_LT(pageLogicalHeightForOffset(flowThreadOffset), contentLogicalHeight); |
199 | 199 |
200 // There's a likelihood for subsequent rows to be taller than the first one. | 200 // There's a likelihood for subsequent rows to be taller than the first one. |
201 // TODO(mstensho): if we're doubly nested (e.g. multicol in multicol in | 201 // TODO(mstensho): if we're doubly nested (e.g. multicol in multicol in |
202 // multicol), we need to look beyond the first row here. | 202 // multicol), we need to look beyond the first row here. |
203 const MultiColumnFragmentainerGroup& firstRow = firstFragmentainerGroup(); | 203 const MultiColumnFragmentainerGroup& firstRow = firstFragmentainerGroup(); |
204 LayoutUnit firstRowLogicalBottomInFlowThread = | 204 LayoutUnit firstRowLogicalBottomInFlowThread = |
205 firstRow.logicalTopInFlowThread() + fragmentainerGroupCapacity(firstRow); | 205 firstRow.logicalTopInFlowThread() + fragmentainerGroupCapacity(firstRow); |
206 if (flowThreadOffset >= firstRowLogicalBottomInFlowThread) | 206 if (flowThreadOffset >= firstRowLogicalBottomInFlowThread) |
207 return flowThreadOffset; // We're not in the first row. Give up. | 207 return flowThreadOffset; // We're not in the first row. Give up. |
208 LayoutUnit newLogicalHeight = | 208 LayoutUnit newLogicalHeight = |
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 // Now add in column rule bounds, if present. | 615 // Now add in column rule bounds, if present. |
616 Vector<LayoutRect> columnRuleBounds; | 616 Vector<LayoutRect> columnRuleBounds; |
617 if (computeColumnRuleBounds(LayoutPoint(), columnRuleBounds)) { | 617 if (computeColumnRuleBounds(LayoutPoint(), columnRuleBounds)) { |
618 for (auto& bound : columnRuleBounds) | 618 for (auto& bound : columnRuleBounds) |
619 blockFlowBounds.unite(bound); | 619 blockFlowBounds.unite(bound); |
620 } | 620 } |
621 return blockFlowBounds; | 621 return blockFlowBounds; |
622 } | 622 } |
623 | 623 |
624 } // namespace blink | 624 } // namespace blink |
OLD | NEW |