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 "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/LayoutMultiColumnSet.h" | 9 #include "core/layout/LayoutMultiColumnSet.h" |
10 | 10 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
139 m_columnSet.flipForWritingMode(columnRect); | 139 m_columnSet.flipForWritingMode(columnRect); |
140 return columnRect.location() - portionRect.location(); | 140 return columnRect.location() - portionRect.location(); |
141 } | 141 } |
142 | 142 |
143 LayoutUnit MultiColumnFragmentainerGroup::columnLogicalTopForOffset(LayoutUnit o ffsetInFlowThread) const | 143 LayoutUnit MultiColumnFragmentainerGroup::columnLogicalTopForOffset(LayoutUnit o ffsetInFlowThread) const |
144 { | 144 { |
145 unsigned columnIndex = columnIndexAtOffset(offsetInFlowThread, AssumeNewColu mns); | 145 unsigned columnIndex = columnIndexAtOffset(offsetInFlowThread, AssumeNewColu mns); |
146 return m_logicalTopInFlowThread + columnIndex * m_columnHeight; | 146 return m_logicalTopInFlowThread + columnIndex * m_columnHeight; |
147 } | 147 } |
148 | 148 |
149 LayoutPoint MultiColumnFragmentainerGroup::visualPointToFlowThreadPoint(const La youtPoint& visualPoint) const | |
150 { | |
151 unsigned columnIndex = columnIndexAtVisualPoint(visualPoint); | |
152 LayoutRect columnRect = columnRectAt(columnIndex); | |
153 LayoutPoint localPoint(visualPoint); | |
154 localPoint.moveBy(-columnRect.location()); | |
155 // Before converting to a flow thread position, if the block direction coord inate is outside the | |
156 // column, snap to the bounds of the column, and reset the inline direction coordinate to the | |
157 // start position in the column. The effect of this is that if the block pos ition is before the | |
158 // column rectangle, we'll get to the beginning of this column, while if the block position is | |
159 // after the column rectangle, we'll get to the beginning of the next column . | |
160 if (!m_columnSet.isHorizontalWritingMode()) { | |
161 LayoutUnit columnStart = m_columnSet.style()->isLeftToRightDirection() ? LayoutUnit() : columnRect.height(); | |
162 if (localPoint.x() < 0) | |
163 localPoint = LayoutPoint(LayoutUnit(), columnStart); | |
164 else if (localPoint.x() > logicalHeight()) | |
165 localPoint = LayoutPoint(logicalHeight(), columnStart); | |
166 return LayoutPoint(localPoint.x() + logicalTopInFlowThreadAt(columnIndex ), localPoint.y()); | |
167 } | |
168 LayoutUnit columnStart = m_columnSet.style()->isLeftToRightDirection() ? Lay outUnit() : columnRect.width(); | |
169 if (localPoint.y() < 0) | |
170 localPoint = LayoutPoint(columnStart, LayoutUnit()); | |
171 else if (localPoint.y() > logicalHeight()) | |
172 localPoint = LayoutPoint(columnStart, logicalHeight()); | |
173 return LayoutPoint(localPoint.x(), localPoint.y() + logicalTopInFlowThreadAt (columnIndex)); | |
174 } | |
175 | |
149 void MultiColumnFragmentainerGroup::collectLayerFragments(LayerFragments& fragme nts, const LayoutRect& layerBoundingBox, const LayoutRect& dirtyRect) const | 176 void MultiColumnFragmentainerGroup::collectLayerFragments(LayerFragments& fragme nts, const LayoutRect& layerBoundingBox, const LayoutRect& dirtyRect) const |
150 { | 177 { |
151 // |layerBoundingBox| is in the flow thread coordinate space, relative to th e top/left edge of | 178 // |layerBoundingBox| is in the flow thread coordinate space, relative to th e top/left edge of |
152 // the flow thread, but note that it has been converted with respect to writ ing mode (so that | 179 // the flow thread, but note that it has been converted with respect to writ ing mode (so that |
153 // it's visual/physical in that sense). | 180 // it's visual/physical in that sense). |
154 // | 181 // |
155 // |dirtyRect| is visual, relative to the multicol container. | 182 // |dirtyRect| is visual, relative to the multicol container. |
156 // | 183 // |
157 // Then there's the output from this method - the stuff we put into the list of fragments. The | 184 // Then there's the output from this method - the stuff we put into the list of fragments. The |
158 // fragment.paginationOffset point is the actual visual translation required to get from a | 185 // fragment.paginationOffset point is the actual visual translation required to get from a |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
483 if (mode == ClampToExistingColumns) { | 510 if (mode == ClampToExistingColumns) { |
484 if (offsetInFlowThread >= m_logicalBottomInFlowThread) | 511 if (offsetInFlowThread >= m_logicalBottomInFlowThread) |
485 return actualColumnCount() - 1; | 512 return actualColumnCount() - 1; |
486 } | 513 } |
487 | 514 |
488 if (m_columnHeight) | 515 if (m_columnHeight) |
489 return (offsetInFlowThread - m_logicalTopInFlowThread).toFloat() / m_col umnHeight.toFloat(); | 516 return (offsetInFlowThread - m_logicalTopInFlowThread).toFloat() / m_col umnHeight.toFloat(); |
490 return 0; | 517 return 0; |
491 } | 518 } |
492 | 519 |
520 unsigned MultiColumnFragmentainerGroup::columnIndexAtVisualPoint(const LayoutPoi nt& visualPoint) const | |
521 { | |
522 bool isColumnProgressionInline = m_columnSet.multiColumnFlowThread()->progre ssionIsInline(); | |
Julien - ping for review
2015/03/09 15:49:03
progressionIsInline() is only set for paged overfl
mstensho (USE GERRIT)
2015/03/12 11:43:27
Done.
Added a paged-y test.
| |
523 bool isHorizontalWritingMode = m_columnSet.isHorizontalWritingMode(); | |
524 LayoutUnit columnLengthInColumnProgressionDirection = isColumnProgressionInl ine ? m_columnSet.pageLogicalWidth() : m_columnSet.pageLogicalHeight(); | |
525 LayoutUnit offsetInColumnProgressionDirection = isHorizontalWritingMode == i sColumnProgressionInline ? visualPoint.x() : visualPoint.y(); | |
526 if (!m_columnSet.style()->isLeftToRightDirection() && isColumnProgressionInl ine) | |
527 offsetInColumnProgressionDirection = m_columnSet.logicalWidth() - offset InColumnProgressionDirection; | |
528 LayoutUnit columnGap = m_columnSet.columnGap(); | |
529 if (columnLengthInColumnProgressionDirection + columnGap <= 0) | |
530 return 0; | |
531 // Column boundaries are in the middle of the column gap. | |
532 int index = (offsetInColumnProgressionDirection + columnGap / 2) / (columnLe ngthInColumnProgressionDirection + columnGap); | |
533 if (index < 0) | |
534 return 0; | |
535 return std::min(unsigned(index), actualColumnCount() - 1); | |
536 } | |
537 | |
493 MultiColumnFragmentainerGroupList::MultiColumnFragmentainerGroupList(LayoutMulti ColumnSet& columnSet) | 538 MultiColumnFragmentainerGroupList::MultiColumnFragmentainerGroupList(LayoutMulti ColumnSet& columnSet) |
494 : m_columnSet(columnSet) | 539 : m_columnSet(columnSet) |
495 { | 540 { |
496 append(MultiColumnFragmentainerGroup(m_columnSet)); | 541 append(MultiColumnFragmentainerGroup(m_columnSet)); |
497 } | 542 } |
498 | 543 |
499 MultiColumnFragmentainerGroup& MultiColumnFragmentainerGroupList::addExtraGroup( ) | 544 MultiColumnFragmentainerGroup& MultiColumnFragmentainerGroupList::addExtraGroup( ) |
500 { | 545 { |
501 append(MultiColumnFragmentainerGroup(m_columnSet)); | 546 append(MultiColumnFragmentainerGroup(m_columnSet)); |
502 return last(); | 547 return last(); |
503 } | 548 } |
504 | 549 |
505 void MultiColumnFragmentainerGroupList::deleteExtraGroups() | 550 void MultiColumnFragmentainerGroupList::deleteExtraGroups() |
506 { | 551 { |
507 shrink(1); | 552 shrink(1); |
508 } | 553 } |
509 | 554 |
510 } // namespace blink | 555 } // namespace blink |
OLD | NEW |