Index: third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc |
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc b/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc |
index 543000a1f6d39c1aeab44e2d388ef4130d68ae28..123efd1d75ff8929fa4a54b211d66745c9054684 100644 |
--- a/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc |
+++ b/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc |
@@ -36,26 +36,22 @@ NGLogicalOffset AdjustToTopEdgeAlignmentRule(const NGConstraintSpace& space, |
// @param space Constraint space that is used to find layout opportunity for |
// the fragment. |
// @param fragment Fragment that needs to be placed. |
-// @param origin_point {@code space}'s offset relative to the space that |
-// establishes a new formatting context that we're currently |
-// in and where all our exclusions reside. |
-// @param margins Margins of the fragment. |
-// @param available_size Available size used by the layout opportunity iterator. |
+// @param floating_object Floating object for which we need to find a layout |
+// opportunity. |
// @return Layout opportunity for the fragment. |
const NGLayoutOpportunity FindLayoutOpportunityForFragment( |
const NGConstraintSpace* space, |
const NGFragment& fragment, |
- const NGLogicalOffset& origin_point, |
- const NGBoxStrut& margins, |
- const NGLogicalSize& available_size) { |
+ const NGFloatingObject* floating_object) { |
NGLogicalOffset adjusted_origin_point = |
- AdjustToTopEdgeAlignmentRule(*space, origin_point); |
+ AdjustToTopEdgeAlignmentRule(*space, floating_object->origin_offset); |
- NGLayoutOpportunityIterator opportunity_iter(space, available_size, |
- adjusted_origin_point); |
+ NGLayoutOpportunityIterator opportunity_iter( |
+ space, floating_object->available_size, adjusted_origin_point); |
NGLayoutOpportunity opportunity; |
NGLayoutOpportunity opportunity_candidate = opportunity_iter.Next(); |
+ NGBoxStrut margins = floating_object->margins; |
while (!opportunity_candidate.IsEmpty()) { |
opportunity = opportunity_candidate; |
// Checking opportunity's block size is not necessary as a float cannot be |
@@ -73,25 +69,20 @@ const NGLayoutOpportunity FindLayoutOpportunityForFragment( |
NGLogicalOffset CalculateLogicalOffsetForOpportunity( |
const NGLayoutOpportunity& opportunity, |
const LayoutUnit float_offset, |
- const NGLogicalOffset& from_offset, |
- NGFloatingObject* floating_object) { |
+ const NGFloatingObject* floating_object) { |
DCHECK(floating_object); |
auto margins = floating_object->margins; |
// Adjust to child's margin. |
- LayoutUnit inline_offset = margins.inline_start; |
- LayoutUnit block_offset = margins.block_start; |
+ NGLogicalOffset result = margins.InlineBlockStartOffset(); |
// Offset from the opportunity's block/inline start. |
- inline_offset += opportunity.offset.inline_offset; |
- block_offset += opportunity.offset.block_offset; |
+ result += opportunity.offset; |
// Adjust to float: right offset if needed. |
- inline_offset += float_offset; |
+ result.inline_offset += float_offset; |
- block_offset -= from_offset.block_offset; |
- inline_offset -= from_offset.inline_offset; |
- |
- return NGLogicalOffset(inline_offset, block_offset); |
+ result -= floating_object->from_offset; |
+ return result; |
} |
// Creates an exclusion from the fragment that will be placed in the provided |
@@ -119,32 +110,25 @@ void UpdateFloatingObjectLeftOffset(const NGConstraintSpace& new_parent_space, |
NGFloatingObject* floating_object) { |
DCHECK(floating_object); |
// TODO(glebl): We should use physical offset here. |
- floating_object->left_offset = |
- floating_object->original_parent_space->BfcOffset().inline_offset - |
- new_parent_space.BfcOffset().inline_offset + |
- float_logical_offset.inline_offset; |
+ floating_object->left_offset = floating_object->from_offset.inline_offset - |
+ new_parent_space.BfcOffset().inline_offset + |
+ float_logical_offset.inline_offset; |
} |
} // namespace |
-// Calculates the relative position from {@code from_offset} of the |
-// floating object that is requested to be positioned from {@code origin_point}. |
-NGLogicalOffset PositionFloat(const NGLogicalOffset& origin_point, |
- const NGLogicalOffset& from_offset, |
- NGFloatingObject* floating_object, |
+NGLogicalOffset PositionFloat(NGFloatingObject* floating_object, |
NGConstraintSpace* new_parent_space) { |
DCHECK(floating_object); |
- const auto* float_space = floating_object->space.get(); |
DCHECK(floating_object->fragment) << "Fragment cannot be null here"; |
// TODO(ikilpatrick): The writing mode switching here looks wrong. |
NGBoxFragment float_fragment( |
- float_space->WritingMode(), |
+ floating_object->writing_mode, |
toNGPhysicalBoxFragment(floating_object->fragment.get())); |
// Find a layout opportunity that will fit our float. |
const NGLayoutOpportunity opportunity = FindLayoutOpportunityForFragment( |
- new_parent_space, float_fragment, origin_point, floating_object->margins, |
- floating_object->available_size); |
+ new_parent_space, float_fragment, floating_object); |
DCHECK(!opportunity.IsEmpty()) << "Opportunity is empty but it shouldn't be"; |
// Calculate the float offset if needed. |
@@ -162,9 +146,27 @@ NGLogicalOffset PositionFloat(const NGLogicalOffset& origin_point, |
new_parent_space->AddExclusion(exclusion); |
NGLogicalOffset logical_offset = CalculateLogicalOffsetForOpportunity( |
- opportunity, float_offset, from_offset, floating_object); |
+ opportunity, float_offset, floating_object); |
UpdateFloatingObjectLeftOffset(*new_parent_space, logical_offset, |
floating_object); |
return logical_offset; |
} |
+ |
+void PositionPendingFloats(const LayoutUnit& origin_block_offset, |
+ NGConstraintSpace* space, |
+ NGFragmentBuilder* builder) { |
+ DCHECK(builder) << "Builder cannot be null here"; |
+ DCHECK(builder->BfcOffset()) << "Parent BFC offset should be known here"; |
+ LayoutUnit bfc_block_offset = builder->BfcOffset().value().block_offset; |
+ |
+ for (auto& floating_object : builder->UnpositionedFloats()) { |
+ floating_object->origin_offset.block_offset = origin_block_offset; |
+ floating_object->from_offset.block_offset = bfc_block_offset; |
+ |
+ NGLogicalOffset offset = PositionFloat(floating_object.get(), space); |
+ builder->AddFloatingObject(floating_object, offset); |
+ } |
+ builder->MutableUnpositionedFloats().clear(); |
+} |
+ |
} // namespace blink |