diff options
Diffstat (limited to 'components/layout/display_list/builder.rs')
-rw-r--r-- | components/layout/display_list/builder.rs | 62 |
1 files changed, 59 insertions, 3 deletions
diff --git a/components/layout/display_list/builder.rs b/components/layout/display_list/builder.rs index 1653afbc198..02bde1f6741 100644 --- a/components/layout/display_list/builder.rs +++ b/components/layout/display_list/builder.rs @@ -13,7 +13,7 @@ use crate::context::LayoutContext; use crate::display_list::background::{self, get_cyclic}; use crate::display_list::border; use crate::display_list::gradient; -use crate::display_list::items::{BaseDisplayItem, ClipScrollNode, BLUR_INFLATION_FACTOR}; +use crate::display_list::items::{self, BaseDisplayItem, ClipScrollNode, BLUR_INFLATION_FACTOR}; use crate::display_list::items::{ClipScrollNodeIndex, ClipScrollNodeType, ClippingAndScrolling}; use crate::display_list::items::{ClippingRegion, DisplayItem, DisplayItemMetadata, DisplayList}; use crate::display_list::items::{CommonDisplayItem, DisplayListSection}; @@ -43,7 +43,7 @@ use net_traits::image_cache::UsePlaceholder; use range::Range; use script_traits::IFrameSize; use servo_config::opts; -use servo_geometry::MaxRect; +use servo_geometry::{self, MaxRect}; use std::default::Default; use std::f32; use std::mem; @@ -716,6 +716,7 @@ impl Fragment { base, webrender_api::RectangleDisplayItem { color: background_color.to_layout(), + common: items::empty_common_item_properties(), }, ))); }); @@ -854,6 +855,8 @@ impl Fragment { state.add_image_item( base, webrender_api::ImageDisplayItem { + bounds: placement.bounds.to_f32_px(), + common: items::empty_common_item_properties(), image_key: webrender_image.key.unwrap(), stretch_size: placement.tile_size.to_layout(), tile_spacing: placement.tile_spacing.to_layout(), @@ -976,6 +979,8 @@ impl Fragment { ); let item = webrender_api::GradientDisplayItem { gradient, + bounds: placement.bounds.to_f32_px(), + common: items::empty_common_item_properties(), tile_size: placement.tile_size.to_layout(), tile_spacing: placement.tile_spacing.to_layout(), }; @@ -992,6 +997,8 @@ impl Fragment { ); let item = webrender_api::RadialGradientDisplayItem { gradient, + bounds: placement.bounds.to_f32_px(), + common: items::empty_common_item_properties(), tile_size: placement.tile_size.to_layout(), tile_spacing: placement.tile_spacing.to_layout(), }; @@ -1034,6 +1041,7 @@ impl Fragment { state.add_display_item(DisplayItem::BoxShadow(CommonDisplayItem::new( base, webrender_api::BoxShadowDisplayItem { + common: items::empty_common_item_properties(), box_bounds: absolute_bounds.to_layout(), color: style.resolve_color(box_shadow.base.color).to_layout(), offset: LayoutVector2D::new( @@ -1157,9 +1165,12 @@ impl Fragment { radius: border_radius, do_aa: true, }); + let bounds = base.bounds; state.add_display_item(DisplayItem::Border(CommonDisplayItem::with_data( base, webrender_api::BorderDisplayItem { + bounds, + common: items::empty_common_item_properties(), widths: border_widths.to_layout(), details, }, @@ -1261,9 +1272,12 @@ impl Fragment { border_image_outset.left.to_f32_px(), ), }); + let bounds = base.bounds; state.add_display_item(DisplayItem::Border(CommonDisplayItem::with_data( base, webrender_api::BorderDisplayItem { + bounds, + common: items::empty_common_item_properties(), widths: border_image_width, details, }, @@ -1313,9 +1327,12 @@ impl Fragment { get_cursor(&style, Cursor::Default), DisplayListSection::Outlines, ); + let bounds = base.bounds; state.add_display_item(DisplayItem::Border(CommonDisplayItem::with_data( base, webrender_api::BorderDisplayItem { + bounds, + common: items::empty_common_item_properties(), widths: SideOffsets2D::new_all_same(width).to_layout(), details: BorderDetails::Normal(border::simple(color, outline_style.to_layout())), }, @@ -1344,9 +1361,12 @@ impl Fragment { get_cursor(&style, Cursor::Default), DisplayListSection::Content, ); + let bounds = base.bounds; state.add_display_item(DisplayItem::Border(CommonDisplayItem::with_data( base, webrender_api::BorderDisplayItem { + bounds, + common: items::empty_common_item_properties(), widths: SideOffsets2D::new_all_same(Au::from_px(1)).to_layout(), details: BorderDetails::Normal(border::simple( ColorU::new(0, 0, 200, 1).into(), @@ -1375,9 +1395,12 @@ impl Fragment { ); // TODO(gw): Use a better estimate for wavy line thickness. let wavy_line_thickness = (0.33 * base.bounds.size.height).ceil(); + let area = base.bounds; state.add_display_item(DisplayItem::Line(CommonDisplayItem::new( base, webrender_api::LineDisplayItem { + common: items::empty_common_item_properties(), + area, orientation: webrender_api::LineOrientation::Horizontal, wavy_line_thickness, color: ColorU::new(0, 200, 0, 1).into(), @@ -1401,9 +1424,12 @@ impl Fragment { get_cursor(&self.style, Cursor::Default), DisplayListSection::Content, ); + let bounds = base.bounds; state.add_display_item(DisplayItem::Border(CommonDisplayItem::with_data( base, webrender_api::BorderDisplayItem { + bounds, + common: items::empty_common_item_properties(), widths: SideOffsets2D::new_all_same(Au::from_px(1)).to_layout(), details: BorderDetails::Normal(border::simple( ColorU::new(0, 0, 200, 1).into(), @@ -1446,6 +1472,7 @@ impl Fragment { state.add_display_item(DisplayItem::Rectangle(CommonDisplayItem::new( base, webrender_api::RectangleDisplayItem { + common: items::empty_common_item_properties(), color: background_color.to_layout(), }, ))); @@ -1492,6 +1519,7 @@ impl Fragment { state.add_display_item(DisplayItem::Rectangle(CommonDisplayItem::new( base, webrender_api::RectangleDisplayItem { + common: items::empty_common_item_properties(), color: self.style().get_inherited_text().color.to_layout(), }, ))); @@ -1676,6 +1704,7 @@ impl Fragment { state.add_display_item(DisplayItem::Rectangle(CommonDisplayItem::new( base, webrender_api::RectangleDisplayItem { + common: items::empty_common_item_properties(), color: ColorF::TRANSPARENT, }, ))); @@ -1824,9 +1853,12 @@ impl Fragment { if let Some(ref image) = image_fragment.image { if let Some(id) = image.id { let base = create_base_display_item(state); + let bounds = base.bounds; state.add_image_item( base, webrender_api::ImageDisplayItem { + bounds, + common: items::empty_common_item_properties(), image_key: id, stretch_size: stacking_relative_content_box.size.to_layout(), tile_spacing: LayoutSize::zero(), @@ -1845,9 +1877,12 @@ impl Fragment { SpecificFragmentInfo::Media(ref fragment_info) => { if let Some((ref image_key, _, _)) = fragment_info.current_frame { let base = create_base_display_item(state); + let bounds = base.bounds; state.add_image_item( base, webrender_api::ImageDisplayItem { + bounds, + common: items::empty_common_item_properties(), image_key: *image_key, stretch_size: stacking_relative_border_box.size.to_layout(), tile_spacing: LayoutSize::zero(), @@ -1879,6 +1914,8 @@ impl Fragment { let base = create_base_display_item(state); let display_item = webrender_api::ImageDisplayItem { + bounds: base.bounds, + common: items::empty_common_item_properties(), image_key, stretch_size: stacking_relative_content_box.size.to_layout(), tile_spacing: LayoutSize::zero(), @@ -2015,7 +2052,6 @@ impl Fragment { offset: LayoutVector2D::new(shadow.horizontal.px(), shadow.vertical.px()), color: self.style.resolve_color(shadow.color).to_layout(), blur_radius: shadow.blur.px(), - should_inflate: true, }, }, ))); @@ -2075,6 +2111,8 @@ impl Fragment { state.add_display_item(DisplayItem::Text(CommonDisplayItem::with_data( base.clone(), webrender_api::TextDisplayItem { + bounds: base.bounds, + common: items::empty_common_item_properties(), font_key: text_fragment.run.font_key, color: text_color.to_layout(), glyph_options: None, @@ -2130,9 +2168,12 @@ impl Fragment { // TODO(gw): Use a better estimate for wavy line thickness. let wavy_line_thickness = (0.33 * base.bounds.size.height).ceil(); + let area = base.bounds; state.add_display_item(DisplayItem::Line(CommonDisplayItem::new( base, webrender_api::LineDisplayItem { + common: items::empty_common_item_properties(), + area, orientation: webrender_api::LineOrientation::Horizontal, wavy_line_thickness, color: color.to_layout(), @@ -2843,9 +2884,12 @@ impl BaseFlow { None, DisplayListSection::Content, ); + let bounds = base.bounds; state.add_display_item(DisplayItem::Border(CommonDisplayItem::with_data( base, webrender_api::BorderDisplayItem { + bounds, + common: items::empty_common_item_properties(), widths: SideOffsets2D::new_all_same(Au::from_px(2)).to_layout(), details: BorderDetails::Normal(border::simple( color, @@ -3011,3 +3055,15 @@ impl IndexableText { ) } } + +trait ToF32Px { + type Output; + fn to_f32_px(&self) -> Self::Output; +} + +impl ToF32Px for TypedRect<Au> { + type Output = LayoutRect; + fn to_f32_px(&self) -> LayoutRect { + LayoutRect::from_untyped(&servo_geometry::au_rect_to_f32_rect(*self)) + } +} |