From 34e8cda801910fc4f9c561bb834e23bd26302ce2 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Tue, 3 Dec 2019 15:09:03 +0100 Subject: [PATCH] Rename ReplacedContent::layout to make_fragments and simplify its API --- components/layout_2020/flow/inline.rs | 28 ++++----------- components/layout_2020/flow/mod.rs | 21 ++++------- components/layout_2020/positioned.rs | 43 ++++++++++++++--------- components/layout_2020/replaced.rs | 50 ++++++++++----------------- 4 files changed, 57 insertions(+), 85 deletions(-) diff --git a/components/layout_2020/flow/inline.rs b/components/layout_2020/flow/inline.rs index 4da0c7018cc..8a3088b8b76 100644 --- a/components/layout_2020/flow/inline.rs +++ b/components/layout_2020/flow/inline.rs @@ -17,7 +17,7 @@ use app_units::Au; use gfx::text::text_run::GlyphRun; use servo_arc::Arc; use style::properties::ComputedValues; -use style::values::computed::{Length, LengthOrAuto, Percentage}; +use style::values::computed::{Length, Percentage}; use style::Zero; use webrender_api::FontInstanceKey; @@ -418,29 +418,13 @@ fn layout_atomic<'box_tree>( let fragment = match atomic.as_replaced() { Ok(replaced) => { // FIXME: implement https://drafts.csswg.org/css2/visudet.html#inline-replaced-width - let inline_size = Length::zero(); - let block_size = Length::zero(); - let containing_block_for_children = ContainingBlock { - inline_size, - block_size: LengthOrAuto::LengthPercentage(block_size), - mode: atomic.style.writing_mode(), - }; - // https://drafts.csswg.org/css-writing-modes/#orthogonal-flows - assert_eq!( - ifc.containing_block.mode, containing_block_for_children.mode, - "Mixed writing modes are not supported yet" - ); - let independent_layout = replaced.layout(&atomic.style, &containing_block_for_children); - let content_rect = Rect { - start_corner, - size: Vec2 { - block: independent_layout.content_block_size, - inline: inline_size, - }, - }; + // and https://drafts.csswg.org/css2/visudet.html#inline-replaced-height + let size = Vec2::zero(); + let fragments = replaced.make_fragments(&atomic.style, size.clone()); + let content_rect = Rect { start_corner, size }; BoxFragment { style: atomic.style.clone(), - children: independent_layout.fragments, + children: fragments, content_rect, padding, border, diff --git a/components/layout_2020/flow/mod.rs b/components/layout_2020/flow/mod.rs index 8bda0c69d24..195b1458ce7 100644 --- a/components/layout_2020/flow/mod.rs +++ b/components/layout_2020/flow/mod.rs @@ -516,17 +516,11 @@ fn layout_in_flow_replaced_block_level<'a>( block_start: computed_margin.block_start.auto_is(Length::zero), block_end: computed_margin.block_end.auto_is(Length::zero), }; - let containing_block_for_children = ContainingBlock { - inline_size, - block_size: LengthOrAuto::LengthPercentage(block_size), - mode, + let size = Vec2 { + block: block_size, + inline: inline_size, }; - // https://drafts.csswg.org/css-writing-modes/#orthogonal-flows - assert_eq!( - containing_block.mode, containing_block_for_children.mode, - "Mixed writing modes are not supported yet" - ); - let independent_layout = replaced.layout(style, &containing_block_for_children); + let fragments = replaced.make_fragments(style, size.clone()); let relative_adjustement = relative_adjustement( style, inline_size, @@ -537,14 +531,11 @@ fn layout_in_flow_replaced_block_level<'a>( block: pb.block_start + relative_adjustement.block, inline: pb.inline_start + relative_adjustement.inline + margin.inline_start, }, - size: Vec2 { - block: block_size, - inline: inline_size, - }, + size, }; BoxFragment { style: style.clone(), - children: independent_layout.fragments, + children: fragments, content_rect, padding, border, diff --git a/components/layout_2020/positioned.rs b/components/layout_2020/positioned.rs index 7fcc7cdb254..7d61916b2c1 100644 --- a/components/layout_2020/positioned.rs +++ b/components/layout_2020/positioned.rs @@ -302,24 +302,35 @@ impl<'a> AbsolutelyPositionedFragment<'a> { } }); - let containing_block_for_children = ContainingBlock { - inline_size, - block_size, - mode: style.writing_mode(), - }; - // https://drafts.csswg.org/css-writing-modes/#orthogonal-flows - assert_eq!( - containing_block.mode, containing_block_for_children.mode, - "Mixed writing modes are not supported yet" - ); let mut absolutely_positioned_fragments = Vec::new(); let mut independent_layout = match self.absolutely_positioned_box.contents.as_replaced() { - // FIXME: implement https://drafts.csswg.org/css2/visudet.html#abs-replaced-width - Ok(replaced) => replaced.layout( - &self.absolutely_positioned_box.contents.style, - &containing_block_for_children, - ), + Ok(replaced) => { + // FIXME: implement https://drafts.csswg.org/css2/visudet.html#abs-replaced-width + // and https://drafts.csswg.org/css2/visudet.html#abs-replaced-height + let block_size = block_size.auto_is(|| Length::zero()); + let fragments = replaced.make_fragments( + &self.absolutely_positioned_box.contents.style, + Vec2 { + inline: inline_size, + block: block_size, + }, + ); + crate::formatting_contexts::IndependentLayout { + fragments, + content_block_size: block_size, + } + }, Err(non_replaced) => { + let containing_block_for_children = ContainingBlock { + inline_size, + block_size, + mode: style.writing_mode(), + }; + // https://drafts.csswg.org/css-writing-modes/#orthogonal-flows + assert_eq!( + containing_block.mode, containing_block_for_children.mode, + "Mixed writing modes are not supported yet" + ); let dummy_tree_rank = 0; non_replaced.layout( layout_context, @@ -358,7 +369,7 @@ impl<'a> AbsolutelyPositionedFragment<'a> { &mut independent_layout.fragments, &content_rect.size, &padding, - containing_block_for_children.mode, + style.writing_mode(), ); Fragment::Box(BoxFragment { diff --git a/components/layout_2020/replaced.rs b/components/layout_2020/replaced.rs index ecb8d2433e3..8cb77d267bd 100644 --- a/components/layout_2020/replaced.rs +++ b/components/layout_2020/replaced.rs @@ -3,10 +3,8 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom_traversal::NodeExt; -use crate::formatting_contexts::IndependentLayout; use crate::fragments::{Fragment, ImageFragment}; use crate::geom::{flow_relative, physical}; -use crate::ContainingBlock; use net_traits::image::base::Image; use servo_arc::Arc as ServoArc; use std::sync::Arc; @@ -35,39 +33,27 @@ impl ReplacedContent { None } - pub fn layout<'a>( + pub fn make_fragments<'a>( &'a self, style: &ServoArc, - containing_block: &ContainingBlock, - ) -> IndependentLayout { - let (fragments, content_block_size) = match self.kind { - ReplacedContentKind::Image(ref image) => { - // FIXME(nox): We should not assume block size is known. - let block_size = containing_block.block_size.non_auto().unwrap(); - let fragments = image - .as_ref() - .and_then(|image| image.id) - .map(|image_key| { - Fragment::Image(ImageFragment { - style: style.clone(), - content_rect: flow_relative::Rect { - start_corner: flow_relative::Vec2::zero(), - size: flow_relative::Vec2 { - inline: containing_block.inline_size, - block: block_size, - }, - }, - image_key, - }) + size: flow_relative::Vec2, + ) -> Vec { + match &self.kind { + ReplacedContentKind::Image(image) => image + .as_ref() + .and_then(|image| image.id) + .map(|image_key| { + Fragment::Image(ImageFragment { + style: style.clone(), + content_rect: flow_relative::Rect { + start_corner: flow_relative::Vec2::zero(), + size, + }, + image_key, }) - .into_iter() - .collect::>(); - (fragments, block_size) - }, - }; - IndependentLayout { - fragments, - content_block_size, + }) + .into_iter() + .collect(), } } }