Move AbsoluteBoxOffsets into HoistedSharedFragment

This commit is contained in:
Manish Goregaokar 2020-07-24 15:14:48 -07:00
parent d476a10773
commit bc704d8a3d

View file

@ -41,8 +41,6 @@ pub(crate) struct HoistedAbsolutelyPositionedBox {
/// static positions when going up the tree. /// static positions when going up the tree.
pub(crate) tree_rank: usize, pub(crate) tree_rank: usize,
box_offsets: Vec2<AbsoluteBoxOffsets>,
/// A reference to a Fragment which is shared between this `HoistedAbsolutelyPositionedBox` /// A reference to a Fragment which is shared between this `HoistedAbsolutelyPositionedBox`
/// and its placeholder `AbsoluteOrFixedPositionedFragment` in the original tree position. /// and its placeholder `AbsoluteOrFixedPositionedFragment` in the original tree position.
/// This will be used later in order to paint this hoisted box in tree order. /// This will be used later in order to paint this hoisted box in tree order.
@ -54,16 +52,20 @@ pub(crate) struct HoistedAbsolutelyPositionedBox {
/// This will be used later in order to paint this hoisted box in tree order. /// This will be used later in order to paint this hoisted box in tree order.
#[derive(Serialize)] #[derive(Serialize)]
pub(crate) struct HoistedSharedFragment { pub(crate) struct HoistedSharedFragment {
pub fragment: Option<ArcRefCell<Fragment>>, pub(crate) fragment: Option<ArcRefCell<Fragment>>,
pub(crate) box_offsets: Vec2<AbsoluteBoxOffsets>,
} }
impl HoistedSharedFragment { impl HoistedSharedFragment {
pub(crate) fn new() -> Self { pub(crate) fn new(box_offsets: Vec2<AbsoluteBoxOffsets>) -> Self {
HoistedSharedFragment { fragment: None } HoistedSharedFragment {
fragment: None,
box_offsets,
}
} }
} }
impl HoistedAbsolutelyPositionedBox { impl HoistedSharedFragment {
/// In some cases `inset: auto`-positioned elements do not know their precise /// In some cases `inset: auto`-positioned elements do not know their precise
/// position until after they're hoisted. This lets us adjust auto values /// position until after they're hoisted. This lets us adjust auto values
/// after the fact. /// after the fact.
@ -73,7 +75,7 @@ impl HoistedAbsolutelyPositionedBox {
} }
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug, Serialize)]
pub(crate) enum AbsoluteBoxOffsets { pub(crate) enum AbsoluteBoxOffsets {
StaticStart { StaticStart {
start: Length, start: Length,
@ -162,8 +164,7 @@ impl AbsolutelyPositionedBox {
}; };
HoistedAbsolutelyPositionedBox { HoistedAbsolutelyPositionedBox {
tree_rank, tree_rank,
box_offsets, fragment: ArcRefCell::new(HoistedSharedFragment::new(box_offsets)),
fragment: ArcRefCell::new(HoistedSharedFragment::new()),
absolutely_positioned_box: self_, absolutely_positioned_box: self_,
} }
} }
@ -442,13 +443,15 @@ impl HoistedAbsolutelyPositionedBox {
.content_box_size(&containing_block.into(), &pbm), .content_box_size(&containing_block.into(), &pbm),
}; };
let shared_fragment = self.fragment.borrow();
let inline_axis = solve_axis( let inline_axis = solve_axis(
cbis, cbis,
pbm.padding_border_sums.inline, pbm.padding_border_sums.inline,
pbm.margin.inline_start, pbm.margin.inline_start,
pbm.margin.inline_end, pbm.margin.inline_end,
/* avoid_negative_margin_start */ true, /* avoid_negative_margin_start */ true,
&self.box_offsets.inline, &shared_fragment.box_offsets.inline,
size.inline, size.inline,
); );
@ -458,7 +461,7 @@ impl HoistedAbsolutelyPositionedBox {
pbm.margin.block_start, pbm.margin.block_start,
pbm.margin.block_end, pbm.margin.block_end,
/* avoid_negative_margin_start */ false, /* avoid_negative_margin_start */ false,
&self.box_offsets.block, &shared_fragment.box_offsets.block,
size.block, size.block,
); );
@ -688,11 +691,13 @@ fn adjust_static_positions(
_ => unreachable!(), _ => unreachable!(),
}; };
if let AbsoluteBoxOffsets::StaticStart { start } = &mut abspos_fragment.box_offsets.inline { let mut shared_fragment = abspos_fragment.fragment.borrow_mut();
if let AbsoluteBoxOffsets::StaticStart { start } = &mut shared_fragment.box_offsets.inline {
*start += child_fragment_rect.start_corner.inline; *start += child_fragment_rect.start_corner.inline;
} }
if let AbsoluteBoxOffsets::StaticStart { start } = &mut abspos_fragment.box_offsets.block { if let AbsoluteBoxOffsets::StaticStart { start } = &mut shared_fragment.box_offsets.block {
*start += child_fragment_rect.start_corner.block; *start += child_fragment_rect.start_corner.block;
} }
} }