WebKit Bugzilla
Attachment 372198 Details for
Bug 198889
: [LFC][Floats] Add bottom value to FloatingState::Constraints
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-198889-20190615123646.patch (text/plain), 8.57 KB, created by
zalan
on 2019-06-15 12:36:46 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
zalan
Created:
2019-06-15 12:36:46 PDT
Size:
8.57 KB
patch
obsolete
>Subversion Revision: 246468 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 52d386e418b722d84edb41ae945659ffaa7b00cd..ca2b6fc3c4e2f53777e8cc6d9c74444e05fdcb1e 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,18 @@ >+2019-06-15 Zalan Bujtas <zalan@apple.com> >+ >+ [LFC][Floats] Add bottom value to FloatingState::Constraints >+ https://bugs.webkit.org/show_bug.cgi?id=198889 >+ <rdar://problem/51776730> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Constraints::left/right->y indicates where this particular constrain ends. This is going to be used by inline layout to figure where >+ the next line should go (vertical position). >+ >+ * layout/floats/FloatingState.cpp: >+ (WebCore::Layout::FloatingState::constraints const): >+ * layout/floats/FloatingState.h: >+ > 2019-06-15 Zalan Bujtas <zalan@apple.com> > > [LFC] Add Layout::Box::isContainingBlockDescendantOf >diff --git a/Source/WebCore/layout/LayoutUnits.h b/Source/WebCore/layout/LayoutUnits.h >index 08927bffb5f3a3c499e14e3c21e1cbf8ba3d6581..24193145f9a97ba1c4f3b6d330a7a1f7830dbb2d 100644 >--- a/Source/WebCore/layout/LayoutUnits.h >+++ b/Source/WebCore/layout/LayoutUnits.h >@@ -60,6 +60,7 @@ struct Point { > Point(LayoutUnit, LayoutUnit); > Point(LayoutPoint); > void moveBy(LayoutPoint); >+ void moveBy(LayoutSize); > operator LayoutPoint() const { return { x, y }; } > }; > >@@ -85,6 +86,12 @@ inline void Point::moveBy(LayoutPoint offset) > y += offset.y(); > } > >+inline void Point::moveBy(LayoutSize offset) >+{ >+ x += offset.width(); >+ y += offset.height(); >+} >+ > // Margin, border, padding > struct HorizontalEdges { > LayoutUnit left; >diff --git a/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp b/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp >index ec09697b9731187efaeb6b532a2c039c66770954..42c6fd83388572d01ddb60040078cc77df6a8a28 100644 >--- a/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp >+++ b/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp >@@ -148,8 +148,10 @@ Optional<LayoutUnit> BlockFormattingContext::usedAvailableWidthForFloatAvoider(c > auto containingBlockContentBoxRight = containingBlockRight - containingBlockDisplayBox.borderRight() + containingBlockDisplayBox.paddingRight().valueOr(0); > > // Shrink the available space if the floats are actually intruding at this vertical position. >- availableWidth -= (std::max<LayoutUnit>(0, constraints.left.valueOr(PositionInContextRoot { 0 }) - containingBlockContentBoxLeft) >- + std::max<LayoutUnit>(0, containingBlockContentBoxRight - constraints.right.valueOr(PositionInContextRoot { containingBlockContentBoxRight }))); >+ if (constraints.left) >+ availableWidth -= std::max<LayoutUnit>(0, constraints.left->x - containingBlockContentBoxLeft); >+ if (constraints.right) >+ availableWidth -= std::max<LayoutUnit>(0, containingBlockContentBoxRight - constraints.right->x); > return availableWidth; > } > >diff --git a/Source/WebCore/layout/floats/FloatingState.cpp b/Source/WebCore/layout/floats/FloatingState.cpp >index 7651ec696c6de27606b4d9916840e33c89c0c611..50d24ee26b8cc4643f0dbff5bfa1b8a9e3582ece 100644 >--- a/Source/WebCore/layout/floats/FloatingState.cpp >+++ b/Source/WebCore/layout/floats/FloatingState.cpp >@@ -119,9 +119,12 @@ FloatingState::Constraints FloatingState::constraints(PositionInContextRoot vert > // 3. Convert left/right positions back to formattingContextRoot's cooridnate system. > auto coordinateMappingIsRequired = &root() != &formattingContextRoot; > auto adjustedPosition = Point { 0, verticalPosition }; >+ LayoutSize adjustingDelta; > >- if (coordinateMappingIsRequired) >+ if (coordinateMappingIsRequired) { > adjustedPosition = FormattingContext::mapPointToAncestor(m_layoutState, adjustedPosition, downcast<Container>(formattingContextRoot), downcast<Container>(root())); >+ adjustingDelta = { adjustedPosition.x, adjustedPosition.y - verticalPosition }; >+ } > > Constraints constraints; > for (int index = m_floats.size() - 1; index >= 0; --index) { >@@ -138,9 +141,9 @@ FloatingState::Constraints FloatingState::constraints(PositionInContextRoot vert > continue; > > if (floatItem.isLeftPositioned()) >- constraints.left = PositionInContextRoot { rect.right() }; >+ constraints.left = PointInContextRoot { rect.right(), rect.bottom() }; > else >- constraints.right = PositionInContextRoot { rect.left() }; >+ constraints.right = PointInContextRoot { rect.left(), rect.bottom() }; > > if (constraints.left && constraints.right) > break; >@@ -148,12 +151,11 @@ FloatingState::Constraints FloatingState::constraints(PositionInContextRoot vert > > if (coordinateMappingIsRequired) { > if (constraints.left) >- constraints.left = PositionInContextRoot { *constraints.left - adjustedPosition.x }; >+ constraints.left->moveBy(-adjustingDelta); > > if (constraints.right) >- constraints.right = PositionInContextRoot { *constraints.right - adjustedPosition.x }; >+ constraints.right->moveBy(-adjustingDelta); > } >- > return constraints; > } > >diff --git a/Source/WebCore/layout/floats/FloatingState.h b/Source/WebCore/layout/floats/FloatingState.h >index f253f2c3e4d8dece6a52e8c0a563e6a2a4d87f41..7e491dbb66484e2e88cf17b5ba51203f8afa70f0 100644 >--- a/Source/WebCore/layout/floats/FloatingState.h >+++ b/Source/WebCore/layout/floats/FloatingState.h >@@ -60,8 +60,8 @@ public: > Optional<PositionInContextRoot> bottom(const Box& formattingContextRoot) const; > > struct Constraints { >- Optional<PositionInContextRoot> left; >- Optional<PositionInContextRoot> right; >+ Optional<PointInContextRoot> left; >+ Optional<PointInContextRoot> right; > }; > Constraints constraints(PositionInContextRoot verticalPosition, const Box& formattingContextRoot) const; > >diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp b/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >index 2032caf676ef336244b322697f0090524f562a02..62ce23b4d684a14c6513dd78e898b14fc99e3dcb 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >@@ -230,23 +230,23 @@ void InlineFormattingContext::LineLayout::layout(LayoutUnit widthConstraint) con > auto lineLogicalLeft = lineHorizontalConstraint.logicalTopLeft.x(); > auto floatConstraints = m_floatingState.constraints({ lineLogicalTop }, m_formattingRoot); > // Check if these constraints actually put limitation on the line. >- if (floatConstraints.left && *floatConstraints.left <= formattingRootDisplayBox.contentBoxLeft()) >+ if (floatConstraints.left && floatConstraints.left->x <= formattingRootDisplayBox.contentBoxLeft()) > floatConstraints.left = { }; > >- if (floatConstraints.right && *floatConstraints.right >= formattingRootDisplayBox.contentBoxRight()) >+ if (floatConstraints.right && floatConstraints.right->x >= formattingRootDisplayBox.contentBoxRight()) > floatConstraints.right = { }; > > if (floatConstraints.left && floatConstraints.right) { >- ASSERT(*floatConstraints.left < *floatConstraints.right); >- availableWidth = *floatConstraints.right - *floatConstraints.left; >- lineLogicalLeft = *floatConstraints.left; >+ ASSERT(floatConstraints.left->x < floatConstraints.right->x); >+ availableWidth = floatConstraints.right->x - floatConstraints.left->x; >+ lineLogicalLeft = floatConstraints.left->x; > } else if (floatConstraints.left) { >- ASSERT(*floatConstraints.left > lineLogicalLeft); >- availableWidth -= (*floatConstraints.left - lineLogicalLeft); >- lineLogicalLeft = *floatConstraints.left; >+ ASSERT(floatConstraints.left->x > lineLogicalLeft); >+ availableWidth -= (floatConstraints.left->x - lineLogicalLeft); >+ lineLogicalLeft = floatConstraints.left->x; > } else if (floatConstraints.right) { >- ASSERT(*floatConstraints.right > lineLogicalLeft); >- availableWidth = *floatConstraints.right - lineLogicalLeft; >+ ASSERT(floatConstraints.right->x > lineLogicalLeft); >+ availableWidth = floatConstraints.right->x - lineLogicalLeft; > } > lineHorizontalConstraint.availableLogicalWidth = availableWidth; > lineHorizontalConstraint.logicalTopLeft.setX(lineLogicalLeft);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
koivisto
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 198889
:
372192
|
372193
| 372198