mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Auto merge of #7313 - pcwalton:position-relative-percentage-overflow, r=mbrubeck
layout: Make overflow calculation take relative percentages into account. This necessitated changing overflow to be calculated by the parent flow if relatively positioned children are present. That is because the overflow regions cannot be calculated without knowing relative offsets, which themselves cannot be calculated without knowing the parent size (because of percentages). To accomplish this without sacrificing parallelism in the non-relative case, this patch splits overflow into "early" and "late" computation. Late overflow computation cannot be parallelized across children, while early overflow computation can. Makes the "Apple Music" text show up over the full-bleed promotional background on apple.com. r? @SimonSapin -- would appreciate a look over the iframe test case that was changed. <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/7313) <!-- Reviewable:end -->
This commit is contained in:
commit
dcaf66397a
19 changed files with 223 additions and 108 deletions
|
@ -1645,10 +1645,10 @@ impl Flow for InlineFlow {
|
|||
let stacking_relative_border_box =
|
||||
fragment.stacking_relative_border_box(&self.base.stacking_relative_position,
|
||||
&self.base
|
||||
.absolute_position_info
|
||||
.early_absolute_position_info
|
||||
.relative_containing_block_size,
|
||||
self.base
|
||||
.absolute_position_info
|
||||
.early_absolute_position_info
|
||||
.relative_containing_block_mode,
|
||||
CoordinateSystem::Parent);
|
||||
let clip = fragment.clipping_region_for_children(&self.base.clip,
|
||||
|
@ -1661,13 +1661,14 @@ impl Flow for InlineFlow {
|
|||
flow::mut_base(flow).clip = clip;
|
||||
|
||||
let block_flow = flow.as_mut_block();
|
||||
block_flow.base.absolute_position_info = self.base.absolute_position_info;
|
||||
block_flow.base.late_absolute_position_info =
|
||||
self.base.late_absolute_position_info;
|
||||
|
||||
let stacking_relative_position = self.base.stacking_relative_position;
|
||||
if is_positioned {
|
||||
let padding_box_origin = containing_block_positions.next().unwrap();
|
||||
block_flow.base
|
||||
.absolute_position_info
|
||||
.late_absolute_position_info
|
||||
.stacking_relative_position_of_absolute_containing_block =
|
||||
stacking_relative_position + *padding_box_origin;
|
||||
}
|
||||
|
@ -1681,7 +1682,8 @@ impl Flow for InlineFlow {
|
|||
let flow = flow_ref::deref_mut(&mut info.flow_ref);
|
||||
flow::mut_base(flow).clip = clip;
|
||||
let block_flow = flow.as_mut_block();
|
||||
block_flow.base.absolute_position_info = self.base.absolute_position_info;
|
||||
block_flow.base.late_absolute_position_info =
|
||||
self.base.late_absolute_position_info;
|
||||
|
||||
block_flow.base.stacking_relative_position =
|
||||
stacking_relative_border_box.origin;
|
||||
|
@ -1693,12 +1695,13 @@ impl Flow for InlineFlow {
|
|||
flow::mut_base(flow).clip = clip;
|
||||
|
||||
let block_flow = flow.as_mut_block();
|
||||
block_flow.base.absolute_position_info = self.base.absolute_position_info;
|
||||
block_flow.base.late_absolute_position_info =
|
||||
self.base.late_absolute_position_info;
|
||||
|
||||
let stacking_relative_position = self.base.stacking_relative_position;
|
||||
let padding_box_origin = containing_block_positions.next().unwrap();
|
||||
block_flow.base
|
||||
.absolute_position_info
|
||||
.late_absolute_position_info
|
||||
.stacking_relative_position_of_absolute_containing_block =
|
||||
stacking_relative_position + *padding_box_origin;
|
||||
|
||||
|
@ -1725,7 +1728,8 @@ impl Flow for InlineFlow {
|
|||
fn compute_overflow(&self) -> Rect<Au> {
|
||||
let mut overflow = ZERO_RECT;
|
||||
for fragment in &self.fragments.fragments {
|
||||
overflow = overflow.union(&fragment.compute_overflow())
|
||||
overflow = overflow.union(&fragment.compute_overflow(
|
||||
&self.base.early_absolute_position_info.relative_containing_block_size))
|
||||
}
|
||||
overflow
|
||||
}
|
||||
|
@ -1742,9 +1746,9 @@ impl Flow for InlineFlow {
|
|||
|
||||
let stacking_relative_position = &self.base.stacking_relative_position;
|
||||
let relative_containing_block_size =
|
||||
&self.base.absolute_position_info.relative_containing_block_size;
|
||||
&self.base.early_absolute_position_info.relative_containing_block_size;
|
||||
let relative_containing_block_mode =
|
||||
self.base.absolute_position_info.relative_containing_block_mode;
|
||||
self.base.early_absolute_position_info.relative_containing_block_mode;
|
||||
iterator.process(fragment,
|
||||
level,
|
||||
&fragment.stacking_relative_border_box(stacking_relative_position,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue