diff options
Diffstat (limited to 'components/layout_2020/display_list')
-rw-r--r-- | components/layout_2020/display_list/background.rs | 4 | ||||
-rw-r--r-- | components/layout_2020/display_list/conversions.rs | 2 | ||||
-rw-r--r-- | components/layout_2020/display_list/mod.rs | 89 | ||||
-rw-r--r-- | components/layout_2020/display_list/stacking_context.rs | 25 |
4 files changed, 49 insertions, 71 deletions
diff --git a/components/layout_2020/display_list/background.rs b/components/layout_2020/display_list/background.rs index a8e5b6cce24..6ea3f743122 100644 --- a/components/layout_2020/display_list/background.rs +++ b/components/layout_2020/display_list/background.rs @@ -66,8 +66,8 @@ pub(super) fn painting_area<'a>( }; // The 'backgound-clip' property maps directly to `clip_rect` in `CommonItemProperties`: let mut common = builder.common_properties(*painting_area, &fb.fragment.style); - if let Some(clip_chain_id) = clip { - common.clip_id = wr::ClipId::ClipChain(clip_chain_id) + if let Some(clip_id) = clip { + common.clip_id = clip_id } (painting_area, common) } diff --git a/components/layout_2020/display_list/conversions.rs b/components/layout_2020/display_list/conversions.rs index b0022c99cdf..e7f86c0ad36 100644 --- a/components/layout_2020/display_list/conversions.rs +++ b/components/layout_2020/display_list/conversions.rs @@ -19,7 +19,7 @@ impl ToWebRender for ComputedFilter { type Type = FilterOp; fn to_webrender(&self) -> Self::Type { match *self { - ComputedFilter::Blur(radius) => FilterOp::Blur(radius.px(), radius.px()), + ComputedFilter::Blur(radius) => FilterOp::Blur(radius.px()), ComputedFilter::Brightness(amount) => FilterOp::Brightness(amount.0), ComputedFilter::Contrast(amount) => FilterOp::Contrast(amount.0), ComputedFilter::Grayscale(amount) => FilterOp::Grayscale(amount.0), diff --git a/components/layout_2020/display_list/mod.rs b/components/layout_2020/display_list/mod.rs index 228aa6df62f..edaf7b294ca 100644 --- a/components/layout_2020/display_list/mod.rs +++ b/components/layout_2020/display_list/mod.rs @@ -20,7 +20,7 @@ use style::values::computed::{BorderStyle, Color, Length, LengthPercentage, Outl use style::values::specified::text::TextDecorationLine; use style::values::specified::ui::CursorKind; use style_traits::CSSPixel; -use webrender_api::{self as wr, units, ClipChainId, ClipId, CommonItemProperties}; +use webrender_api::{self as wr, units}; use crate::context::LayoutContext; use crate::display_list::conversions::ToWebRender; @@ -73,7 +73,7 @@ impl DisplayList { epoch: wr::Epoch, ) -> Self { Self { - wr: wr::DisplayListBuilder::new(pipeline_id), + wr: wr::DisplayListBuilder::new(pipeline_id, content_size), compositor_info: CompositorDisplayListInfo::new( viewport_size, content_size, @@ -95,7 +95,7 @@ pub(crate) struct DisplayListBuilder<'a> { /// only passing the builder instead passing the containing /// [stacking_context::StackingContextFragment] as an argument to display /// list building functions. - current_clip_chain_id: ClipChainId, + current_clip_id: wr::ClipId, /// The [OpaqueNode] handle to the node used to paint the page background /// if the background was a canvas. @@ -128,8 +128,8 @@ impl DisplayList { root_stacking_context: &StackingContext, ) -> (FnvHashMap<BrowsingContextId, Size2D<f32, CSSPixel>>, bool) { let mut builder = DisplayListBuilder { - current_scroll_node_id: self.compositor_info.root_reference_frame_id, - current_clip_chain_id: ClipChainId(0, self.compositor_info.pipeline_id), + current_scroll_node_id: self.compositor_info.root_scroll_node_id, + current_clip_id: wr::ClipId::root(self.wr.pipeline_id), element_for_canvas_background: fragment_tree.canvas_background.from_element, is_contentful: false, context, @@ -157,7 +157,8 @@ impl<'a> DisplayListBuilder<'a> { wr::CommonItemProperties { clip_rect, spatial_id: self.current_scroll_node_id.spatial_id, - clip_id: ClipId::ClipChain(self.current_clip_chain_id), + clip_id: self.current_clip_id, + hit_info: None, flags: style.get_webrender_primitive_flags(), } } @@ -282,21 +283,12 @@ impl Fragment { return; } - if let Some(hit_info) = - builder.hit_info(&fragment.parent_style, fragment.base.tag, Cursor::Text) - { - let clip_chain_id = builder.current_clip_chain_id; - let spatial_id = builder.current_scroll_node_id.spatial_id; - builder.wr().push_hit_test( - &CommonItemProperties { - clip_rect: rect.to_webrender(), - clip_id: ClipId::ClipChain(clip_chain_id), - spatial_id, - flags: fragment.parent_style.get_webrender_primitive_flags(), - }, - hit_info, - ); - } + let common = builder.common_properties(rect.to_webrender(), &fragment.parent_style); + + let hit_info = builder.hit_info(&fragment.parent_style, fragment.base.tag, Cursor::Text); + let mut hit_test_common = common.clone(); + hit_test_common.hit_info = hit_info; + builder.wr().push_hit_test(&hit_test_common); let color = fragment.parent_style.clone_color(); let font_metrics = &fragment.font_metrics; @@ -328,7 +320,6 @@ impl Fragment { } // Text. - let common = builder.common_properties(rect.to_webrender(), &fragment.parent_style); builder.wr().push_text( &common, rect.to_webrender(), @@ -387,9 +378,9 @@ struct BuilderForBoxFragment<'a> { padding_rect: OnceCell<units::LayoutRect>, content_rect: OnceCell<units::LayoutRect>, border_radius: wr::BorderRadius, - border_edge_clip_chain_id: OnceCell<Option<ClipChainId>>, - padding_edge_clip_chain_id: OnceCell<Option<ClipChainId>>, - content_edge_clip_chain_id: OnceCell<Option<ClipChainId>>, + border_edge_clip_id: OnceCell<Option<wr::ClipId>>, + padding_edge_clip_id: OnceCell<Option<wr::ClipId>>, + content_edge_clip_id: OnceCell<Option<wr::ClipId>>, } impl<'a> BuilderForBoxFragment<'a> { @@ -444,9 +435,9 @@ impl<'a> BuilderForBoxFragment<'a> { border_radius, padding_rect: OnceCell::new(), content_rect: OnceCell::new(), - border_edge_clip_chain_id: OnceCell::new(), - padding_edge_clip_chain_id: OnceCell::new(), - content_edge_clip_chain_id: OnceCell::new(), + border_edge_clip_id: OnceCell::new(), + padding_edge_clip_id: OnceCell::new(), + content_edge_clip_id: OnceCell::new(), } } @@ -470,14 +461,14 @@ impl<'a> BuilderForBoxFragment<'a> { }) } - fn border_edge_clip(&self, builder: &mut DisplayListBuilder) -> Option<ClipChainId> { + fn border_edge_clip(&self, builder: &mut DisplayListBuilder) -> Option<wr::ClipId> { *self - .border_edge_clip_chain_id + .border_edge_clip_id .get_or_init(|| clip_for_radii(self.border_radius, self.border_rect, builder)) } - fn padding_edge_clip(&self, builder: &mut DisplayListBuilder) -> Option<ClipChainId> { - *self.padding_edge_clip_chain_id.get_or_init(|| { + fn padding_edge_clip(&self, builder: &mut DisplayListBuilder) -> Option<wr::ClipId> { + *self.padding_edge_clip_id.get_or_init(|| { clip_for_radii( inner_radii( self.border_radius, @@ -492,8 +483,8 @@ impl<'a> BuilderForBoxFragment<'a> { }) } - fn content_edge_clip(&self, builder: &mut DisplayListBuilder) -> Option<ClipChainId> { - *self.content_edge_clip_chain_id.get_or_init(|| { + fn content_edge_clip(&self, builder: &mut DisplayListBuilder) -> Option<wr::ClipId> { + *self.content_edge_clip_id.get_or_init(|| { clip_for_radii( inner_radii( self.border_radius, @@ -523,16 +514,14 @@ impl<'a> BuilderForBoxFragment<'a> { self.fragment.base.tag, Cursor::Default, ); - let hit_info = match hit_info { - Some(hit_info) => hit_info, - None => return, - }; - - let mut common = builder.common_properties(self.border_rect, &self.fragment.style); - if let Some(clip_chain_id) = self.border_edge_clip(builder) { - common.clip_id = ClipId::ClipChain(clip_chain_id); + if hit_info.is_some() { + let mut common = builder.common_properties(self.border_rect, &self.fragment.style); + common.hit_info = hit_info; + if let Some(clip_id) = self.border_edge_clip(builder) { + common.clip_id = clip_id + } + builder.wr().push_hit_test(&common) } - builder.wr().push_hit_test(&common, hit_info); } fn build_background(&mut self, builder: &mut DisplayListBuilder) { @@ -881,27 +870,21 @@ fn clip_for_radii( radii: wr::BorderRadius, rect: units::LayoutRect, builder: &mut DisplayListBuilder, -) -> Option<ClipChainId> { +) -> Option<wr::ClipId> { if radii.is_zero() { None } else { - let clip_chain_id = builder.current_clip_chain_id.clone(); let parent_space_and_clip = wr::SpaceAndClipInfo { spatial_id: builder.current_scroll_node_id.spatial_id, - clip_id: ClipId::ClipChain(clip_chain_id), + clip_id: builder.current_clip_id, }; - let new_clip_id = builder.wr().define_clip_rounded_rect( + Some(builder.wr().define_clip_rounded_rect( &parent_space_and_clip, wr::ComplexClipRegion { rect, radii, mode: wr::ClipMode::Clip, }, - ); - Some( - builder - .wr() - .define_clip_chain(Some(clip_chain_id), [new_clip_id]), - ) + )) } } diff --git a/components/layout_2020/display_list/stacking_context.rs b/components/layout_2020/display_list/stacking_context.rs index f69e8f6e946..0e6abdbdc11 100644 --- a/components/layout_2020/display_list/stacking_context.rs +++ b/components/layout_2020/display_list/stacking_context.rs @@ -19,7 +19,6 @@ use style::values::generics::transform; use style::values::specified::box_::DisplayOutside; use webrender_api as wr; use webrender_api::units::{LayoutPoint, LayoutRect, LayoutTransform, LayoutVector2D}; -use webrender_api::ScrollSensitivity; use super::DisplayList; use crate::cell::ArcRefCell; @@ -152,16 +151,17 @@ impl DisplayList { external_id: wr::ExternalScrollId, content_rect: LayoutRect, clip_rect: LayoutRect, - scroll_sensitivity: ScrollSensitivity, + scroll_sensitivity: wr::ScrollSensitivity, + external_scroll_offset: LayoutVector2D, ) -> (ScrollTreeNodeId, wr::ClipChainId) { let parent_space_and_clip_info = wr::SpaceAndClipInfo { spatial_id: parent_scroll_node_id.spatial_id, clip_id: wr::ClipId::root(self.wr.pipeline_id), }; + let new_clip_id = self .wr .define_clip_rect(&parent_space_and_clip_info, clip_rect); - let new_clip_chain_id = self .wr .define_clip_chain(Some(*parent_clip_chain_id), [new_clip_id]); @@ -170,11 +170,11 @@ impl DisplayList { .wr .define_scroll_frame( &parent_space_and_clip_info, - external_id, + Some(external_id), content_rect, clip_rect, scroll_sensitivity, - LayoutVector2D::zero(), /* external_scroll_offset */ + external_scroll_offset, ) .spatial_id; @@ -203,7 +203,7 @@ pub(crate) struct StackingContextFragment { impl StackingContextFragment { fn build_display_list(&self, builder: &mut DisplayListBuilder) { builder.current_scroll_node_id = self.scroll_node_id; - builder.current_clip_chain_id = self.clip_chain_id; + builder.current_clip_id = wr::ClipId::ClipChain(self.clip_chain_id); self.fragment .borrow() .build_display_list(builder, &self.containing_block, self.section); @@ -965,9 +965,9 @@ impl BoxFragment { let sensitivity = if ComputedOverflow::Hidden == overflow_x && ComputedOverflow::Hidden == overflow_y { - ScrollSensitivity::Script + wr::ScrollSensitivity::Script } else { - ScrollSensitivity::ScriptAndInputEvents + wr::ScrollSensitivity::ScriptAndInputEvents }; let padding_rect = self @@ -985,6 +985,7 @@ impl BoxFragment { .to_webrender(), padding_rect, sensitivity, + LayoutVector2D::zero(), ), ) } @@ -1013,13 +1014,7 @@ impl BoxFragment { scrolling_relative_to: None, }, ), - (Some(transform), None) => ( - transform, - wr::ReferenceFrameKind::Transform { - is_2d_scale_translation: false, - should_snap: false, - }, - ), + (Some(transform), None) => (transform, wr::ReferenceFrameKind::Transform), (Some(transform), Some(perspective)) => ( perspective.then(&transform), wr::ReferenceFrameKind::Perspective { |