aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/webrender_helpers.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout/webrender_helpers.rs')
-rw-r--r--components/layout/webrender_helpers.rs61
1 files changed, 42 insertions, 19 deletions
diff --git a/components/layout/webrender_helpers.rs b/components/layout/webrender_helpers.rs
index cf239f79258..07979940314 100644
--- a/components/layout/webrender_helpers.rs
+++ b/components/layout/webrender_helpers.rs
@@ -8,7 +8,7 @@
// completely converting layout to directly generate WebRender display lists, for example.
use app_units::Au;
-use euclid::{Point2D, Rect, Size2D};
+use euclid::{Matrix4D, Point2D, Rect, Size2D, TypedRect};
use gfx::display_list::{BorderRadii, BoxShadowClipMode, ClippingRegion};
use gfx::display_list::{DisplayItem, DisplayList, DisplayListTraversal};
use gfx::display_list::{StackingContext, StackingContextType};
@@ -24,7 +24,8 @@ trait WebRenderStackingContextConverter {
api: &mut webrender_traits::RenderApi,
pipeline_id: webrender_traits::PipelineId,
epoch: webrender_traits::Epoch,
- frame_builder: &mut WebRenderFrameBuilder)
+ frame_builder: &mut WebRenderFrameBuilder,
+ scroll_layer_id: Option<webrender_traits::ScrollLayerId>)
-> webrender_traits::StackingContextId;
fn convert_children_to_webrender<'a>(&self,
@@ -235,17 +236,39 @@ impl WebRenderStackingContextConverter for StackingContext {
&DisplayItem::PushStackingContext(ref stacking_context_item) => {
let stacking_context = &stacking_context_item.stacking_context;
debug_assert!(stacking_context.context_type == StackingContextType::Real);
-
- let stacking_context_id =
+ builder.push_stacking_context(
stacking_context.convert_to_webrender(traversal,
api,
pipeline_id,
epoch,
- frame_builder);
- builder.push_stacking_context(stacking_context_id);
-
+ frame_builder,
+ None));
}
- &DisplayItem::PopStackingContext(_) => return,
+ &DisplayItem::PushScrollRoot(ref item) => {
+ let stacking_context = StackingContext::new(
+ StackingContextId::new(0),
+ StackingContextType::Real,
+ &item.scroll_root.clip,
+ &TypedRect::new(Point2D::zero(), item.scroll_root.size),
+ 0,
+ filter::T::new(Vec::new()),
+ mix_blend_mode::T::normal,
+ Matrix4D::identity(),
+ Matrix4D::identity(),
+ true,
+ ScrollPolicy::Scrollable,
+ ScrollRootId::root());
+ let scroll_layer_id =
+ Some(frame_builder.next_scroll_layer_id(item.scroll_root.id));
+ builder.push_stacking_context(
+ stacking_context.convert_to_webrender(traversal,
+ api,
+ pipeline_id,
+ epoch,
+ frame_builder,
+ scroll_layer_id));
+ }
+ &DisplayItem::PopStackingContext(_) | &DisplayItem::PopScrollRoot(_) => return,
_ => item.convert_to_webrender(builder, frame_builder),
}
}
@@ -256,21 +279,14 @@ impl WebRenderStackingContextConverter for StackingContext {
api: &mut webrender_traits::RenderApi,
pipeline_id: webrender_traits::PipelineId,
epoch: webrender_traits::Epoch,
- frame_builder: &mut WebRenderFrameBuilder)
+ frame_builder: &mut WebRenderFrameBuilder,
+ scroll_layer_id: Option<webrender_traits::ScrollLayerId>)
-> webrender_traits::StackingContextId {
let webrender_scroll_policy = match self.scroll_policy {
ScrollPolicy::Scrollable => webrender_traits::ScrollPolicy::Scrollable,
ScrollPolicy::FixedPosition => webrender_traits::ScrollPolicy::Fixed,
};
- let scroll_layer_id = if let Some(scroll_root_id) = self.overflow_scroll_id {
- Some(frame_builder.next_scroll_layer_id(scroll_root_id))
- } else if self.id == StackingContextId::root() {
- Some(frame_builder.next_scroll_layer_id(ScrollRootId::root()))
- } else {
- None
- };
-
let mut sc =
webrender_traits::StackingContext::new(scroll_layer_id,
webrender_scroll_policy,
@@ -310,11 +326,14 @@ impl WebRenderDisplayListConverter for DisplayList {
match item {
Some(&DisplayItem::PushStackingContext(ref stacking_context_item)) => {
let stacking_context = &stacking_context_item.stacking_context;
+ let scroll_layer_id =
+ Some(frame_builder.next_scroll_layer_id(ScrollRootId::root()));
stacking_context.convert_to_webrender(&mut traversal,
api,
pipeline_id,
epoch,
- frame_builder)
+ frame_builder,
+ scroll_layer_id)
}
_ => unreachable!("DisplayList did not start with StackingContext."),
@@ -453,7 +472,11 @@ impl WebRenderDisplayItemConverter for DisplayItem {
item.base.clip.to_clip_region(frame_builder),
pipeline_id);
}
- DisplayItem::PushStackingContext(_) | DisplayItem::PopStackingContext(_) => {}
+ DisplayItem::PushStackingContext(_) |
+ DisplayItem::PopStackingContext(_) |
+ DisplayItem::PushScrollRoot(_) |
+ DisplayItem::PopScrollRoot(_) =>
+ unreachable!("Tried to convert a scroll root or stacking context structure item."),
}
}
}