diff --git a/components/layout_2020/display_list/mod.rs b/components/layout_2020/display_list/mod.rs index dd91f3b72c8..6fa4cd1ef48 100644 --- a/components/layout_2020/display_list/mod.rs +++ b/components/layout_2020/display_list/mod.rs @@ -5,6 +5,7 @@ use std::cell::{OnceCell, RefCell}; use std::sync::Arc; +use app_units::Au; use base::id::BrowsingContextId; use base::WebRenderEpochToU16; use embedder_traits::Cursor; @@ -34,7 +35,7 @@ use crate::display_list::stacking_context::StackingContextSection; use crate::fragment_tree::{ BackgroundMode, BoxFragment, Fragment, FragmentFlags, FragmentTree, Tag, TextFragment, }; -use crate::geom::{LogicalRect, PhysicalPoint, PhysicalRect}; +use crate::geom::{PhysicalPoint, PhysicalRect}; use crate::replaced::IntrinsicSizes; use crate::style_ext::ComputedValuesExt; @@ -230,7 +231,7 @@ impl Fragment { pub(crate) fn build_display_list( &self, builder: &mut DisplayListBuilder, - containing_block: &PhysicalRect, + containing_block: &PhysicalRect, section: StackingContextSection, ) { match self { @@ -288,7 +289,7 @@ impl Fragment { builder.iframe_sizes.insert( iframe.browsing_context_id, - Size2D::new(rect.size.width.px(), rect.size.height.px()), + Size2D::new(rect.size.width.to_f32_px(), rect.size.height.to_f32_px()), ); let common = builder.common_properties(rect.to_webrender(), &iframe.style); @@ -321,7 +322,7 @@ impl Fragment { builder: &mut DisplayListBuilder, style: &ComputedValues, tag: Option, - rect: PhysicalRect, + rect: PhysicalRect, cursor: Cursor, ) { let hit_info = builder.hit_info(style, tag, cursor); @@ -345,7 +346,7 @@ impl Fragment { &self, fragment: &TextFragment, builder: &mut DisplayListBuilder, - containing_block: &PhysicalRect, + containing_block: &PhysicalRect, ) { // NB: The order of painting text components (CSS Text Decoration Module Level 3) is: // shadows, underline, overline, text, text-emphasis, and then line-through. @@ -357,7 +358,7 @@ impl Fragment { .to_physical(fragment.parent_style.writing_mode, containing_block) .translate(containing_block.origin.to_vector()); let mut baseline_origin = rect.origin; - baseline_origin.y += Length::from(fragment.font_metrics.ascent); + baseline_origin.y += fragment.font_metrics.ascent; let glyphs = glyphs( &fragment.glyphs, baseline_origin, @@ -404,8 +405,8 @@ impl Fragment { .contains(TextDecorationLine::UNDERLINE) { let mut rect = rect; - rect.origin.y += Length::from(font_metrics.ascent - font_metrics.underline_offset); - rect.size.height = Length::new(font_metrics.underline_size.to_nearest_pixel(dppx)); + rect.origin.y += font_metrics.ascent - font_metrics.underline_offset; + rect.size.height = Au::from_f32_px(font_metrics.underline_size.to_nearest_pixel(dppx)); self.build_display_list_for_text_decoration(fragment, builder, &rect, &color); } @@ -415,7 +416,7 @@ impl Fragment { .contains(TextDecorationLine::OVERLINE) { let mut rect = rect; - rect.size.height = Length::new(font_metrics.underline_size.to_nearest_pixel(dppx)); + rect.size.height = Au::from_f32_px(font_metrics.underline_size.to_nearest_pixel(dppx)); self.build_display_list_for_text_decoration(fragment, builder, &rect, &color); } @@ -435,8 +436,8 @@ impl Fragment { .contains(TextDecorationLine::LINE_THROUGH) { let mut rect = rect; - rect.origin.y += Length::from(font_metrics.ascent - font_metrics.strikeout_offset); - rect.size.height = Length::new(font_metrics.strikeout_size.to_nearest_pixel(dppx)); + rect.origin.y += font_metrics.ascent - font_metrics.strikeout_offset; + rect.size.height = Au::from_f32_px(font_metrics.strikeout_size.to_nearest_pixel(dppx)); self.build_display_list_for_text_decoration(fragment, builder, &rect, &color); } @@ -449,7 +450,7 @@ impl Fragment { &self, fragment: &TextFragment, builder: &mut DisplayListBuilder, - rect: &PhysicalRect, + rect: &PhysicalRect, color: &AbsoluteColor, ) { let rect = rect.to_webrender(); @@ -476,7 +477,7 @@ impl Fragment { struct BuilderForBoxFragment<'a> { fragment: &'a BoxFragment, - containing_block: &'a PhysicalRect, + containing_block: &'a PhysicalRect, border_rect: units::LayoutRect, padding_rect: OnceCell, content_rect: OnceCell, @@ -487,7 +488,7 @@ struct BuilderForBoxFragment<'a> { } impl<'a> BuilderForBoxFragment<'a> { - fn new(fragment: &'a BoxFragment, containing_block: &'a PhysicalRect) -> Self { + fn new(fragment: &'a BoxFragment, containing_block: &'a PhysicalRect) -> Self { let border_rect: units::LayoutRect = fragment .border_rect() .to_physical(fragment.style.writing_mode, containing_block) @@ -711,7 +712,7 @@ impl<'a> BuilderForBoxFragment<'a> { // is used). if let BackgroundMode::Extra(ref extra_backgrounds) = self.fragment.background_mode { for extra_background in extra_backgrounds { - let positioning_area: LogicalRect = extra_background.rect.clone().into(); + let positioning_area = extra_background.rect.clone(); let painter = BackgroundPainter { style: &extra_background.style, painting_area_override: None, @@ -959,7 +960,7 @@ fn rgba(color: AbsoluteColor) -> wr::ColorF { fn glyphs( glyph_runs: &[Arc], - mut baseline_origin: PhysicalPoint, + mut baseline_origin: PhysicalPoint, justification_adjustment: Length, ) -> Vec { use fonts_traits::ByteIndex; @@ -971,8 +972,8 @@ fn glyphs( if !run.is_whitespace() { let glyph_offset = glyph.offset().unwrap_or(Point2D::zero()); let point = units::LayoutPoint::new( - baseline_origin.x.px() + glyph_offset.x.to_f32_px(), - baseline_origin.y.px() + glyph_offset.y.to_f32_px(), + baseline_origin.x.to_f32_px() + glyph_offset.x.to_f32_px(), + baseline_origin.y.to_f32_px() + glyph_offset.y.to_f32_px(), ); let glyph = wr::GlyphInstance { index: glyph.id(), @@ -982,9 +983,9 @@ fn glyphs( } if glyph.char_is_word_separator() { - baseline_origin.x += justification_adjustment; + baseline_origin.x += justification_adjustment.into(); } - baseline_origin.x += Length::from(glyph.advance()); + baseline_origin.x += glyph.advance(); } } glyphs diff --git a/components/layout_2020/display_list/stacking_context.rs b/components/layout_2020/display_list/stacking_context.rs index 2833fa459fc..ec6552c69f2 100644 --- a/components/layout_2020/display_list/stacking_context.rs +++ b/components/layout_2020/display_list/stacking_context.rs @@ -5,8 +5,9 @@ use std::cell::RefCell; use std::mem; +use app_units::Au; use base::print_tree::PrintTree; -use euclid::default::Rect; +use euclid::default::{Point2D, Rect, Size2D}; use euclid::SideOffsets2D; use log::warn; use servo_arc::Arc as ServoArc; @@ -34,7 +35,7 @@ use crate::display_list::DisplayListBuilder; use crate::fragment_tree::{ BoxFragment, ContainingBlockManager, Fragment, FragmentFlags, FragmentTree, PositioningFragment, }; -use crate::geom::{PhysicalRect, PhysicalSides}; +use crate::geom::{AuOrAuto, PhysicalRect, PhysicalSides}; use crate::style_ext::ComputedValuesExt; #[derive(Clone)] @@ -53,12 +54,12 @@ pub(crate) struct ContainingBlock { clip_chain_id: wr::ClipChainId, /// The physical rect of this containing block. - rect: PhysicalRect, + rect: PhysicalRect, } impl ContainingBlock { pub(crate) fn new( - rect: PhysicalRect, + rect: PhysicalRect, scroll_node_id: ScrollTreeNodeId, scroll_frame_size: Option, clip_chain_id: wr::ClipChainId, @@ -71,7 +72,7 @@ impl ContainingBlock { } } - pub(crate) fn new_replacing_rect(&self, rect: &PhysicalRect) -> Self { + pub(crate) fn new_replacing_rect(&self, rect: &PhysicalRect) -> Self { ContainingBlock { rect: *rect, ..*self @@ -246,7 +247,7 @@ pub(crate) enum StackingContextContent { reference_frame_scroll_node_id: ScrollTreeNodeId, clip_chain_id: wr::ClipChainId, section: StackingContextSection, - containing_block: PhysicalRect, + containing_block: PhysicalRect, fragment: ArcRefCell, }, @@ -528,7 +529,7 @@ impl StackingContext { &self, builder: &mut DisplayListBuilder, fragment_tree: &crate::FragmentTree, - containing_block_rect: &PhysicalRect, + containing_block_rect: &PhysicalRect, ) { let style = if let Some(style) = &fragment_tree.canvas_background.style { style @@ -896,7 +897,7 @@ impl Fragment { } struct ReferenceFrameData { - origin: crate::geom::PhysicalPoint, + origin: crate::geom::PhysicalPoint, transform: LayoutTransform, kind: wr::ReferenceFrameKind, } @@ -1220,7 +1221,7 @@ impl BoxFragment { display_list: &mut DisplayList, parent_scroll_node_id: &ScrollTreeNodeId, parent_clip_chain_id: &wr::ClipChainId, - containing_block_rect: &PhysicalRect, + containing_block_rect: &PhysicalRect, ) -> Option { let position = self.style.get_box().position; // https://drafts.csswg.org/css2/#clipping @@ -1254,7 +1255,7 @@ impl BoxFragment { display_list: &mut DisplayList, parent_scroll_node_id: &ScrollTreeNodeId, parent_clip_id: &wr::ClipChainId, - containing_block_rect: &PhysicalRect, + containing_block_rect: &PhysicalRect, ) -> Option<(ScrollTreeNodeId, wr::ClipChainId, LayoutSize)> { let overflow_x = self.style.get_box().overflow_x; let overflow_y = self.style.get_box().overflow_y; @@ -1316,7 +1317,7 @@ impl BoxFragment { &mut self, display_list: &mut DisplayList, parent_scroll_node_id: &ScrollTreeNodeId, - containing_block_rect: &PhysicalRect, + containing_block_rect: &PhysicalRect, scroll_frame_size: &Option, ) -> Option { if self.style.get_box().position != ComputedPosition::Sticky { @@ -1335,19 +1336,23 @@ impl BoxFragment { // nearest scroll frame instead of the containing block like for other types // of positioning. let position = self.style.get_position(); - let offsets = PhysicalSides::new( - position - .top - .map(|v| v.resolve(Length::new(scroll_frame_size_for_resolve.height))), - position - .right - .map(|v| v.resolve(Length::new(scroll_frame_size_for_resolve.width))), - position - .bottom - .map(|v| v.resolve(Length::new(scroll_frame_size_for_resolve.height))), - position - .left - .map(|v| v.resolve(Length::new(scroll_frame_size_for_resolve.width))), + let offsets = PhysicalSides::::new( + position.top.map(|v| { + v.resolve(Length::new(scroll_frame_size_for_resolve.height)) + .into() + }), + position.right.map(|v| { + v.resolve(Length::new(scroll_frame_size_for_resolve.width)) + .into() + }), + position.bottom.map(|v| { + v.resolve(Length::new(scroll_frame_size_for_resolve.height)) + .into() + }), + position.left.map(|v| { + v.resolve(Length::new(scroll_frame_size_for_resolve.width)) + .into() + }), ); self.resolved_sticky_insets = Some(offsets); @@ -1385,10 +1390,10 @@ impl BoxFragment { ); let margins = SideOffsets2D::new( - offsets.top.non_auto().map(|v| v.px()), - offsets.right.non_auto().map(|v| v.px()), - offsets.bottom.non_auto().map(|v| v.px()), - offsets.left.non_auto().map(|v| v.px()), + offsets.top.non_auto().map(|v| v.to_f32_px()), + offsets.right.non_auto().map(|v| v.to_f32_px()), + offsets.bottom.non_auto().map(|v| v.to_f32_px()), + offsets.left.non_auto().map(|v| v.to_f32_px()), ); let sticky_node_id = display_list.define_sticky_frame( @@ -1405,7 +1410,7 @@ impl BoxFragment { /// Optionally returns the data for building a reference frame, without yet building it. fn reference_frame_data_if_necessary( &self, - containing_block_rect: &PhysicalRect, + containing_block_rect: &PhysicalRect, ) -> Option { if !self.style.has_transform_or_perspective(self.base.flags) { return None; @@ -1451,22 +1456,24 @@ impl BoxFragment { } /// Returns true if the given style contains a transform that is not invertible. - fn has_non_invertible_transform_or_zero_scale(&self, containing_block: &Rect) -> bool { + fn has_non_invertible_transform_or_zero_scale(&self, containing_block: &Rect) -> bool { let list = &self.style.get_box().transform; - match list.to_transform_3d_matrix(Some(containing_block)) { + match list.to_transform_3d_matrix(Some(&au_rect_to_length_rect(containing_block))) { Ok(t) => !t.0.is_invertible() || t.0.m11 == 0. || t.0.m22 == 0., Err(_) => false, } } /// Returns the 4D matrix representing this fragment's transform. - pub fn calculate_transform_matrix( - &self, - border_rect: &Rect, - ) -> Option { + pub fn calculate_transform_matrix(&self, border_rect: &Rect) -> Option { let list = &self.style.get_box().transform; - let transform = - LayoutTransform::from_untyped(&list.to_transform_3d_matrix(Some(border_rect)).ok()?.0); + + let transform = LayoutTransform::from_untyped( + &list + .to_transform_3d_matrix(Some(&au_rect_to_length_rect(border_rect))) + .ok()? + .0, + ); // WebRender will end up dividing by the scale value of this transform, so we // want to ensure we don't feed it a divisor of 0. assert_ne!(transform.m11, 0.); @@ -1475,11 +1482,11 @@ impl BoxFragment { let transform_origin = &self.style.get_box().transform_origin; let transform_origin_x = transform_origin .horizontal - .percentage_relative_to(border_rect.size.width) + .percentage_relative_to(border_rect.size.width.into()) .px(); let transform_origin_y = transform_origin .vertical - .percentage_relative_to(border_rect.size.height) + .percentage_relative_to(border_rect.size.height.into()) .px(); let transform_origin_z = transform_origin.depth.px(); @@ -1498,21 +1505,18 @@ impl BoxFragment { } /// Returns the 4D matrix representing this fragment's perspective. - pub fn calculate_perspective_matrix( - &self, - border_rect: &Rect, - ) -> Option { + pub fn calculate_perspective_matrix(&self, border_rect: &Rect) -> Option { match self.style.get_box().perspective { Perspective::Length(length) => { let perspective_origin = &self.style.get_box().perspective_origin; let perspective_origin = LayoutPoint::new( perspective_origin .horizontal - .percentage_relative_to(border_rect.size.width) + .percentage_relative_to(border_rect.size.width.into()) .px(), perspective_origin .vertical - .percentage_relative_to(border_rect.size.height) + .percentage_relative_to(border_rect.size.height.into()) .px(), ); @@ -1563,3 +1567,10 @@ impl PositioningFragment { } } } + +pub fn au_rect_to_length_rect(rect: &Rect) -> Rect { + Rect::new( + Point2D::new(rect.origin.x.into(), rect.origin.y.into()), + Size2D::new(rect.size.width.into(), rect.size.height.into()), + ) +} diff --git a/components/layout_2020/flexbox/layout.rs b/components/layout_2020/flexbox/layout.rs index 393ce99760b..563ca64e5b7 100644 --- a/components/layout_2020/flexbox/layout.rs +++ b/components/layout_2020/flexbox/layout.rs @@ -433,7 +433,7 @@ impl FlexContainer { }, }; for (fragment, _) in &mut line.item_fragments { - fragment.content_rect.start_corner += &flow_relative_line_position + fragment.content_rect.start_corner += &flow_relative_line_position.into() } line.item_fragments }); @@ -965,7 +965,7 @@ impl FlexLine<'_> { item.box_.base_fragment_info(), item.box_.style().clone(), item_result.fragments, - content_rect, + content_rect.into(), flex_context.sides_to_flow_relative(item.padding), flex_context.sides_to_flow_relative(item.border), margin, diff --git a/components/layout_2020/flow/float.rs b/components/layout_2020/flow/float.rs index 9244989e11f..8b6f8687d64 100644 --- a/components/layout_2020/flow/float.rs +++ b/components/layout_2020/flow/float.rs @@ -991,7 +991,7 @@ impl FloatBox { self.contents.base_fragment_info(), style.clone(), children, - content_rect, + content_rect.into(), pbm.padding, pbm.border, margin, @@ -1209,7 +1209,7 @@ impl SequentialLayoutState { ); let pbm_sums = &(&box_fragment.padding + &box_fragment.border) + &box_fragment.margin; - let content_rect: LogicalRect = box_fragment.content_rect.clone().into(); + let content_rect = box_fragment.content_rect.clone(); let margin_box_start_corner = self.floats.add_float(&PlacementInfo { size: &content_rect.size + &pbm_sums.sum(), side: FloatSide::from_style(&box_fragment.style).expect("Float box wasn't floated!"), @@ -1227,6 +1227,6 @@ impl SequentialLayoutState { block: new_position_in_bfc.block - block_start_of_containing_block_in_bfc, }; - box_fragment.content_rect.start_corner = new_position_in_containing_block.into(); + box_fragment.content_rect.start_corner = new_position_in_containing_block; } } diff --git a/components/layout_2020/flow/inline/line.rs b/components/layout_2020/flow/inline/line.rs index f8752298de3..fe9831cd8f3 100644 --- a/components/layout_2020/flow/inline/line.rs +++ b/components/layout_2020/flow/inline/line.rs @@ -240,7 +240,7 @@ impl TextRunLineItem { Some(TextFragment { base: self.base_fragment_info.into(), parent_style: self.parent_style, - rect, + rect: rect.into(), font_metrics: self.font_metrics, font_key: self.font_key, glyphs: self.text, @@ -366,14 +366,15 @@ impl InlineBoxLineItem { // Relative adjustment should not affect the rest of line layout, so we can // do it right before creating the Fragment. if style.clone_position().is_relative() { - content_rect.start_corner += &relative_adjustement(&style, state.ifc_containing_block); + content_rect.start_corner += + &relative_adjustement(&style, state.ifc_containing_block).into(); } let mut fragment = BoxFragment::new( self.base_fragment_info, self.style.clone(), fragments, - content_rect, + content_rect.into(), padding, border, margin, @@ -460,13 +461,13 @@ impl AtomicLineItem { // The initial `start_corner` of the Fragment is only the PaddingBorderMargin sum start // offset, which is the sum of the start component of the padding, border, and margin. // This needs to be added to the calculated block and inline positions. - self.fragment.content_rect.start_corner.inline += state.inline_position; + self.fragment.content_rect.start_corner.inline += state.inline_position.into(); self.fragment.content_rect.start_corner.block += - self.calculate_block_start(state.line_metrics); + self.calculate_block_start(state.line_metrics).into(); // Make the final result relative to the parent box. self.fragment.content_rect.start_corner = - &self.fragment.content_rect.start_corner - &state.parent_offset; + &self.fragment.content_rect.start_corner - &state.parent_offset.into(); if self.fragment.style.clone_position().is_relative() { self.fragment.content_rect.start_corner += @@ -571,7 +572,7 @@ impl FloatLineItem { block: state.line_metrics.block_offset + state.parent_offset.block, }; self.fragment.content_rect.start_corner = - &self.fragment.content_rect.start_corner - &distance_from_parent_to_ifc; + &self.fragment.content_rect.start_corner - &distance_from_parent_to_ifc.into(); self.fragment } } diff --git a/components/layout_2020/flow/inline/mod.rs b/components/layout_2020/flow/inline/mod.rs index b43ba37bda8..594c3c093e4 100644 --- a/components/layout_2020/flow/inline/mod.rs +++ b/components/layout_2020/flow/inline/mod.rs @@ -381,13 +381,13 @@ impl LineBlockSizes { } } - fn resolve(&self) -> Length { + fn resolve(&self) -> Au { let height_from_ascent_and_descent = self .baseline_relative_size_for_line_height .as_ref() .map(|size| (size.ascent + size.descent).abs()) .unwrap_or_else(Au::zero); - self.line_height.max(height_from_ascent_and_descent.into()) + Au::from(self.line_height).max(height_from_ascent_and_descent) } fn max(&self, other: &LineBlockSizes) -> LineBlockSizes { @@ -431,7 +431,7 @@ impl LineBlockSizes { None => { // This is the case mentinoned above where there are multiple solutions. // This code is putting the baseline roughly in the middle of the line. - let leading = Au::from(self.resolve()) - + let leading = self.resolve() - (self.size_for_baseline_positioning.ascent + self.size_for_baseline_positioning.descent); leading.scale_by(0.5) + self.size_for_baseline_positioning.ascent @@ -900,7 +900,7 @@ impl<'a, 'b> InlineFormattingContextState<'a, 'b> { LineBlockSizes::zero() }; - let resolved_block_advance = effective_block_advance.resolve().into(); + let resolved_block_advance = effective_block_advance.resolve(); let mut block_end_position = block_start_position + resolved_block_advance; if let Some(sequential_layout_state) = self.sequential_layout_state.as_mut() { // This amount includes both the block size of the line and any extra space @@ -942,7 +942,7 @@ impl<'a, 'b> InlineFormattingContextState<'a, 'b> { justification_adjustment, line_metrics: &LineMetrics { block_offset: block_start_position.into(), - block_size: effective_block_advance.resolve(), + block_size: effective_block_advance.resolve().into(), baseline_block_offset: baseline_offset, }, }; @@ -973,11 +973,11 @@ impl<'a, 'b> InlineFormattingContextState<'a, 'b> { // the inline start of the line in `calculate_inline_start_for_current_line` so // we do not need to include it in the `start_corner` of the line's main Fragment. start_corner: LogicalVec2 { - inline: Length::zero(), - block: block_start_position.into(), + inline: Au::zero(), + block: block_start_position, }, size: LogicalVec2 { - inline: self.containing_block.inline_size.into(), + inline: self.containing_block.inline_size, block: effective_block_advance.resolve(), }, }; @@ -1134,8 +1134,8 @@ impl<'a, 'b> InlineFormattingContextState<'a, 'b> { let margin_box = float_item .fragment .border_rect() - .inflate(&float_item.fragment.margin.map(|t| (*t).into())); - let inline_size = margin_box.size.inline.max(Length::zero()); + .inflate(&float_item.fragment.margin); + let inline_size = margin_box.size.inline.max(Au::zero()); let available_inline_size = match self.current_line.placement_among_floats.get() { Some(placement_among_floats) => placement_among_floats.size.inline, @@ -1148,7 +1148,7 @@ impl<'a, 'b> InlineFormattingContextState<'a, 'b> { // parenting in their stacking contexts). Once all the line content is gathered we // will place them later. let has_content = self.current_line.has_content || self.current_line_segment.has_content; - let fits_on_line = !has_content || inline_size <= available_inline_size; + let fits_on_line = !has_content || inline_size <= available_inline_size.into(); let needs_placement_later = self.current_line.has_floats_waiting_to_be_placed || !fits_on_line; @@ -1165,7 +1165,7 @@ impl<'a, 'b> InlineFormattingContextState<'a, 'b> { // start position. let new_placement = self.place_line_among_floats(&LogicalVec2 { inline: line_inline_size_without_trailing_whitespace, - block: self.current_line.max_block_size.resolve(), + block: self.current_line.max_block_size.resolve().into(), }); self.current_line .replace_placement_among_floats(new_placement); @@ -1472,7 +1472,8 @@ impl<'a, 'b> InlineFormattingContextState<'a, 'b> { block: self .current_line_max_block_size_including_nested_containers() .max(&self.current_line_segment.max_block_size) - .resolve(), + .resolve() + .into(), }; if self.new_potential_line_size_causes_line_break(&potential_line_size) { @@ -1520,7 +1521,7 @@ impl<'a, 'b> InlineFormattingContextState<'a, 'b> { if self.current_line.line_items.is_empty() { let will_break = self.new_potential_line_size_causes_line_break(&LogicalVec2 { inline: line_inline_size_without_trailing_whitespace, - block: self.current_line_segment.max_block_size.resolve(), + block: self.current_line_segment.max_block_size.resolve().into(), }); assert!(!will_break); } @@ -1938,13 +1939,13 @@ impl InlineContainerState { block_size .resolve() .scale_by(FONT_SUBSCRIPT_OFFSET_RATIO) - .px(), + .to_f32_px(), ), VerticalAlign::Keyword(VerticalAlignKeyword::Super) => -Au::from_f32_px( block_size .resolve() .scale_by(FONT_SUPERSCRIPT_OFFSET_RATIO) - .px(), + .to_f32_px(), ), VerticalAlign::Keyword(VerticalAlignKeyword::TextTop) => { child_block_size.size_for_baseline_positioning.ascent - self.font_metrics.ascent @@ -2047,7 +2048,7 @@ impl IndependentFormattingContext { replaced.base_fragment_info, replaced.style.clone(), fragments, - content_rect.into(), + content_rect, pbm.padding, pbm.border, margin, @@ -2136,7 +2137,7 @@ impl IndependentFormattingContext { non_replaced.base_fragment_info, non_replaced.style.clone(), independent_layout.fragments, - content_rect.into(), + content_rect, pbm.padding, pbm.border, margin, @@ -2155,22 +2156,22 @@ impl IndependentFormattingContext { ifc.process_soft_wrap_opportunity(); } - let size = &pbm_sums.sum().into() + &fragment.content_rect.size; + let size = &pbm_sums.sum() + &fragment.content_rect.size; let baseline_offset = self .pick_baseline(&fragment.baselines) .map(|baseline| pbm_sums.block_start + baseline) - .unwrap_or(size.block.into()); + .unwrap_or(size.block); let (block_sizes, baseline_offset_in_parent) = - self.get_block_sizes_and_baseline_offset(ifc, size.block, baseline_offset); + self.get_block_sizes_and_baseline_offset(ifc, size.block.into(), baseline_offset); ifc.update_unbreakable_segment_for_new_content( &block_sizes, - size.inline, + size.inline.into(), SegmentContentFlags::empty(), ); ifc.push_line_item_to_unbreakable_segment(LineItem::Atomic(AtomicLineItem { fragment, - size, + size: size.into(), positioning_context: child_positioning_context, baseline_offset_in_parent, baseline_offset_in_item: baseline_offset, diff --git a/components/layout_2020/flow/mod.rs b/components/layout_2020/flow/mod.rs index 6a8249201dd..87eb75c46c0 100644 --- a/components/layout_2020/flow/mod.rs +++ b/components/layout_2020/flow/mod.rs @@ -244,10 +244,10 @@ impl OutsideMarker { let max_inline_size = flow_layout.fragments.iter().fold( Length::zero(), |current_max, fragment| match fragment { - Fragment::Text(text) => current_max.max(text.rect.max_inline_position()), - Fragment::Image(image) => current_max.max(image.rect.max_inline_position()), + Fragment::Text(text) => current_max.max(text.rect.max_inline_position().into()), + Fragment::Image(image) => current_max.max(image.rect.max_inline_position().into()), Fragment::Positioning(positioning) => { - current_max.max(positioning.rect.max_inline_position()) + current_max.max(positioning.rect.max_inline_position().into()) }, Fragment::Box(_) | Fragment::Float(_) | @@ -286,7 +286,7 @@ impl OutsideMarker { base_fragment_info, self.marker_style.clone(), flow_layout.fragments, - content_rect, + content_rect.into(), LogicalSides::zero(), LogicalSides::zero(), LogicalSides::zero(), @@ -910,7 +910,7 @@ fn layout_in_flow_non_replaced_block_level_same_formatting_context( base_fragment_info, style.clone(), flow_layout.fragments, - content_rect.into(), + content_rect, pbm.padding, pbm.border, margin, @@ -996,7 +996,7 @@ impl NonReplacedFormattingContext { self.base_fragment_info, self.style.clone(), layout.fragments, - content_rect.into(), + content_rect, pbm.padding, pbm.border, margin, @@ -1248,7 +1248,7 @@ impl NonReplacedFormattingContext { self.base_fragment_info, self.style.clone(), layout.fragments, - content_rect.into(), + content_rect, pbm.padding, pbm.border, margin, @@ -1353,7 +1353,7 @@ fn layout_in_flow_replaced_block_level( base_fragment_info, style.clone(), fragments, - content_rect.into(), + content_rect, pbm.padding, pbm.border, margin, @@ -1668,7 +1668,7 @@ impl PlacementState { return; } - let box_block_offset = box_fragment.content_rect.start_corner.block.into(); + let box_block_offset = box_fragment.content_rect.start_corner.block; if let (None, Some(first)) = (self.inflow_baselines.first, box_fragment.baselines.first) { self.inflow_baselines.first = Some(first + box_block_offset); } @@ -1700,14 +1700,14 @@ impl PlacementState { .contains(FragmentFlags::IS_OUTSIDE_LIST_ITEM_MARKER); if is_outside_marker { assert!(self.marker_block_size.is_none()); - self.marker_block_size = Some(fragment.content_rect.size.block.into()); + self.marker_block_size = Some(fragment.content_rect.size.block); return; } let fragment_block_margins = &fragment.block_margins_collapsed_with_children; let mut fragment_block_size = fragment.padding.block_sum() + fragment.border.block_sum() + - fragment.content_rect.size.block.into(); + fragment.content_rect.size.block; // We use `last_in_flow_margin_collapses_with_parent_end_margin` to implement // this quote from https://drafts.csswg.org/css2/#collapsing-margins @@ -1744,7 +1744,7 @@ impl PlacementState { .adjoin_assign(&fragment_block_margins.start); } fragment.content_rect.start_corner.block += - (self.current_margin.solve() + self.current_block_direction_position).into(); + self.current_margin.solve() + self.current_block_direction_position; if fragment_block_margins.collapsed_through { // `fragment_block_size` is typically zero when collapsing through, diff --git a/components/layout_2020/flow/root.rs b/components/layout_2020/flow/root.rs index 8a1865621cb..16d242d728b 100644 --- a/components/layout_2020/flow/root.rs +++ b/components/layout_2020/flow/root.rs @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +use app_units::Au; use atomic_refcell::AtomicRef; use script_layout_interface::wrapper_traits::{ LayoutNode, ThreadSafeLayoutElement, ThreadSafeLayoutNode, @@ -11,7 +12,7 @@ use serde::Serialize; use servo_arc::Arc; use style::dom::OpaqueNode; use style::properties::ComputedValues; -use style::values::computed::{Length, Overflow}; +use style::values::computed::Overflow; use style_traits::CSSPixel; use webrender_traits::display_list::ScrollSensitivity; @@ -306,12 +307,15 @@ impl BoxTree { // https://drafts.csswg.org/css-writing-modes/#principal-flow let physical_containing_block = PhysicalRect::new( PhysicalPoint::zero(), - PhysicalSize::new(Length::new(viewport.width), Length::new(viewport.height)), + PhysicalSize::new( + Au::from_f32_px(viewport.width), + Au::from_f32_px(viewport.height), + ), ); let initial_containing_block = DefiniteContainingBlock { size: LogicalVec2 { - inline: physical_containing_block.size.width.into(), - block: physical_containing_block.size.height.into(), + inline: physical_containing_block.size.width, + block: physical_containing_block.size.height, }, style, }; diff --git a/components/layout_2020/fragment_tree/box_fragment.rs b/components/layout_2020/fragment_tree/box_fragment.rs index b44b2bc14b1..be16a686969 100644 --- a/components/layout_2020/fragment_tree/box_fragment.rs +++ b/components/layout_2020/fragment_tree/box_fragment.rs @@ -16,8 +16,7 @@ use super::{BaseFragment, BaseFragmentInfo, CollapsedBlockMargins, Fragment}; use crate::cell::ArcRefCell; use crate::formatting_contexts::Baselines; use crate::geom::{ - LengthOrAuto, LogicalRect, LogicalSides, PhysicalPoint, PhysicalRect, PhysicalSides, - PhysicalSize, + AuOrAuto, LogicalRect, LogicalSides, PhysicalPoint, PhysicalRect, PhysicalSides, PhysicalSize, }; use crate::style_ext::ComputedValuesExt; @@ -50,7 +49,7 @@ pub(crate) struct BoxFragment { /// From the containing block’s start corner…? /// This might be broken when the containing block is in a different writing mode: /// - pub content_rect: LogicalRect, + pub content_rect: LogicalRect, pub padding: LogicalSides, pub border: LogicalSides, @@ -72,7 +71,7 @@ pub(crate) struct BoxFragment { pub block_margins_collapsed_with_children: CollapsedBlockMargins, /// The scrollable overflow of this box fragment. - pub scrollable_overflow_from_children: PhysicalRect, + pub scrollable_overflow_from_children: PhysicalRect, /// Whether or not this box was overconstrained in the given dimension. overconstrained: PhysicalSize, @@ -80,7 +79,7 @@ pub(crate) struct BoxFragment { /// The resolved box insets if this box is `position: sticky`. These are calculated /// during stacking context tree construction because they rely on the size of the /// scroll container. - pub(crate) resolved_sticky_insets: Option>, + pub(crate) resolved_sticky_insets: Option>, #[serde(skip_serializing)] pub background_mode: BackgroundMode, @@ -92,7 +91,7 @@ impl BoxFragment { base_fragment_info: BaseFragmentInfo, style: ServoArc, children: Vec, - content_rect: LogicalRect, + content_rect: LogicalRect, padding: LogicalSides, border: LogicalSides, margin: LogicalSides, @@ -127,7 +126,7 @@ impl BoxFragment { base_fragment_info: BaseFragmentInfo, style: ServoArc, children: Vec, - content_rect: LogicalRect, + content_rect: LogicalRect, padding: LogicalSides, border: LogicalSides, margin: LogicalSides, @@ -154,10 +153,7 @@ impl BoxFragment { let mut baselines = Baselines::default(); if style.establishes_scroll_container() { baselines.last = Some( - Au::from(content_rect.size.block) + - padding.block_end + - border.block_end + - margin.block_end, + content_rect.size.block + padding.block_end + border.block_end + margin.block_end, ) } @@ -203,10 +199,7 @@ impl BoxFragment { self.background_mode = BackgroundMode::None; } - pub fn scrollable_overflow( - &self, - containing_block: &PhysicalRect, - ) -> PhysicalRect { + pub fn scrollable_overflow(&self, containing_block: &PhysicalRect) -> PhysicalRect { let physical_padding_rect = self .padding_rect() .to_physical(self.style.writing_mode, containing_block); @@ -222,14 +215,12 @@ impl BoxFragment { ) } - pub fn padding_rect(&self) -> LogicalRect { - self.content_rect - .inflate(&self.padding.map(|t| (*t).into())) + pub fn padding_rect(&self) -> LogicalRect { + self.content_rect.inflate(&self.padding) } - pub fn border_rect(&self) -> LogicalRect { - self.padding_rect() - .inflate(&self.border.map(|t| (*t).into())) + pub fn border_rect(&self) -> LogicalRect { + self.padding_rect().inflate(&self.border) } pub fn print(&self, tree: &mut PrintTree) { @@ -264,8 +255,8 @@ impl BoxFragment { pub fn scrollable_overflow_for_parent( &self, - containing_block: &PhysicalRect, - ) -> PhysicalRect { + containing_block: &PhysicalRect, + ) -> PhysicalRect { let mut overflow = self .border_rect() .to_physical(self.style.writing_mode, containing_block); @@ -297,8 +288,8 @@ impl BoxFragment { pub(crate) fn calculate_resolved_insets_if_positioned( &self, - containing_block: &PhysicalRect, - ) -> PhysicalSides { + containing_block: &PhysicalRect, + ) -> PhysicalSides { let position = self.style.get_box().position; debug_assert_ne!( position, @@ -315,12 +306,12 @@ impl BoxFragment { return resolved_sticky_insets; } - let convert_to_length_or_auto = |sides: PhysicalSides| { + let convert_to_length_or_auto = |sides: PhysicalSides| { PhysicalSides::new( - LengthOrAuto::LengthPercentage(sides.top), - LengthOrAuto::LengthPercentage(sides.right), - LengthOrAuto::LengthPercentage(sides.bottom), - LengthOrAuto::LengthPercentage(sides.left), + AuOrAuto::LengthPercentage(sides.top), + AuOrAuto::LengthPercentage(sides.right), + AuOrAuto::LengthPercentage(sides.bottom), + AuOrAuto::LengthPercentage(sides.left), ) }; @@ -347,19 +338,25 @@ impl BoxFragment { (Some(start), Some(end)) => (start, end), } }; - let (left, right) = get_resolved_axis(&insets.left, &insets.right, cb_width); - let (top, bottom) = get_resolved_axis(&insets.top, &insets.bottom, cb_height); - return convert_to_length_or_auto(PhysicalSides::new(top, right, bottom, left)); + let (left, right) = get_resolved_axis(&insets.left, &insets.right, cb_width.into()); + let (top, bottom) = get_resolved_axis(&insets.top, &insets.bottom, cb_height.into()); + return convert_to_length_or_auto(PhysicalSides::new( + top.into(), + right.into(), + bottom.into(), + left.into(), + )); } debug_assert!( position == ComputedPosition::Fixed || position == ComputedPosition::Absolute ); - let resolve = |value: &LengthPercentageOrAuto, container_length| { + let resolve = |value: &LengthPercentageOrAuto, container_length: Au| -> Au { value .auto_is(LengthPercentage::zero) - .percentage_relative_to(container_length) + .percentage_relative_to(container_length.into()) + .into() }; let (top, bottom) = if self.overconstrained.height { @@ -379,6 +376,11 @@ impl BoxFragment { (content_rect.origin.x, cb_width - content_rect.max_x()) }; - convert_to_length_or_auto(PhysicalSides::new(top, right, bottom, left)) + convert_to_length_or_auto(PhysicalSides::new( + top.into(), + right.into(), + bottom.into(), + left.into(), + )) } } diff --git a/components/layout_2020/fragment_tree/fragment.rs b/components/layout_2020/fragment_tree/fragment.rs index ace0bfc0b27..7fcf2cfbb18 100644 --- a/components/layout_2020/fragment_tree/fragment.rs +++ b/components/layout_2020/fragment_tree/fragment.rs @@ -65,7 +65,7 @@ pub(crate) struct TextFragment { pub base: BaseFragment, #[serde(skip_serializing)] pub parent_style: ServoArc, - pub rect: LogicalRect, + pub rect: LogicalRect, pub font_metrics: FontMetrics, #[serde(skip_serializing)] pub font_key: FontInstanceKey, @@ -83,7 +83,7 @@ pub(crate) struct ImageFragment { pub base: BaseFragment, #[serde(skip_serializing)] pub style: ServoArc, - pub rect: LogicalRect, + pub rect: LogicalRect, #[serde(skip_serializing)] pub image_key: ImageKey, } @@ -93,7 +93,7 @@ pub(crate) struct IFrameFragment { pub base: BaseFragment, pub pipeline_id: PipelineId, pub browsing_context_id: BrowsingContextId, - pub rect: LogicalRect, + pub rect: LogicalRect, #[serde(skip_serializing)] pub style: ServoArc, } @@ -133,7 +133,7 @@ impl Fragment { } } - pub fn scrolling_area(&self, containing_block: &PhysicalRect) -> PhysicalRect { + pub fn scrolling_area(&self, containing_block: &PhysicalRect) -> PhysicalRect { match self { Fragment::Box(fragment) | Fragment::Float(fragment) => fragment .scrollable_overflow(containing_block) @@ -142,10 +142,7 @@ impl Fragment { } } - pub fn scrollable_overflow( - &self, - containing_block: &PhysicalRect, - ) -> PhysicalRect { + pub fn scrollable_overflow(&self, containing_block: &PhysicalRect) -> PhysicalRect { match self { Fragment::Box(fragment) | Fragment::Float(fragment) => { fragment.scrollable_overflow_for_parent(containing_block) @@ -166,9 +163,9 @@ impl Fragment { pub(crate) fn find( &self, - manager: &ContainingBlockManager>, + manager: &ContainingBlockManager>, level: usize, - process_func: &mut impl FnMut(&Fragment, usize, &PhysicalRect) -> Option, + process_func: &mut impl FnMut(&Fragment, usize, &PhysicalRect) -> Option, ) -> Option { let containing_block = manager.get_containing_block_for_fragment(self); if let Some(result) = process_func(self, level, containing_block) { diff --git a/components/layout_2020/fragment_tree/fragment_tree.rs b/components/layout_2020/fragment_tree/fragment_tree.rs index 085274d4035..107bd3e36da 100644 --- a/components/layout_2020/fragment_tree/fragment_tree.rs +++ b/components/layout_2020/fragment_tree/fragment_tree.rs @@ -9,7 +9,6 @@ use fxhash::FxHashSet; use serde::Serialize; use style::animation::AnimationSetKey; use style::dom::OpaqueNode; -use style::values::computed::Length; use webrender_api::units; use webrender_traits::display_list::ScrollSensitivity; @@ -17,7 +16,7 @@ use super::{ContainingBlockManager, Fragment, Tag}; use crate::cell::ArcRefCell; use crate::display_list::StackingContext; use crate::flow::CanvasBackground; -use crate::geom::{physical_rect_to_au_rect, PhysicalRect}; +use crate::geom::PhysicalRect; #[derive(Serialize)] pub struct FragmentTree { @@ -33,10 +32,10 @@ pub struct FragmentTree { /// The scrollable overflow rectangle for the entire tree /// - pub(crate) scrollable_overflow: PhysicalRect, + pub(crate) scrollable_overflow: PhysicalRect, /// The containing block used in the layout of this fragment tree. - pub(crate) initial_containing_block: PhysicalRect, + pub(crate) initial_containing_block: PhysicalRect, /// #[serde(skip)] @@ -70,14 +69,14 @@ impl FragmentTree { pub fn scrollable_overflow(&self) -> units::LayoutSize { units::LayoutSize::from_untyped(Size2D::new( - self.scrollable_overflow.size.width.px(), - self.scrollable_overflow.size.height.px(), + self.scrollable_overflow.size.width.to_f32_px(), + self.scrollable_overflow.size.height.to_f32_px(), )) } pub(crate) fn find( &self, - mut process_func: impl FnMut(&Fragment, usize, &PhysicalRect) -> Option, + mut process_func: impl FnMut(&Fragment, usize, &PhysicalRect) -> Option, ) -> Option { let info = ContainingBlockManager { for_non_absolute_descendants: &self.initial_containing_block, @@ -125,9 +124,9 @@ impl FragmentTree { Fragment::IFrame(_) => return None, }; - content_boxes.push(physical_rect_to_au_rect( - fragment_relative_rect.translate(containing_block.origin.to_vector()), - )); + let rect = fragment_relative_rect.translate(containing_block.origin.to_vector()); + + content_boxes.push(rect.to_untyped()); None::<()> }); content_boxes @@ -156,10 +155,7 @@ impl FragmentTree { .padding_rect() .to_physical(fragment.style.writing_mode, containing_block); Rect::new( - Point2D::new( - border.border_left_width.into(), - border.border_top_width.into(), - ), + Point2D::new(border.border_left_width, border.border_top_width), Size2D::new(padding_rect.size.width, padding_rect.size.height), ) }, @@ -171,15 +167,15 @@ impl FragmentTree { }; let rect = Rect::new( - Point2D::new(rect.origin.x.px(), rect.origin.y.px()), - Size2D::new(rect.size.width.px(), rect.size.height.px()), + Point2D::new(rect.origin.x.to_f32_px(), rect.origin.y.to_f32_px()), + Size2D::new(rect.size.width.to_f32_px(), rect.size.height.to_f32_px()), ); Some(rect.round().to_i32().to_untyped()) }) .unwrap_or_else(Rect::zero) } - pub fn get_scrolling_area_for_viewport(&self) -> PhysicalRect { + pub fn get_scrolling_area_for_viewport(&self) -> PhysicalRect { let mut scroll_area = self.initial_containing_block; for fragment in self.root_fragments.iter() { scroll_area = fragment @@ -190,7 +186,7 @@ impl FragmentTree { scroll_area } - pub fn get_scrolling_area_for_node(&self, requested_node: OpaqueNode) -> PhysicalRect { + pub fn get_scrolling_area_for_node(&self, requested_node: OpaqueNode) -> PhysicalRect { let tag_to_find = Tag::new(requested_node); let scroll_area = self.find(|fragment, _, containing_block| { if fragment.tag() == Some(tag_to_find) { @@ -199,6 +195,6 @@ impl FragmentTree { None } }); - scroll_area.unwrap_or_else(PhysicalRect::::zero) + scroll_area.unwrap_or_else(PhysicalRect::::zero) } } diff --git a/components/layout_2020/fragment_tree/positioning_fragment.rs b/components/layout_2020/fragment_tree/positioning_fragment.rs index 7da428bf064..d9a1f46ec18 100644 --- a/components/layout_2020/fragment_tree/positioning_fragment.rs +++ b/components/layout_2020/fragment_tree/positioning_fragment.rs @@ -2,12 +2,12 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +use app_units::Au; use base::print_tree::PrintTree; use serde::Serialize; use servo_arc::Arc as ServoArc; use style::logical_geometry::WritingMode; use style::properties::ComputedValues; -use style::values::computed::Length; use super::{BaseFragment, BaseFragmentInfo, Fragment}; use crate::cell::ArcRefCell; @@ -19,12 +19,12 @@ use crate::geom::{LogicalRect, PhysicalRect}; #[derive(Serialize)] pub(crate) struct PositioningFragment { pub base: BaseFragment, - pub rect: LogicalRect, + pub rect: LogicalRect, pub children: Vec>, pub writing_mode: WritingMode, /// The scrollable overflow of this anonymous fragment's children. - pub scrollable_overflow: PhysicalRect, + pub scrollable_overflow: PhysicalRect, /// If this fragment was created with a style, the style of the fragment. #[serde(skip_serializing)] @@ -33,7 +33,7 @@ pub(crate) struct PositioningFragment { impl PositioningFragment { pub fn new_anonymous( - rect: LogicalRect, + rect: LogicalRect, children: Vec, mode: WritingMode, ) -> Self { @@ -42,7 +42,7 @@ impl PositioningFragment { pub fn new_empty( base_fragment_info: BaseFragmentInfo, - rect: LogicalRect, + rect: LogicalRect, style: ServoArc, ) -> Self { let writing_mode = style.writing_mode; @@ -58,7 +58,7 @@ impl PositioningFragment { fn new_with_base_fragment( base: BaseFragment, style: Option>, - rect: LogicalRect, + rect: LogicalRect, children: Vec, mode: WritingMode, ) -> Self { diff --git a/components/layout_2020/geom.rs b/components/layout_2020/geom.rs index d0a94d93265..5615491f2b7 100644 --- a/components/layout_2020/geom.rs +++ b/components/layout_2020/geom.rs @@ -216,6 +216,19 @@ impl fmt::Debug for LogicalRect { } } +impl fmt::Debug for LogicalRect { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!( + f, + "Rect(i{}×b{} @ (i{},b{}))", + self.size.inline.to_px(), + self.size.block.to_px(), + self.start_corner.inline.to_px(), + self.start_corner.block.to_px(), + ) + } +} + impl LogicalVec2 { pub fn to_physical(&self, mode: WritingMode) -> PhysicalSize { // https://drafts.csswg.org/css-writing-modes/#logical-to-physical @@ -525,17 +538,3 @@ impl From> for LogicalRect { } } } - -/// Convert a `PhysicalRect` (one that uses CSSPixel as the unit) to an untyped `Rect`. -pub fn physical_rect_to_au_rect(rect: PhysicalRect) -> euclid::default::Rect { - euclid::default::Rect::new( - euclid::default::Point2D::new( - Au::from_f32_px(rect.origin.x.px()), - Au::from_f32_px(rect.origin.y.px()), - ), - euclid::default::Size2D::new( - Au::from_f32_px(rect.size.width.px()), - Au::from_f32_px(rect.size.height.px()), - ), - ) -} diff --git a/components/layout_2020/positioned.rs b/components/layout_2020/positioned.rs index a58b53e2a5b..e0ad7acfc99 100644 --- a/components/layout_2020/positioned.rs +++ b/components/layout_2020/positioned.rs @@ -8,7 +8,7 @@ use rayon::prelude::{IndexedParallelIterator, ParallelIterator}; use serde::Serialize; use style::computed_values::position::T as Position; use style::properties::ComputedValues; -use style::values::computed::{CSSPixelLength, Length}; +use style::values::computed::Length; use style::values::specified::text::TextDecorationLine; use style::Zero; @@ -190,16 +190,16 @@ impl PositioningContext { /// See documentation for [PositioningContext::adjust_static_position_of_hoisted_fragments]. pub(crate) fn adjust_static_position_of_hoisted_fragments_with_offset( &mut self, - start_offset: &LogicalVec2, + start_offset: &LogicalVec2, index: PositioningContextLength, ) { let update_fragment_if_needed = |hoisted_fragment: &mut HoistedAbsolutelyPositionedBox| { let mut fragment = hoisted_fragment.fragment.borrow_mut(); if let AbsoluteBoxOffsets::StaticStart { start } = &mut fragment.box_offsets.inline { - *start += start_offset.inline.into(); + *start += start_offset.inline; } if let AbsoluteBoxOffsets::StaticStart { start } = &mut fragment.box_offsets.block { - *start += start_offset.block.into(); + *start += start_offset.block; } }; @@ -259,9 +259,9 @@ impl PositioningContext { // Ignore the content rect’s position in its own containing block: start_corner: LogicalVec2::zero(), } - .inflate(&new_fragment.padding.map(|t| (*t).into())); + .inflate(&new_fragment.padding); let containing_block = DefiniteContainingBlock { - size: padding_rect.size.into(), + size: padding_rect.size, style: &new_fragment.style, }; @@ -719,7 +719,7 @@ impl HoistedAbsolutelyPositionedBox { absolutely_positioned_box.context.base_fragment_info(), absolutely_positioned_box.context.style().clone(), fragments, - content_rect.into(), + content_rect, pbm.padding, pbm.border, margin, @@ -889,7 +889,7 @@ fn vec_append_owned(a: &mut Vec, mut b: Vec) { pub(crate) fn relative_adjustement( style: &ComputedValues, containing_block: &ContainingBlock, -) -> LogicalVec2 { +) -> LogicalVec2 { // It's not completely clear what to do with indefinite percentages // (https://github.com/w3c/csswg-drafts/issues/9353), so we match // other browsers and treat them as 'auto' offsets. @@ -898,20 +898,20 @@ pub(crate) fn relative_adjustement( let box_offsets = style .box_offsets(containing_block) .map_inline_and_block_axes( - |v| v.percentage_relative_to(cbis.into()), + |v| v.percentage_relative_to(cbis.into()).map(Au::from), |v| match cbbs.non_auto() { - Some(cbbs) => v.percentage_relative_to(cbbs.into()), + Some(cbbs) => v.percentage_relative_to(cbbs.into()).map(Au::from), None => match v.non_auto().and_then(|v| v.to_length()) { - Some(v) => LengthOrAuto::LengthPercentage(v), - None => LengthOrAuto::Auto, + Some(v) => AuOrAuto::LengthPercentage(v.into()), + None => AuOrAuto::Auto, }, }, ); - fn adjust(start: LengthOrAuto, end: LengthOrAuto) -> Length { + fn adjust(start: AuOrAuto, end: AuOrAuto) -> Au { match (start, end) { - (LengthOrAuto::Auto, LengthOrAuto::Auto) => Length::zero(), - (LengthOrAuto::Auto, LengthOrAuto::LengthPercentage(end)) => -end, - (LengthOrAuto::LengthPercentage(start), _) => start, + (AuOrAuto::Auto, AuOrAuto::Auto) => Au::zero(), + (AuOrAuto::Auto, AuOrAuto::LengthPercentage(end)) => -end, + (AuOrAuto::LengthPercentage(start), _) => start, } } LogicalVec2 { diff --git a/components/layout_2020/query.rs b/components/layout_2020/query.rs index 6de17b7dd2a..32b01154227 100644 --- a/components/layout_2020/query.rs +++ b/components/layout_2020/query.rs @@ -81,8 +81,8 @@ pub fn process_node_scroll_area_request( }; Rect::new( - Point2D::new(rect.origin.x.px(), rect.origin.y.px()), - Size2D::new(rect.size.width.px(), rect.size.height.px()), + Point2D::new(rect.origin.x.to_f32_px(), rect.origin.y.to_f32_px()), + Size2D::new(rect.size.width.to_f32_px(), rect.size.height.to_f32_px()), ) .round() .to_i32() @@ -232,14 +232,14 @@ pub fn process_resolved_style_request<'dom>( LonghandId::Height if resolved_size_should_be_used_value(fragment) => { Some(content_rect.size.height) }, - LonghandId::MarginBottom => Some(margins.bottom.into()), - LonghandId::MarginTop => Some(margins.top.into()), - LonghandId::MarginLeft => Some(margins.left.into()), - LonghandId::MarginRight => Some(margins.right.into()), - LonghandId::PaddingBottom => Some(padding.bottom.into()), - LonghandId::PaddingTop => Some(padding.top.into()), - LonghandId::PaddingLeft => Some(padding.left.into()), - LonghandId::PaddingRight => Some(padding.right.into()), + LonghandId::MarginBottom => Some(margins.bottom), + LonghandId::MarginTop => Some(margins.top), + LonghandId::MarginLeft => Some(margins.left), + LonghandId::MarginRight => Some(margins.right), + LonghandId::PaddingBottom => Some(padding.bottom), + LonghandId::PaddingTop => Some(padding.top), + LonghandId::PaddingLeft => Some(padding.left), + LonghandId::PaddingRight => Some(padding.right), _ => None, } .map(|value| value.to_css_string()) @@ -383,18 +383,8 @@ fn process_offset_parent_query_inner( Fragment::Image(_) | Fragment::IFrame(_) => unreachable!(), }; - let border_box = fragment_relative_rect.translate(containing_block.origin.to_vector()); - let mut border_box = Rect::new( - Point2D::new( - Au::from_f32_px(border_box.origin.x.px()), - Au::from_f32_px(border_box.origin.y.px()), - ), - Size2D::new( - Au::from_f32_px(border_box.size.width.px()), - Au::from_f32_px(border_box.size.height.px()), - ), - ); + let mut border_box = fragment_relative_rect.translate(containing_block.origin.to_vector()).to_untyped(); // "If any of the following holds true return null and terminate // this algorithm: [...] The element’s computed value of the @@ -477,10 +467,7 @@ fn process_offset_parent_query_inner( .origin .to_vector() + containing_block.origin.to_vector(); - let padding_box_corner = Vector2D::new( - Au::from_f32_px(padding_box_corner.x.px()), - Au::from_f32_px(padding_box_corner.y.px()), - ); + let padding_box_corner = padding_box_corner.to_untyped(); Some(padding_box_corner) } else { None diff --git a/components/layout_2020/replaced.rs b/components/layout_2020/replaced.rs index fbd359709c2..3b126d3f6b9 100644 --- a/components/layout_2020/replaced.rs +++ b/components/layout_2020/replaced.rs @@ -279,7 +279,7 @@ impl ReplacedContent { style: style.clone(), rect: LogicalRect { start_corner: LogicalVec2::zero(), - size: size.into(), + size, }, image_key, }) @@ -291,7 +291,7 @@ impl ReplacedContent { style: style.clone(), rect: LogicalRect { start_corner: LogicalVec2::zero(), - size: size.into(), + size, }, image_key: video.image_key, })], @@ -303,7 +303,7 @@ impl ReplacedContent { browsing_context_id: iframe.browsing_context_id, rect: LogicalRect { start_corner: LogicalVec2::zero(), - size: size.into(), + size, }, })] }, @@ -337,7 +337,7 @@ impl ReplacedContent { style: style.clone(), rect: LogicalRect { start_corner: LogicalVec2::zero(), - size: size.into(), + size, }, image_key, })] diff --git a/components/layout_2020/table/layout.rs b/components/layout_2020/table/layout.rs index 3cabdf7727d..7036760c88b 100644 --- a/components/layout_2020/table/layout.rs +++ b/components/layout_2020/table/layout.rs @@ -13,9 +13,7 @@ use style::computed_values::empty_cells::T as EmptyCells; use style::computed_values::visibility::T as Visibility; use style::logical_geometry::WritingMode; use style::properties::ComputedValues; -use style::values::computed::{ - CSSPixelLength, Length, LengthPercentage as ComputedLengthPercentage, Percentage, -}; +use style::values::computed::{Length, LengthPercentage as ComputedLengthPercentage, Percentage}; use style::values::generics::box_::{GenericVerticalAlign as VerticalAlign, VerticalAlignKeyword}; use style::values::generics::length::GenericLengthPercentageOrAuto::{Auto, LengthPercentage}; use style::Zero; @@ -39,8 +37,8 @@ use crate::ContainingBlock; /// covered by spans or empty. struct CellLayout { layout: IndependentLayout, - padding: LogicalSides, - border: LogicalSides, + padding: LogicalSides, + border: LogicalSides, positioning_context: PositioningContext, } @@ -54,7 +52,7 @@ impl CellLayout { /// The block size of this laid out cell including its border and padding. fn outer_block_size(&self) -> Au { - self.layout.content_block_size + (self.border.block_sum() + self.padding.block_sum()).into() + self.layout.content_block_size + self.border.block_sum() + self.padding.block_sum() } /// Whether the cell has no in-flow or out-of-flow contents, other than collapsed whitespace. @@ -1043,7 +1041,7 @@ impl<'a> TableLayout<'a> { total_width += self.distributed_column_widths[width_index]; } - let border = self + let border: LogicalSides = self .get_collapsed_borders_for_cell( cell, TableSlotCoordinates::new(column_index, row_index), @@ -1051,19 +1049,19 @@ impl<'a> TableLayout<'a> { .unwrap_or_else(|| { cell.style .border_width(containing_block_for_table.style.writing_mode) - }); + }) + .into(); - let padding = cell + let padding: LogicalSides = cell .style .padding(containing_block_for_table.style.writing_mode) - .percentages_relative_to(self.basis_for_cell_padding_percentage.into()); + .percentages_relative_to(self.basis_for_cell_padding_percentage.into()) + .into(); let inline_border_padding_sum = border.inline_sum() + padding.inline_sum(); - let mut total_width: CSSPixelLength = - Length::from(total_width) - inline_border_padding_sum; - total_width = total_width.max(Length::zero()); + let total_width = (total_width - inline_border_padding_sum).max(Au::zero()); let containing_block_for_children = ContainingBlock { - inline_size: total_width.into(), + inline_size: total_width, block_size: AuOrAuto::Auto, style: &cell.style, }; @@ -1131,15 +1129,14 @@ impl<'a> TableLayout<'a> { let border_padding_start = layout.border.block_start + layout.padding.block_start; let border_padding_end = layout.border.block_end + layout.padding.block_end; - max_ascent.max_assign(ascent + border_padding_start.into()); + max_ascent.max_assign(ascent + border_padding_start); // Only take into account the descent of this cell if doesn't span // rows. The descent portion of the cell in cells that do span rows // may extend into other rows. if cell.rowspan == 1 { max_descent.max_assign( - layout.layout.content_block_size - ascent + - border_padding_end.into(), + layout.layout.content_block_size - ascent + border_padding_end, ); } } @@ -1721,7 +1718,7 @@ impl<'a> TableLayout<'a> { if !column_group.is_empty() { fragments.push(Fragment::Positioning(PositioningFragment::new_empty( column_group.base_fragment_info, - dimensions.get_column_group_rect(column_group).into(), + dimensions.get_column_group_rect(column_group), column_group.style.clone(), ))); } @@ -1730,7 +1727,7 @@ impl<'a> TableLayout<'a> { for (column_index, column) in self.table.columns.iter().enumerate() { fragments.push(Fragment::Positioning(PositioningFragment::new_empty( column.base_fragment_info, - dimensions.get_column_rect(column_index).into(), + dimensions.get_column_rect(column_index), column.style.clone(), ))); } @@ -1826,22 +1823,19 @@ impl<'a> RowFragmentLayout<'a> { containing_block: &ContainingBlock, row_group_fragment_layout: &mut Option, ) -> BoxFragment { - let mut row_rect: LogicalRect = self.rect.into(); if self.positioning_context.is_some() { - row_rect.start_corner += relative_adjustement(&self.row.style, containing_block); + self.rect.start_corner += relative_adjustement(&self.row.style, containing_block); } if let Some(ref row_group_layout) = row_group_fragment_layout { - let row_group_start_corner: LogicalVec2 = - row_group_layout.rect.start_corner.into(); - row_rect.start_corner -= row_group_start_corner; + self.rect.start_corner -= row_group_layout.rect.start_corner; } let mut row_fragment = BoxFragment::new( self.row.base_fragment_info, self.row.style.clone(), self.fragments, - row_rect, + self.rect, LogicalSides::zero(), /* padding */ LogicalSides::zero(), /* border */ LogicalSides::zero(), /* margin */ @@ -1896,16 +1890,15 @@ impl RowGroupFragmentLayout { table_positioning_context: &mut PositioningContext, containing_block: &ContainingBlock, ) -> BoxFragment { - let mut content_rect: LogicalRect = self.rect.into(); if self.positioning_context.is_some() { - content_rect.start_corner += relative_adjustement(&self.style, containing_block); + self.rect.start_corner += relative_adjustement(&self.style, containing_block); } let mut row_group_fragment = BoxFragment::new( self.base_fragment_info, self.style, self.fragments, - content_rect, + self.rect, LogicalSides::zero(), /* padding */ LogicalSides::zero(), /* border */ LogicalSides::zero(), /* margin */ @@ -2207,19 +2200,18 @@ impl TableSlotCell { // This must be scoped to this function because it conflicts with euclid's Zero. use style::Zero as StyleZero; - let cell_rect: LogicalRect = cell_rect.into(); let cell_content_rect = cell_rect.deflate(&(&layout.padding + &layout.border)); - let content_block_size = layout.layout.content_block_size.into(); + let content_block_size = layout.layout.content_block_size; let vertical_align_offset = match self.effective_vertical_align() { - VerticalAlignKeyword::Top => Length::new(0.), + VerticalAlignKeyword::Top => Au::zero(), VerticalAlignKeyword::Bottom => cell_content_rect.size.block - content_block_size, VerticalAlignKeyword::Middle => { (cell_content_rect.size.block - content_block_size).scale_by(0.5) }, _ => { - Length::from(cell_baseline) - + cell_baseline - (layout.padding.block_start + layout.border.block_start) - - Length::from(layout.ascent()) + layout.ascent() }, }; @@ -2234,7 +2226,7 @@ impl TableSlotCell { // Create an `AnonymousFragment` to move the cell contents to the cell baseline. let mut vertical_align_fragment_rect = cell_content_rect.clone(); vertical_align_fragment_rect.start_corner = LogicalVec2 { - inline: Length::new(0.), + inline: Au::zero(), block: vertical_align_offset, }; let vertical_align_fragment = PositioningFragment::new_anonymous( @@ -2263,8 +2255,8 @@ impl TableSlotCell { self.style.clone(), vec![Fragment::Positioning(vertical_align_fragment)], cell_content_rect, - layout.padding.into(), - layout.border.into(), + layout.padding, + layout.border, LogicalSides::zero(), /* margin */ None, /* clearance */ CollapsedBlockMargins::zero(), diff --git a/tests/wpt/meta/css/CSS2/positioning/position-relative-032.xht.ini b/tests/wpt/meta/css/CSS2/positioning/position-relative-032.xht.ini deleted file mode 100644 index fe049ea1775..00000000000 --- a/tests/wpt/meta/css/CSS2/positioning/position-relative-032.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[position-relative-032.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/compositing/mix-blend-mode/mix-blend-mode-parent-with-3D-transform.html.ini b/tests/wpt/meta/css/compositing/mix-blend-mode/mix-blend-mode-parent-with-3D-transform.html.ini deleted file mode 100644 index 1227243bca3..00000000000 --- a/tests/wpt/meta/css/compositing/mix-blend-mode/mix-blend-mode-parent-with-3D-transform.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[mix-blend-mode-parent-with-3D-transform.html] - expected: FAIL - diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-align-self-baseline-horiz-004.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-align-self-baseline-horiz-004.xhtml.ini deleted file mode 100644 index 8fa9893bbd2..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-align-self-baseline-horiz-004.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-align-self-baseline-horiz-004.xhtml] - expected: FAIL