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

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

Issue 2345583004: Add PageBoundaryRule parameter to fragmentainerGroupAtFlowThreadOffset(). (Closed)
Patch Set: Created 4 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
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutMultiColumnSet.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 /* 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 43
44 LayoutMultiColumnSet* LayoutMultiColumnSet::createAnonymous(LayoutFlowThread& fl owThread, const ComputedStyle& parentStyle) 44 LayoutMultiColumnSet* LayoutMultiColumnSet::createAnonymous(LayoutFlowThread& fl owThread, const ComputedStyle& parentStyle)
45 { 45 {
46 Document& document = flowThread.document(); 46 Document& document = flowThread.document();
47 LayoutMultiColumnSet* layoutObject = new LayoutMultiColumnSet(&flowThread); 47 LayoutMultiColumnSet* layoutObject = new LayoutMultiColumnSet(&flowThread);
48 layoutObject->setDocumentForAnonymous(&document); 48 layoutObject->setDocumentForAnonymous(&document);
49 layoutObject->setStyle(ComputedStyle::createAnonymousStyleWithDisplay(parent Style, BLOCK)); 49 layoutObject->setStyle(ComputedStyle::createAnonymousStyleWithDisplay(parent Style, BLOCK));
50 return layoutObject; 50 return layoutObject;
51 } 51 }
52 52
53 unsigned LayoutMultiColumnSet::fragmentainerGroupIndexAtFlowThreadOffset(LayoutU nit flowThreadOffset) const 53 unsigned LayoutMultiColumnSet::fragmentainerGroupIndexAtFlowThreadOffset(LayoutU nit flowThreadOffset, PageBoundaryRule rule) const
54 { 54 {
55 ASSERT(m_fragmentainerGroups.size() > 0); 55 ASSERT(m_fragmentainerGroups.size() > 0);
56 if (flowThreadOffset <= 0) 56 if (flowThreadOffset <= 0)
57 return 0; 57 return 0;
58 // TODO(mstensho): Introduce an interval tree or similar to speed up this. 58 // TODO(mstensho): Introduce an interval tree or similar to speed up this.
59 for (unsigned index = 0; index < m_fragmentainerGroups.size(); index++) { 59 for (unsigned index = 0; index < m_fragmentainerGroups.size(); index++) {
60 const auto& row = m_fragmentainerGroups[index]; 60 const auto& row = m_fragmentainerGroups[index];
61 if (row.logicalTopInFlowThread() <= flowThreadOffset && row.logicalBotto mInFlowThread() > flowThreadOffset) 61 if (rule == AssociateWithLatterPage) {
62 if (row.logicalTopInFlowThread() <= flowThreadOffset && row.logicalB ottomInFlowThread() > flowThreadOffset)
63 return index;
64 } else if (row.logicalTopInFlowThread() < flowThreadOffset && row.logica lBottomInFlowThread() >= flowThreadOffset) {
62 return index; 65 return index;
66 }
63 } 67 }
64 return m_fragmentainerGroups.size() - 1; 68 return m_fragmentainerGroups.size() - 1;
65 } 69 }
66 70
67 const MultiColumnFragmentainerGroup& LayoutMultiColumnSet::fragmentainerGroupAtV isualPoint(const LayoutPoint& visualPoint) const 71 const MultiColumnFragmentainerGroup& LayoutMultiColumnSet::fragmentainerGroupAtV isualPoint(const LayoutPoint& visualPoint) const
68 { 72 {
69 ASSERT(m_fragmentainerGroups.size() > 0); 73 ASSERT(m_fragmentainerGroups.size() > 0);
70 LayoutUnit blockOffset = isHorizontalWritingMode() ? visualPoint.y() : visua lPoint.x(); 74 LayoutUnit blockOffset = isHorizontalWritingMode() ? visualPoint.y() : visua lPoint.x();
71 for (unsigned index = 0; index < m_fragmentainerGroups.size(); index++) { 75 for (unsigned index = 0; index < m_fragmentainerGroups.size(); index++) {
72 const auto& row = m_fragmentainerGroups[index]; 76 const auto& row = m_fragmentainerGroups[index];
(...skipping 24 matching lines...) Expand all
97 // is out of bounds. So just use the bottom we have found so far. 101 // is out of bounds. So just use the bottom we have found so far.
98 LayoutUnit enclosingContextBottom = lastRow.blockOffsetInEnclosingFr agmentationContext() + lastRow.logicalHeight(); 102 LayoutUnit enclosingContextBottom = lastRow.blockOffsetInEnclosingFr agmentationContext() + lastRow.logicalHeight();
99 LayoutUnit enclosingFragmentainerHeight = enclosingFragmentationCont ext->fragmentainerLogicalHeightAt(enclosingContextBottom); 103 LayoutUnit enclosingFragmentainerHeight = enclosingFragmentationCont ext->fragmentainerLogicalHeightAt(enclosingContextBottom);
100 // Constrain against specified height / max-height. 104 // Constrain against specified height / max-height.
101 LayoutUnit currentMulticolHeight = logicalTopFromMulticolContentEdge () + lastRow.logicalTop() + lastRow.logicalHeight(); 105 LayoutUnit currentMulticolHeight = logicalTopFromMulticolContentEdge () + lastRow.logicalTop() + lastRow.logicalHeight();
102 LayoutUnit multicolHeightWithExtraRow = currentMulticolHeight + encl osingFragmentainerHeight; 106 LayoutUnit multicolHeightWithExtraRow = currentMulticolHeight + encl osingFragmentainerHeight;
103 multicolHeightWithExtraRow = std::min(multicolHeightWithExtraRow, fl owThread->maxColumnLogicalHeight()); 107 multicolHeightWithExtraRow = std::min(multicolHeightWithExtraRow, fl owThread->maxColumnLogicalHeight());
104 return std::max(LayoutUnit(1), multicolHeightWithExtraRow - currentM ulticolHeight); 108 return std::max(LayoutUnit(1), multicolHeightWithExtraRow - currentM ulticolHeight);
105 } 109 }
106 } 110 }
107 return fragmentainerGroupAtFlowThreadOffset(offsetInFlowThread).logicalHeigh t(); 111 return fragmentainerGroupAtFlowThreadOffset(offsetInFlowThread, AssociateWit hLatterPage).logicalHeight();
108 } 112 }
109 113
110 LayoutUnit LayoutMultiColumnSet::pageRemainingLogicalHeightForOffset(LayoutUnit offsetInFlowThread, PageBoundaryRule pageBoundaryRule) const 114 LayoutUnit LayoutMultiColumnSet::pageRemainingLogicalHeightForOffset(LayoutUnit offsetInFlowThread, PageBoundaryRule pageBoundaryRule) const
111 { 115 {
112 const MultiColumnFragmentainerGroup& row = fragmentainerGroupAtFlowThreadOff set(offsetInFlowThread); 116 const MultiColumnFragmentainerGroup& row = fragmentainerGroupAtFlowThreadOff set(offsetInFlowThread, pageBoundaryRule);
113 LayoutUnit pageLogicalHeight = row.logicalHeight(); 117 LayoutUnit pageLogicalHeight = row.logicalHeight();
114 ASSERT(pageLogicalHeight); // It's not allowed to call this method if the he ight is unknown. 118 ASSERT(pageLogicalHeight); // It's not allowed to call this method if the he ight is unknown.
115 LayoutUnit pageLogicalBottom = row.columnLogicalTopForOffset(offsetInFlowThr ead) + pageLogicalHeight; 119 LayoutUnit pageLogicalBottom = row.columnLogicalTopForOffset(offsetInFlowThr ead) + pageLogicalHeight;
116 LayoutUnit remainingLogicalHeight = pageLogicalBottom - offsetInFlowThread; 120 LayoutUnit remainingLogicalHeight = pageLogicalBottom - offsetInFlowThread;
117 121
118 if (pageBoundaryRule == AssociateWithFormerPage) { 122 if (pageBoundaryRule == AssociateWithFormerPage) {
119 // An offset exactly at a column boundary will act as being part of the former column in 123 // An offset exactly at a column boundary will act as being part of the former column in
120 // question (i.e. no remaining space), rather than being part of the lat ter (i.e. one whole 124 // question (i.e. no remaining space), rather than being part of the lat ter (i.e. one whole
121 // column length of remaining space). 125 // column length of remaining space).
122 remainingLogicalHeight = intMod(remainingLogicalHeight, pageLogicalHeigh t); 126 remainingLogicalHeight = intMod(remainingLogicalHeight, pageLogicalHeigh t);
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 // If we're followed by a spanner, we need to balance. 288 // If we're followed by a spanner, we need to balance.
285 return true; 289 return true;
286 } 290 }
287 } 291 }
288 } 292 }
289 return !flowThread->columnHeightAvailable(); 293 return !flowThread->columnHeightAvailable();
290 } 294 }
291 295
292 LayoutSize LayoutMultiColumnSet::flowThreadTranslationAtOffset(LayoutUnit blockO ffset, PageBoundaryRule rule, CoordinateSpaceConversion mode) const 296 LayoutSize LayoutMultiColumnSet::flowThreadTranslationAtOffset(LayoutUnit blockO ffset, PageBoundaryRule rule, CoordinateSpaceConversion mode) const
293 { 297 {
294 return fragmentainerGroupAtFlowThreadOffset(blockOffset).flowThreadTranslati onAtOffset(blockOffset, rule, mode); 298 return fragmentainerGroupAtFlowThreadOffset(blockOffset, rule).flowThreadTra nslationAtOffset(blockOffset, rule, mode);
295 } 299 }
296 300
297 LayoutPoint LayoutMultiColumnSet::visualPointToFlowThreadPoint(const LayoutPoint & visualPoint) const 301 LayoutPoint LayoutMultiColumnSet::visualPointToFlowThreadPoint(const LayoutPoint & visualPoint) const
298 { 302 {
299 const MultiColumnFragmentainerGroup& row = fragmentainerGroupAtVisualPoint(v isualPoint); 303 const MultiColumnFragmentainerGroup& row = fragmentainerGroupAtVisualPoint(v isualPoint);
300 return row.visualPointToFlowThreadPoint(visualPoint - row.offsetFromColumnSe t()); 304 return row.visualPointToFlowThreadPoint(visualPoint - row.offsetFromColumnSe t());
301 } 305 }
302 306
303 LayoutUnit LayoutMultiColumnSet::pageLogicalTopForOffset(LayoutUnit offset) cons t 307 LayoutUnit LayoutMultiColumnSet::pageLogicalTopForOffset(LayoutUnit offset) cons t
304 { 308 {
305 return fragmentainerGroupAtFlowThreadOffset(offset).columnLogicalTopForOffse t(offset); 309 return fragmentainerGroupAtFlowThreadOffset(offset, AssociateWithLatterPage) .columnLogicalTopForOffset(offset);
306 } 310 }
307 311
308 bool LayoutMultiColumnSet::recalculateColumnHeight() 312 bool LayoutMultiColumnSet::recalculateColumnHeight()
309 { 313 {
310 if (m_oldLogicalTop != logicalTop() && multiColumnFlowThread()->enclosingFra gmentationContext()) { 314 if (m_oldLogicalTop != logicalTop() && multiColumnFlowThread()->enclosingFra gmentationContext()) {
311 // Preceding spanners or column sets have been moved or resized. This me ans that the 315 // Preceding spanners or column sets have been moved or resized. This me ans that the
312 // fragmentainer groups that we have inserted need to be re-inserted. Re start column 316 // fragmentainer groups that we have inserted need to be re-inserted. Re start column
313 // balancing. 317 // balancing.
314 resetColumnHeight(); 318 resetColumnHeight();
315 return true; 319 return true;
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 // Now add in column rule bounds, if present. 539 // Now add in column rule bounds, if present.
536 Vector<LayoutRect> columnRuleBounds; 540 Vector<LayoutRect> columnRuleBounds;
537 if (computeColumnRuleBounds(LayoutPoint(), columnRuleBounds)) { 541 if (computeColumnRuleBounds(LayoutPoint(), columnRuleBounds)) {
538 for (auto& bound : columnRuleBounds) 542 for (auto& bound : columnRuleBounds)
539 blockFlowBounds.unite(bound); 543 blockFlowBounds.unite(bound);
540 } 544 }
541 return blockFlowBounds; 545 return blockFlowBounds;
542 } 546 }
543 547
544 } // namespace blink 548 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutMultiColumnSet.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698