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

Side by Side Diff: Source/core/rendering/RenderMultiColumnSet.cpp

Issue 584033002: [New Multicolumn] Add support for column-span:all (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 3 months 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
OLDNEW
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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 62
63 RenderMultiColumnSet* RenderMultiColumnSet::previousSiblingMultiColumnSet() cons t 63 RenderMultiColumnSet* RenderMultiColumnSet::previousSiblingMultiColumnSet() cons t
64 { 64 {
65 for (RenderObject* sibling = previousSibling(); sibling; sibling = sibling-> previousSibling()) { 65 for (RenderObject* sibling = previousSibling(); sibling; sibling = sibling-> previousSibling()) {
66 if (sibling->isRenderMultiColumnSet()) 66 if (sibling->isRenderMultiColumnSet())
67 return toRenderMultiColumnSet(sibling); 67 return toRenderMultiColumnSet(sibling);
68 } 68 }
69 return 0; 69 return 0;
70 } 70 }
71 71
72 void RenderMultiColumnSet::setLogicalTopInFlowThread(LayoutUnit logicalTop)
73 {
74 LayoutRect rect = flowThreadPortionRect();
75 if (isHorizontalWritingMode())
76 rect.setY(logicalTop);
77 else
78 rect.setX(logicalTop);
79 setFlowThreadPortionRect(rect);
80 }
81
82 void RenderMultiColumnSet::setLogicalBottomInFlowThread(LayoutUnit logicalBottom )
83 {
84 LayoutRect rect = flowThreadPortionRect();
85 if (isHorizontalWritingMode())
86 rect.shiftMaxYEdgeTo(logicalBottom);
87 else
88 rect.shiftMaxXEdgeTo(logicalBottom);
89 setFlowThreadPortionRect(rect);
90 }
91
92 bool RenderMultiColumnSet::heightIsAuto() const
93 {
94 RenderMultiColumnFlowThread* flowThread = multiColumnFlowThread();
95 if (!flowThread->isRenderPagedFlowThread()) {
96 if (RenderMultiColumnSet* next = nextSiblingMultiColumnSet()) {
97 if (next->isRenderMultiColumnSpannerSet()) {
98 // If we're followed by a spanner, we need to balance.
99 return true;
100 }
101 }
102 if (multiColumnBlockFlow()->style()->columnFill() == ColumnFillBalance)
103 return true;
104 }
105 return !flowThread->columnHeightAvailable();
106 }
107
72 LayoutSize RenderMultiColumnSet::flowThreadTranslationAtOffset(LayoutUnit blockO ffset) const 108 LayoutSize RenderMultiColumnSet::flowThreadTranslationAtOffset(LayoutUnit blockO ffset) const
73 { 109 {
74 unsigned columnIndex = columnIndexAtOffset(blockOffset); 110 unsigned columnIndex = columnIndexAtOffset(blockOffset);
75 LayoutRect portionRect(flowThreadPortionRectAt(columnIndex)); 111 LayoutRect portionRect(flowThreadPortionRectAt(columnIndex));
76 flipForWritingMode(portionRect); 112 flipForWritingMode(portionRect);
77 LayoutRect columnRect(columnRectAt(columnIndex)); 113 LayoutRect columnRect(columnRectAt(columnIndex));
78 flipForWritingMode(columnRect); 114 flipForWritingMode(columnRect);
79 return contentBoxRect().location() + columnRect.location() - portionRect.loc ation(); 115 return contentBoxRect().location() + columnRect.location() - portionRect.loc ation();
80 } 116 }
81 117
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 ASSERT(m_minSpaceShortage > 0); // We should never _shrink_ the height! 221 ASSERT(m_minSpaceShortage > 0); // We should never _shrink_ the height!
186 ASSERT(m_minSpaceShortage != RenderFlowThread::maxLogicalHeight()); // If th is happens, we probably have a bug. 222 ASSERT(m_minSpaceShortage != RenderFlowThread::maxLogicalHeight()); // If th is happens, we probably have a bug.
187 if (m_minSpaceShortage == RenderFlowThread::maxLogicalHeight()) 223 if (m_minSpaceShortage == RenderFlowThread::maxLogicalHeight())
188 return m_columnHeight; // So bail out rather than looping infinitely. 224 return m_columnHeight; // So bail out rather than looping infinitely.
189 225
190 return m_columnHeight + m_minSpaceShortage; 226 return m_columnHeight + m_minSpaceShortage;
191 } 227 }
192 228
193 void RenderMultiColumnSet::addContentRun(LayoutUnit endOffsetFromFirstPage) 229 void RenderMultiColumnSet::addContentRun(LayoutUnit endOffsetFromFirstPage)
194 { 230 {
195 if (!multiColumnFlowThread()->heightIsAuto()) 231 if (!requiresBalancing())
196 return; 232 return;
197 if (!m_contentRuns.isEmpty() && endOffsetFromFirstPage <= m_contentRuns.last ().breakOffset()) 233 if (!m_contentRuns.isEmpty() && endOffsetFromFirstPage <= m_contentRuns.last ().breakOffset())
198 return; 234 return;
199 // Append another item as long as we haven't exceeded used column count. Wha t ends up in the 235 // Append another item as long as we haven't exceeded used column count. Wha t ends up in the
200 // overflow area shouldn't affect column balancing. 236 // overflow area shouldn't affect column balancing.
201 if (m_contentRuns.size() < usedColumnCount()) 237 if (m_contentRuns.size() < usedColumnCount())
202 m_contentRuns.append(ContentRun(endOffsetFromFirstPage)); 238 m_contentRuns.append(ContentRun(endOffsetFromFirstPage));
203 } 239 }
204 240
205 bool RenderMultiColumnSet::recalculateColumnHeight(BalancedHeightCalculation cal culationMode) 241 bool RenderMultiColumnSet::recalculateColumnHeight(BalancedHeightCalculation cal culationMode)
206 { 242 {
207 ASSERT(multiColumnFlowThread()->heightIsAuto()); 243 LayoutUnit oldColumnHeight = m_columnHeight;
208 244
209 LayoutUnit oldColumnHeight = m_columnHeight; 245 m_maxColumnHeight = calculateMaxColumnHeight();
210 if (calculationMode == GuessFromFlowThreadPortion) { 246
211 // Post-process the content runs and find out where the implicit breaks will occur. 247 if (heightIsAuto()) {
212 distributeImplicitBreaks(); 248 if (calculationMode == GuessFromFlowThreadPortion) {
249 // Post-process the content runs and find out where the implicit bre aks will occur.
250 distributeImplicitBreaks();
251 }
252 LayoutUnit newColumnHeight = calculateColumnHeight(calculationMode);
253 setAndConstrainColumnHeight(newColumnHeight);
254 // After having calculated an initial column height, the multicol contai ner typically needs at
255 // least one more layout pass with a new column height, but if a height was specified, we only
256 // need to do this if we think that we need less space than specified. C onversely, if we
257 // determined that the columns need to be as tall as the specified heigh t of the container, we
258 // have already laid it out correctly, and there's no need for another p ass.
259 } else {
260 // The position of the column set may have changed, in which case height available for
261 // columns may have changed as well.
262 setAndConstrainColumnHeight(m_columnHeight);
213 } 263 }
214 LayoutUnit newColumnHeight = calculateColumnHeight(calculationMode);
215 setAndConstrainColumnHeight(newColumnHeight);
216
217 // After having calculated an initial column height, the multicol container typically needs at
218 // least one more layout pass with a new column height, but if a height was specified, we only
219 // need to do this if we think that we need less space than specified. Conve rsely, if we
220 // determined that the columns need to be as tall as the specified height of the container, we
221 // have already laid it out correctly, and there's no need for another pass.
222 264
223 // We can get rid of the content runs now, if we haven't already done so. Th ey are only needed 265 // We can get rid of the content runs now, if we haven't already done so. Th ey are only needed
224 // to calculate the initial balanced column height. In fact, we have to get rid of them before 266 // to calculate the initial balanced column height. In fact, we have to get rid of them before
225 // the next layout pass, since each pass will rebuild this. 267 // the next layout pass, since each pass will rebuild this.
226 m_contentRuns.clear(); 268 m_contentRuns.clear();
227 269
228 if (m_columnHeight == oldColumnHeight) 270 if (m_columnHeight == oldColumnHeight)
229 return false; // No change. We're done. 271 return false; // No change. We're done.
230 272
231 m_minSpaceShortage = RenderFlowThread::maxLogicalHeight(); 273 m_minSpaceShortage = RenderFlowThread::maxLogicalHeight();
(...skipping 14 matching lines...) Expand all
246 288
247 void RenderMultiColumnSet::resetColumnHeight() 289 void RenderMultiColumnSet::resetColumnHeight()
248 { 290 {
249 // Nuke previously stored minimum column height. Contents may have changed f or all we know. 291 // Nuke previously stored minimum column height. Contents may have changed f or all we know.
250 m_minimumColumnHeight = 0; 292 m_minimumColumnHeight = 0;
251 293
252 m_maxColumnHeight = calculateMaxColumnHeight(); 294 m_maxColumnHeight = calculateMaxColumnHeight();
253 295
254 LayoutUnit oldColumnHeight = pageLogicalHeight(); 296 LayoutUnit oldColumnHeight = pageLogicalHeight();
255 297
256 if (multiColumnFlowThread()->heightIsAuto()) 298 if (heightIsAuto())
257 m_columnHeight = 0; 299 m_columnHeight = 0;
258 else 300 else
259 setAndConstrainColumnHeight(heightAdjustedForSetOffset(multiColumnFlowTh read()->columnHeightAvailable())); 301 setAndConstrainColumnHeight(heightAdjustedForSetOffset(multiColumnFlowTh read()->columnHeightAvailable()));
260 302
261 if (pageLogicalHeight() != oldColumnHeight) 303 if (pageLogicalHeight() != oldColumnHeight)
262 setChildNeedsLayout(MarkOnlyThis); 304 setChildNeedsLayout(MarkOnlyThis);
263 305
264 // Content runs are only needed in the initial layout pass, in order to find an initial column 306 // Content runs are only needed in the initial layout pass, in order to find an initial column
265 // height, and should have been deleted afterwards. We're about to rebuild t he content runs, so 307 // height, and should have been deleted afterwards. We're about to rebuild t he content runs, so
266 // the list needs to be empty. 308 // the list needs to be empty.
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 727
686 void RenderMultiColumnSet::detachRegion() 728 void RenderMultiColumnSet::detachRegion()
687 { 729 {
688 if (m_flowThread) { 730 if (m_flowThread) {
689 m_flowThread->removeRegionFromThread(this); 731 m_flowThread->removeRegionFromThread(this);
690 m_flowThread = 0; 732 m_flowThread = 0;
691 } 733 }
692 } 734 }
693 735
694 } 736 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698