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

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

Issue 1492143002: Add support for printing multicol containers, and enable it. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: code review Created 5 years 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 // 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 "config.h" 5 #include "config.h"
6 6
7 #include "core/layout/MultiColumnFragmentainerGroup.h" 7 #include "core/layout/MultiColumnFragmentainerGroup.h"
8 8
9 #include "core/layout/ColumnBalancer.h" 9 #include "core/layout/ColumnBalancer.h"
10 #include "core/layout/FragmentationContext.h"
10 #include "core/layout/LayoutMultiColumnSet.h" 11 #include "core/layout/LayoutMultiColumnSet.h"
11 12
12 namespace blink { 13 namespace blink {
13 14
14 MultiColumnFragmentainerGroup::MultiColumnFragmentainerGroup(LayoutMultiColumnSe t& columnSet) 15 MultiColumnFragmentainerGroup::MultiColumnFragmentainerGroup(LayoutMultiColumnSe t& columnSet)
15 : m_columnSet(columnSet) 16 : m_columnSet(columnSet)
16 { 17 {
17 } 18 }
18 19
19 bool MultiColumnFragmentainerGroup::isFirstGroup() const 20 bool MultiColumnFragmentainerGroup::isFirstGroup() const
20 { 21 {
21 return &m_columnSet.firstFragmentainerGroup() == this; 22 return &m_columnSet.firstFragmentainerGroup() == this;
22 } 23 }
23 24
24 bool MultiColumnFragmentainerGroup::isLastGroup() const 25 bool MultiColumnFragmentainerGroup::isLastGroup() const
25 { 26 {
26 return &m_columnSet.lastFragmentainerGroup() == this; 27 return &m_columnSet.lastFragmentainerGroup() == this;
27 } 28 }
28 29
29 LayoutSize MultiColumnFragmentainerGroup::offsetFromColumnSet() const 30 LayoutSize MultiColumnFragmentainerGroup::offsetFromColumnSet() const
30 { 31 {
31 LayoutSize offset(LayoutUnit(), logicalTop()); 32 LayoutSize offset(LayoutUnit(), logicalTop());
32 if (!m_columnSet.flowThread()->isHorizontalWritingMode()) 33 if (!m_columnSet.flowThread()->isHorizontalWritingMode())
33 return offset.transposedSize(); 34 return offset.transposedSize();
34 return offset; 35 return offset;
35 } 36 }
36 37
37 LayoutUnit MultiColumnFragmentainerGroup::blockOffsetInEnclosingFlowThread() con st 38 LayoutUnit MultiColumnFragmentainerGroup::blockOffsetInEnclosingFragmentationCon text() const
38 { 39 {
39 return logicalTop() + m_columnSet.logicalTop() + m_columnSet.multiColumnFlow Thread()->blockOffsetInEnclosingFlowThread(); 40 return logicalTop() + m_columnSet.logicalTop() + m_columnSet.multiColumnFlow Thread()->blockOffsetInEnclosingFragmentationContext();
40 } 41 }
41 42
42 void MultiColumnFragmentainerGroup::resetColumnHeight() 43 void MultiColumnFragmentainerGroup::resetColumnHeight()
43 { 44 {
44 m_maxColumnHeight = calculateMaxColumnHeight(); 45 m_maxColumnHeight = calculateMaxColumnHeight();
45 46
46 LayoutMultiColumnFlowThread* flowThread = m_columnSet.multiColumnFlowThread( ); 47 LayoutMultiColumnFlowThread* flowThread = m_columnSet.multiColumnFlowThread( );
47 if (m_columnSet.heightIsAuto()) { 48 if (m_columnSet.heightIsAuto()) {
48 LayoutMultiColumnFlowThread* enclosingFlowThread = flowThread->enclosing FlowThread(); 49 FragmentationContext* enclosingFragmentationContext = flowThread->enclos ingFragmentationContext();
49 if (enclosingFlowThread && enclosingFlowThread->isPageLogicalHeightKnown ()) { 50 if (enclosingFragmentationContext && enclosingFragmentationContext->isFr agmentainerLogicalHeightKnown()) {
50 // Even if height is auto, we set an initial height, in order to tel l how much content 51 // Even if height is auto, we set an initial height, in order to tel l how much content
51 // this MultiColumnFragmentainerGroup can hold, and when we need to append a new one. 52 // this MultiColumnFragmentainerGroup can hold, and when we need to append a new one.
52 m_columnHeight = m_maxColumnHeight; 53 m_columnHeight = m_maxColumnHeight;
53 } else { 54 } else {
54 m_columnHeight = LayoutUnit(); 55 m_columnHeight = LayoutUnit();
55 } 56 }
56 } else { 57 } else {
57 setAndConstrainColumnHeight(heightAdjustedForRowOffset(flowThread->colum nHeightAvailable())); 58 setAndConstrainColumnHeight(heightAdjustedForRowOffset(flowThread->colum nHeightAvailable()));
58 } 59 }
59 } 60 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 flowThread->flipForWritingMode(portionRect); 108 flowThread->flipForWritingMode(portionRect);
108 LayoutRect columnRect(columnRectAt(columnIndex)); 109 LayoutRect columnRect(columnRectAt(columnIndex));
109 m_columnSet.flipForWritingMode(columnRect); 110 m_columnSet.flipForWritingMode(columnRect);
110 LayoutSize translationRelativeToGroup = columnRect.location() - portionRect. location(); 111 LayoutSize translationRelativeToGroup = columnRect.location() - portionRect. location();
111 112
112 LayoutSize enclosingTranslation; 113 LayoutSize enclosingTranslation;
113 if (LayoutMultiColumnFlowThread* enclosingFlowThread = flowThread->enclosing FlowThread()) { 114 if (LayoutMultiColumnFlowThread* enclosingFlowThread = flowThread->enclosing FlowThread()) {
114 // Translation that would map points in the coordinate space of the oute rmost flow thread to 115 // Translation that would map points in the coordinate space of the oute rmost flow thread to
115 // visual points in the first column in the first fragmentainer group (r ow) in our multicol 116 // visual points in the first column in the first fragmentainer group (r ow) in our multicol
116 // container. 117 // container.
117 LayoutSize enclosingTranslationOrigin = enclosingFlowThread->flowThreadT ranslationAtOffset(flowThread->blockOffsetInEnclosingFlowThread()); 118 LayoutSize enclosingTranslationOrigin = enclosingFlowThread->flowThreadT ranslationAtOffset(flowThread->blockOffsetInEnclosingFragmentationContext());
118 119
119 // Translation that would map points in the coordinate space of the oute rmost flow thread to 120 // Translation that would map points in the coordinate space of the oute rmost flow thread to
120 // visual points in the first column in this fragmentainer group. 121 // visual points in the first column in this fragmentainer group.
121 enclosingTranslation = enclosingFlowThread->flowThreadTranslationAtOffse t(blockOffsetInEnclosingFlowThread()); 122 enclosingTranslation = enclosingFlowThread->flowThreadTranslationAtOffse t(blockOffsetInEnclosingFragmentationContext());
122 123
123 // What we ultimately return from this method is a translation that maps points in the 124 // What we ultimately return from this method is a translation that maps points in the
124 // coordinate space of our flow thread to a visual point in a certain co lumn in this 125 // coordinate space of our flow thread to a visual point in a certain co lumn in this
125 // fragmentainer group. We had to go all the way up to the outermost flo w thread, since this 126 // fragmentainer group. We had to go all the way up to the outermost flo w thread, since this
126 // fragmentainer group may be in a different outer column than the first outer column that 127 // fragmentainer group may be in a different outer column than the first outer column that
127 // this multicol container lives in. It's the visual distance between th e first 128 // this multicol container lives in. It's the visual distance between th e first
128 // fragmentainer group and this fragmentainer group that we need to add to the translation. 129 // fragmentainer group and this fragmentainer group that we need to add to the translation.
129 enclosingTranslation -= enclosingTranslationOrigin; 130 enclosingTranslation -= enclosingTranslationOrigin;
130 } 131 }
131 132
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 const ComputedStyle& multicolStyle = multicolBlock->styleRef(); 317 const ComputedStyle& multicolStyle = multicolBlock->styleRef();
317 LayoutMultiColumnFlowThread* flowThread = m_columnSet.multiColumnFlowThread( ); 318 LayoutMultiColumnFlowThread* flowThread = m_columnSet.multiColumnFlowThread( );
318 LayoutUnit availableHeight = flowThread->columnHeightAvailable(); 319 LayoutUnit availableHeight = flowThread->columnHeightAvailable();
319 LayoutUnit maxColumnHeight = availableHeight ? availableHeight : LayoutUnit: :max(); 320 LayoutUnit maxColumnHeight = availableHeight ? availableHeight : LayoutUnit: :max();
320 if (!multicolStyle.logicalMaxHeight().isMaxSizeNone()) { 321 if (!multicolStyle.logicalMaxHeight().isMaxSizeNone()) {
321 LayoutUnit logicalMaxHeight = multicolBlock->computeContentLogicalHeight (MaxSize, multicolStyle.logicalMaxHeight(), -1); 322 LayoutUnit logicalMaxHeight = multicolBlock->computeContentLogicalHeight (MaxSize, multicolStyle.logicalMaxHeight(), -1);
322 if (logicalMaxHeight != -1 && maxColumnHeight > logicalMaxHeight) 323 if (logicalMaxHeight != -1 && maxColumnHeight > logicalMaxHeight)
323 maxColumnHeight = logicalMaxHeight; 324 maxColumnHeight = logicalMaxHeight;
324 } 325 }
325 LayoutUnit maxHeight = heightAdjustedForRowOffset(maxColumnHeight); 326 LayoutUnit maxHeight = heightAdjustedForRowOffset(maxColumnHeight);
326 if (LayoutMultiColumnFlowThread* enclosingFlowThread = flowThread->enclosing FlowThread()) { 327 if (FragmentationContext* enclosingFragmentationContext = flowThread->enclos ingFragmentationContext()) {
327 if (enclosingFlowThread->isPageLogicalHeightKnown()) { 328 if (enclosingFragmentationContext->isFragmentainerLogicalHeightKnown()) {
328 // We're nested inside another fragmentation context whose fragmenta iner heights are 329 // We're nested inside another fragmentation context whose fragmenta iner heights are
329 // known. This constrains the max height. 330 // known. This constrains the max height.
330 LayoutUnit remainingOuterLogicalHeight = enclosingFlowThread->pageRe mainingLogicalHeightForOffset(blockOffsetInEnclosingFlowThread(), LayoutBlock::A ssociateWithLatterPage); 331 LayoutUnit remainingOuterLogicalHeight = enclosingFragmentationConte xt->remainingLogicalHeightAt(blockOffsetInEnclosingFragmentationContext());
331 ASSERT(remainingOuterLogicalHeight > 0); 332 ASSERT(remainingOuterLogicalHeight > 0);
332 if (maxHeight > remainingOuterLogicalHeight) 333 if (maxHeight > remainingOuterLogicalHeight)
333 maxHeight = remainingOuterLogicalHeight; 334 maxHeight = remainingOuterLogicalHeight;
334 } 335 }
335 } 336 }
336 return maxHeight; 337 return maxHeight;
337 } 338 }
338 339
339 void MultiColumnFragmentainerGroup::setAndConstrainColumnHeight(LayoutUnit newHe ight) 340 void MultiColumnFragmentainerGroup::setAndConstrainColumnHeight(LayoutUnit newHe ight)
340 { 341 {
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 append(MultiColumnFragmentainerGroup(m_columnSet)); 554 append(MultiColumnFragmentainerGroup(m_columnSet));
554 return last(); 555 return last();
555 } 556 }
556 557
557 void MultiColumnFragmentainerGroupList::deleteExtraGroups() 558 void MultiColumnFragmentainerGroupList::deleteExtraGroups()
558 { 559 {
559 shrink(1); 560 shrink(1);
560 } 561 }
561 562
562 } // namespace blink 563 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698