| Index: third_party/WebKit/Source/core/layout/FragmentainerIterator.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/FragmentainerIterator.cpp b/third_party/WebKit/Source/core/layout/FragmentainerIterator.cpp
|
| index b78d9865079cf8892cfe178dfc4405fbd9853ae2..80ef939d5ae48ec52f00d3e5f07ae259125af61c 100644
|
| --- a/third_party/WebKit/Source/core/layout/FragmentainerIterator.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/FragmentainerIterator.cpp
|
| @@ -45,8 +45,6 @@ FragmentainerIterator::FragmentainerIterator(const LayoutFlowThread& flowThread,
|
| if (atEnd())
|
| return;
|
| }
|
| -
|
| - updateOutput();
|
| }
|
|
|
| void FragmentainerIterator::advance()
|
| @@ -62,7 +60,30 @@ void FragmentainerIterator::advance()
|
| if (atEnd())
|
| return;
|
| }
|
| - updateOutput();
|
| +}
|
| +
|
| +LayoutSize FragmentainerIterator::paginationOffset() const
|
| +{
|
| + DCHECK(!atEnd());
|
| + const MultiColumnFragmentainerGroup& group = currentGroup();
|
| + LayoutUnit fragmentainerLogicalTopInFlowThread = group.logicalTopInFlowThread() + m_currentFragmentainerIndex * group.logicalHeight();
|
| + return group.flowThreadTranslationAtOffset(fragmentainerLogicalTopInFlowThread, LayoutBox::AssociateWithLatterPage, CoordinateSpaceConversion::Visual);
|
| +}
|
| +
|
| +LayoutRect FragmentainerIterator::fragmentainerInFlowThread() const
|
| +{
|
| + DCHECK(!atEnd());
|
| + LayoutRect fragmentainerInFlowThread = currentGroup().flowThreadPortionRectAt(m_currentFragmentainerIndex);
|
| + m_flowThread.flipForWritingMode(fragmentainerInFlowThread);
|
| + return fragmentainerInFlowThread;
|
| +}
|
| +
|
| +LayoutRect FragmentainerIterator::clipRectInFlowThread() const
|
| +{
|
| + DCHECK(!atEnd());
|
| + LayoutRect clipRect = currentGroup().flowThreadPortionOverflowRectAt(m_currentFragmentainerIndex);
|
| + m_flowThread.flipForWritingMode(clipRect);
|
| + return clipRect;
|
| }
|
|
|
| const MultiColumnFragmentainerGroup& FragmentainerIterator::currentGroup() const
|
| @@ -99,39 +120,26 @@ bool FragmentainerIterator::setFragmentainersOfInterest()
|
| // might not have to walk the entire fragmentainer group.
|
| group.columnIntervalForBlockRangeInFlowThread(m_logicalTopInFlowThread, m_logicalBottomInFlowThread, m_currentFragmentainerIndex, m_endFragmentainerIndex);
|
|
|
| - // Now intersect with the fragmentainers that actually intersect with the visual clip rect, to
|
| - // narrow it down even further. The clip rect needs to be relative to the current fragmentainer
|
| - // group.
|
| - LayoutRect clipRect = m_clipRectInMulticolContainer;
|
| - LayoutSize offset = group.flowThreadTranslationAtOffset(group.logicalTopInFlowThread(), LayoutBox::AssociateWithFormerPage, CoordinateSpaceConversion::Visual);
|
| - clipRect.move(-offset);
|
| - unsigned firstFragmentainerInClipRect, lastFragmentainerInClipRect;
|
| - group.columnIntervalForVisualRect(clipRect, firstFragmentainerInClipRect, lastFragmentainerInClipRect);
|
| - // If the two fragmentainer intervals are disjoint, there's nothing of interest in this
|
| - // fragmentainer group.
|
| - if (firstFragmentainerInClipRect > m_endFragmentainerIndex || lastFragmentainerInClipRect < m_currentFragmentainerIndex)
|
| - return false;
|
| - if (m_currentFragmentainerIndex < firstFragmentainerInClipRect)
|
| - m_currentFragmentainerIndex = firstFragmentainerInClipRect;
|
| - if (m_endFragmentainerIndex > lastFragmentainerInClipRect)
|
| - m_endFragmentainerIndex = lastFragmentainerInClipRect;
|
| + if (hasClipRect()) {
|
| + // Now intersect with the fragmentainers that actually intersect with the visual clip rect, to
|
| + // narrow it down even further. The clip rect needs to be relative to the current fragmentainer
|
| + // group.
|
| + LayoutRect clipRect = m_clipRectInMulticolContainer;
|
| + LayoutSize offset = group.flowThreadTranslationAtOffset(group.logicalTopInFlowThread(), LayoutBox::AssociateWithFormerPage, CoordinateSpaceConversion::Visual);
|
| + clipRect.move(-offset);
|
| + unsigned firstFragmentainerInClipRect, lastFragmentainerInClipRect;
|
| + group.columnIntervalForVisualRect(clipRect, firstFragmentainerInClipRect, lastFragmentainerInClipRect);
|
| + // If the two fragmentainer intervals are disjoint, there's nothing of interest in this
|
| + // fragmentainer group.
|
| + if (firstFragmentainerInClipRect > m_endFragmentainerIndex || lastFragmentainerInClipRect < m_currentFragmentainerIndex)
|
| + return false;
|
| + if (m_currentFragmentainerIndex < firstFragmentainerInClipRect)
|
| + m_currentFragmentainerIndex = firstFragmentainerInClipRect;
|
| + if (m_endFragmentainerIndex > lastFragmentainerInClipRect)
|
| + m_endFragmentainerIndex = lastFragmentainerInClipRect;
|
| + }
|
| DCHECK(m_endFragmentainerIndex >= m_currentFragmentainerIndex);
|
| return true;
|
| }
|
|
|
| -void FragmentainerIterator::updateOutput()
|
| -{
|
| - const MultiColumnFragmentainerGroup& group = currentGroup();
|
| -
|
| - // Set the physical translation offset.
|
| - LayoutUnit fragmentainerLogicalTopInFlowThread = group.logicalTopInFlowThread() + m_currentFragmentainerIndex * group.logicalHeight();
|
| - m_paginationOffset = group.flowThreadTranslationAtOffset(fragmentainerLogicalTopInFlowThread, LayoutBox::AssociateWithLatterPage, CoordinateSpaceConversion::Visual);
|
| -
|
| - // Set the overflow clip rect that corresponds to the fragmentainer.
|
| - m_clipRectInFlowThread = group.flowThreadPortionOverflowRectAt(m_currentFragmentainerIndex);
|
| -
|
| - // Flip it into a physical rectangle.
|
| - m_flowThread.flipForWritingMode(m_clipRectInFlowThread);
|
| -}
|
| -
|
| } // namespace blink
|
|
|