Changeset 249437 in webkit
- Timestamp:
- Sep 3, 2019 12:21:48 PM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r249436 r249437 1 2019-09-03 Zalan Bujtas <zalan@apple.com> 2 3 [LFC][Floats] Do not pass FloatingState to FloatAvoider/FloatBox 4 https://bugs.webkit.org/show_bug.cgi?id=201405 5 <rdar://problem/54956381> 6 7 Reviewed by Antti Koivisto. 8 9 This is in preparation for transitioning the floating codebase to use the formatting context for 10 retrieving display boxes. Now FloatAvoiders/FloatBoxes don't need the FloatingState to compute absolute display boxes. 11 12 * layout/floats/FloatAvoider.cpp: 13 (WebCore::Layout::FloatAvoider::FloatAvoider): 14 (WebCore::Layout::FloatAvoider::setHorizontalConstraints): 15 (WebCore::Layout::FloatAvoider::initialHorizontalPosition const): 16 (WebCore::Layout::FloatAvoider::overflowsContainingBlock const): 17 (WebCore::Layout::FloatAvoider::rectInContainingBlock const): 18 * layout/floats/FloatAvoider.h: 19 (WebCore::Layout::FloatAvoider::floatingState const): Deleted. 20 * layout/floats/FloatBox.cpp: 21 (WebCore::Layout::FloatBox::FloatBox): 22 (WebCore::Layout::FloatBox::initialVerticalPosition const): 23 * layout/floats/FloatBox.h: 24 * layout/floats/FloatingContext.cpp: 25 (WebCore::Layout::mapToFormattingContextRoot): 26 (WebCore::Layout::FloatingContext::positionForFloat const): 27 (WebCore::Layout::FloatingContext::positionForFormattingContextRoot const): 28 * platform/graphics/LayoutPoint.h: 29 (WebCore::LayoutPoint::isZero const): 30 1 31 2019-09-03 Jiewen Tan <jiewen_tan@apple.com> 2 32 -
trunk/Source/WebCore/layout/floats/FloatAvoider.cpp
r245776 r249437 39 39 WTF_MAKE_ISO_ALLOCATED_IMPL(FloatAvoider); 40 40 41 FloatAvoider::FloatAvoider(const Box& layoutBox, const FloatingState& floatingState, const LayoutState& layoutState)41 FloatAvoider::FloatAvoider(const Box& layoutBox, Display::Box absoluteDisplayBox, LayoutPoint containingBlockAbsoluteTopLeft, HorizontalEdges containingBlockAbsoluteContentBox) 42 42 : m_layoutBox(makeWeakPtr(layoutBox)) 43 , m_ floatingState(floatingState)44 , m_ absoluteDisplayBox(FormattingContext::mapBoxToAncestor(layoutState, layoutBox, downcast<Container>(floatingState.root())))45 , m_containingBlockAbsolute DisplayBox(layoutBox.containingBlock() == &floatingState.root() ? Display::Box(layoutState.displayBoxForLayoutBox(*layoutBox.containingBlock())) : FormattingContext::mapBoxToAncestor(layoutState, *layoutBox.containingBlock(), downcast<Container>(floatingState.root())))43 , m_absoluteDisplayBox(absoluteDisplayBox) 44 , m_containingBlockAbsoluteTopLeft(containingBlockAbsoluteTopLeft) 45 , m_containingBlockAbsoluteContentBox(containingBlockAbsoluteContentBox) 46 46 { 47 47 ASSERT(m_layoutBox->establishesBlockFormattingContext()); … … 60 60 // Horizontal position is constrained by the containing block's content box. 61 61 // Compute the horizontal position for the new floating by taking both the contining block and the current left/right floats into account. 62 auto containingBlockContentBoxLeft = m_containingBlockAbsoluteDisplayBox.left() + m_containingBlockAbsoluteDisplayBox.contentBoxLeft();63 62 if (isLeftAligned()) 64 return std::max<PositionInContextRoot>({ containingBlockContentBoxLeft + marginStart() }, left);63 return std::max<PositionInContextRoot>({ m_containingBlockAbsoluteContentBox.left + marginStart() }, left); 65 64 66 65 // Make sure it does not overflow the containing block on the right. 67 auto containingBlockContentBoxRight = containingBlockContentBoxLeft + m_containingBlockAbsoluteDisplayBox.contentBoxWidth(); 68 return std::min<PositionInContextRoot>(left, { containingBlockContentBoxRight - marginBoxWidth() + marginStart() }); 66 return std::min<PositionInContextRoot>(left, { m_containingBlockAbsoluteContentBox.right - marginBoxWidth() + marginStart() }); 69 67 }; 70 68 … … 91 89 { 92 90 // Align the box with the containing block's content box. 93 auto containingBlockContentBoxLeft = m_containingBlockAbsoluteDisplayBox.left() + m_containingBlockAbsoluteDisplayBox.contentBoxLeft(); 94 auto containingBlockContentBoxRight = containingBlockContentBoxLeft + m_containingBlockAbsoluteDisplayBox.contentBoxWidth(); 95 96 auto left = isLeftAligned() ? containingBlockContentBoxLeft : containingBlockContentBoxRight - marginBoxWidth(); 91 auto left = isLeftAligned() ? m_containingBlockAbsoluteContentBox.left : m_containingBlockAbsoluteContentBox.right - marginBoxWidth(); 97 92 left += marginStart(); 98 99 93 return { left }; 100 94 } … … 102 96 bool FloatAvoider::overflowsContainingBlock() const 103 97 { 104 auto containingBlockContentBoxLeft = m_containingBlockAbsoluteDisplayBox.left() + m_containingBlockAbsoluteDisplayBox.contentBoxLeft();105 98 auto left = displayBox().left() - marginStart(); 106 107 if (containingBlockContentBoxLeft > left) 99 if (m_containingBlockAbsoluteContentBox.left > left) 108 100 return true; 109 101 110 auto containingBlockContentBoxRight = containingBlockContentBoxLeft + m_containingBlockAbsoluteDisplayBox.contentBoxWidth();111 102 auto right = displayBox().right() + marginEnd(); 112 113 return containingBlockContentBoxRight < right; 103 return m_containingBlockAbsoluteContentBox.right < right; 114 104 } 115 105 … … 117 107 { 118 108 // From formatting root coordinate system back to containing block's. 119 if ( layoutBox().containingBlock() == &floatingState().root())109 if (m_containingBlockAbsoluteTopLeft.isZero()) 120 110 return m_absoluteDisplayBox.rect(); 121 111 122 112 return { 123 m_absoluteDisplayBox.top() - m_containingBlockAbsolute DisplayBox.top(),124 m_absoluteDisplayBox.left() - m_containingBlockAbsolute DisplayBox.left(),113 m_absoluteDisplayBox.top() - m_containingBlockAbsoluteTopLeft.y(), 114 m_absoluteDisplayBox.left() - m_containingBlockAbsoluteTopLeft.x(), 125 115 m_absoluteDisplayBox.width(), 126 116 m_absoluteDisplayBox.height() -
trunk/Source/WebCore/layout/floats/FloatAvoider.h
r245776 r249437 44 44 WTF_MAKE_ISO_ALLOCATED(FloatAvoider); 45 45 public: 46 FloatAvoider(const Box&, const FloatingState&, const LayoutState&);46 FloatAvoider(const Box&, Display::Box absoluteDisplayBox, LayoutPoint containingBlockAbsoluteTopLeft, HorizontalEdges containingBlockAbsoluteContentBox); 47 47 virtual ~FloatAvoider() = default; 48 48 … … 76 76 LayoutUnit marginBoxWidth() const { return marginStart() + displayBox().width() + marginEnd(); } 77 77 78 const FloatingState& floatingState() const { return m_floatingState; }79 78 const Box& layoutBox() const { return *m_layoutBox; } 80 79 const Display::Box& displayBox() const { return m_absoluteDisplayBox; } … … 83 82 private: 84 83 WeakPtr<const Box> m_layoutBox; 85 const FloatingState& m_floatingState;84 // These coordinate values are relative to the formatting root's border box. 86 85 Display::Box m_absoluteDisplayBox; 87 Display::Box m_containingBlockAbsoluteDisplayBox; 86 LayoutPoint m_containingBlockAbsoluteTopLeft; 87 HorizontalEdges m_containingBlockAbsoluteContentBox; 88 88 }; 89 89 -
trunk/Source/WebCore/layout/floats/FloatBox.cpp
r245776 r249437 36 36 WTF_MAKE_ISO_ALLOCATED_IMPL(FloatBox); 37 37 38 FloatBox::FloatBox(const Box& layoutBox, const FloatingState& floatingState, const LayoutState& layoutState)39 : FloatAvoider(layoutBox, floatingState, layoutState)38 FloatBox::FloatBox(const Box& layoutBox, Display::Box absoluteDisplayBox, LayoutPoint containingBlockAbsoluteTopLeft, HorizontalEdges containingBlockAbsoluteContentBox, Optional<LayoutUnit> previousFloatAbsoluteTop) 39 : FloatAvoider(layoutBox, absoluteDisplayBox, containingBlockAbsoluteTopLeft, containingBlockAbsoluteContentBox) 40 40 { 41 displayBox().setTopLeft({ initialHorizontalPosition(), initialVerticalPosition( ) });41 displayBox().setTopLeft({ initialHorizontalPosition(), initialVerticalPosition(previousFloatAbsoluteTop) }); 42 42 } 43 43 … … 61 61 } 62 62 63 PositionInContextRoot FloatBox::initialVerticalPosition( ) const63 PositionInContextRoot FloatBox::initialVerticalPosition(Optional<LayoutUnit> previousFloatAbsoluteTop) const 64 64 { 65 65 // Incoming float cannot be placed higher than existing floats (margin box of the last float). 66 66 // Take the static position (where the box would go if it wasn't floating) and adjust it with the last float. 67 67 auto top = displayBox().top() - marginBefore(); 68 if ( auto lastFloat = floatingState().last())69 top = std::max(top, lastFloat->rectWithMargin().top());68 if (previousFloatAbsoluteTop) 69 top = std::max(top, *previousFloatAbsoluteTop); 70 70 top += marginBefore(); 71 71 -
trunk/Source/WebCore/layout/floats/FloatBox.h
r245776 r249437 42 42 WTF_MAKE_ISO_ALLOCATED(FloatBox); 43 43 public: 44 FloatBox(const Box&, const FloatingState&, const LayoutState&);44 FloatBox(const Box&, Display::Box absoluteDisplayBox, LayoutPoint containingBlockAbsoluteTopLeft, HorizontalEdges containingBlockAbsoluteContentBox, Optional<LayoutUnit> previousFloatAbsoluteTop); 45 45 46 46 Display::Rect rect() const final; … … 52 52 PositionInContextRoot verticalPositionCandidate(PositionInContextRoot) final; 53 53 54 PositionInContextRoot initialVerticalPosition( ) const;54 PositionInContextRoot initialVerticalPosition(Optional<LayoutUnit> previousFloatAbsoluteTop) const; 55 55 }; 56 56 -
trunk/Source/WebCore/layout/floats/FloatingContext.cpp
r249433 r249437 151 151 #endif 152 152 153 struct AbsoluteCoordinateValuesForFloatAvoider { 154 Display::Box displayBox; 155 LayoutPoint containingBlockTopLeft; 156 HorizontalEdges containingBlockContentBox; 157 }; 158 static AbsoluteCoordinateValuesForFloatAvoider mapToFormattingContextRoot(const Box& layoutBox, const Container& formattingContextRoot, const LayoutState& layoutState) 159 { 160 auto& containingBlock = *layoutBox.containingBlock(); 161 auto displayBox = FormattingContext::mapBoxToAncestor(layoutState, layoutBox, formattingContextRoot); 162 163 if (&containingBlock == &formattingContextRoot) { 164 auto containingBlockDisplayBox = layoutState.displayBoxForLayoutBox(containingBlock); 165 return { displayBox, { }, { containingBlockDisplayBox.contentBoxLeft(), containingBlockDisplayBox.contentBoxRight() } }; 166 } 167 auto containingBlockAbsoluteDisplayBox = FormattingContext::mapBoxToAncestor(layoutState, containingBlock, formattingContextRoot); 168 auto containingBlockLeft = containingBlockAbsoluteDisplayBox.left(); 169 return { displayBox, containingBlockAbsoluteDisplayBox.topLeft(), { containingBlockLeft + containingBlockAbsoluteDisplayBox.contentBoxLeft(), containingBlockLeft + containingBlockAbsoluteDisplayBox.contentBoxRight() } }; 170 } 171 153 172 FloatingContext::FloatingContext(const Container& formattingContextRoot, FloatingState& floatingState) 154 173 : m_root(makeWeakPtr(formattingContextRoot)) … … 180 199 181 200 // Find the top most position where the float box fits. 182 FloatBox floatBox = { layoutBox, m_floatingState, layoutState() }; 201 auto absoluteDisplayBoxCoordinates = mapToFormattingContextRoot(layoutBox, downcast<Container>(m_floatingState.root()), layoutState()); 202 203 Optional<LayoutUnit> previousFloatAbsoluteTop; 204 if (!isEmpty()) 205 previousFloatAbsoluteTop = floatingState().floats().last().rectWithMargin().top(); 206 auto floatBox = FloatBox { layoutBox, absoluteDisplayBoxCoordinates.displayBox, absoluteDisplayBoxCoordinates.containingBlockTopLeft, absoluteDisplayBoxCoordinates.containingBlockContentBox, previousFloatAbsoluteTop }; 183 207 findPositionForFloatBox(floatBox); 184 208 return floatBox.rectInContainingBlock().topLeft(); … … 195 219 return { }; 196 220 197 FloatAvoider floatAvoider = { layoutBox, m_floatingState, layoutState() }; 221 auto absoluteDisplayBoxCoordinates = mapToFormattingContextRoot(layoutBox, downcast<Container>(m_floatingState.root()), layoutState()); 222 auto floatAvoider = FloatAvoider { layoutBox, absoluteDisplayBoxCoordinates.displayBox, absoluteDisplayBoxCoordinates.containingBlockTopLeft, absoluteDisplayBoxCoordinates.containingBlockContentBox }; 198 223 findPositionForFormattingContextRoot(floatAvoider); 199 224 return { floatAvoider.rectInContainingBlock().topLeft() }; -
trunk/Source/WebCore/platform/graphics/LayoutPoint.h
r245543 r249437 45 45 46 46 static LayoutPoint zero() { return LayoutPoint(); } 47 bool isZero() const { return !m_x && !m_y; } 47 48 48 49 LayoutUnit x() const { return m_x; }
Note: See TracChangeset
for help on using the changeset viewer.