mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
Remove the concept of nested stacking contexts from display list builder
With the removal of the legacy rendering path, we don't need to worry about nested stacking contexts. This change just pushes the complication to the WebRender conversion step, but a later change will remove the concept from WebRender as well. This also helps to prepare for the introduction of ids for particular scrolling regions, an integral part of multiple ScrollLayers per block.
This commit is contained in:
parent
983edb9b0b
commit
2219b14be9
4 changed files with 105 additions and 109 deletions
|
@ -9,7 +9,7 @@
|
|||
|
||||
use app_units::Au;
|
||||
use azure::azure_hl::Color;
|
||||
use euclid::{Point2D, Rect, Size2D};
|
||||
use euclid::{Matrix4D, Point2D, Rect, Size2D};
|
||||
use gfx::display_list::{BorderRadii, BoxShadowClipMode, ClippingRegion};
|
||||
use gfx::display_list::{DisplayItem, DisplayList, DisplayListTraversal};
|
||||
use gfx::display_list::{GradientStop, StackingContext, StackingContextType};
|
||||
|
@ -266,7 +266,7 @@ impl WebRenderStackingContextConverter for StackingContext {
|
|||
let stacking_context = &stacking_context_item.stacking_context;
|
||||
debug_assert!(stacking_context.context_type == StackingContextType::Real);
|
||||
|
||||
let scroll_layer_id_for_children = if self.scrolls_overflow_area {
|
||||
let scroll_layer_id_for_children = if self.overflow_scroll_id.is_some() {
|
||||
scroll_layer_id
|
||||
} else {
|
||||
None
|
||||
|
@ -294,7 +294,7 @@ impl WebRenderStackingContextConverter for StackingContext {
|
|||
api: &mut webrender_traits::RenderApi,
|
||||
pipeline_id: webrender_traits::PipelineId,
|
||||
epoch: webrender_traits::Epoch,
|
||||
mut scroll_layer_id: Option<webrender_traits::ScrollLayerId>,
|
||||
scroll_layer_id: Option<webrender_traits::ScrollLayerId>,
|
||||
mut scroll_policy: ScrollPolicy,
|
||||
frame_builder: &mut WebRenderFrameBuilder)
|
||||
-> webrender_traits::StackingContextId {
|
||||
|
@ -309,12 +309,18 @@ impl WebRenderStackingContextConverter for StackingContext {
|
|||
|
||||
let webrender_stacking_context_id = self.id.convert_to_webrender();
|
||||
|
||||
let outer_overflow = if self.overflow_scroll_id.is_none() {
|
||||
self.overflow.to_rectf()
|
||||
} else {
|
||||
Rect::new(Point2D::zero(), self.bounds.size).to_rectf()
|
||||
};
|
||||
|
||||
let mut sc =
|
||||
webrender_traits::StackingContext::new(webrender_stacking_context_id,
|
||||
scroll_layer_id,
|
||||
webrender_scroll_policy,
|
||||
self.bounds.to_rectf(),
|
||||
self.overflow.to_rectf(),
|
||||
outer_overflow,
|
||||
self.z_index,
|
||||
&self.transform,
|
||||
&self.perspective,
|
||||
|
@ -325,19 +331,49 @@ impl WebRenderStackingContextConverter for StackingContext {
|
|||
|
||||
let mut builder = webrender_traits::DisplayListBuilder::new();
|
||||
|
||||
if self.scrolls_overflow_area {
|
||||
scroll_layer_id = Some(frame_builder.next_scroll_layer_id());
|
||||
if let Some(inner_stacking_context_id) = self.overflow_scroll_id {
|
||||
let inner_webrender_stacking_context_id =
|
||||
inner_stacking_context_id.convert_to_webrender();
|
||||
let mut inner_sc =
|
||||
webrender_traits::StackingContext::new(inner_webrender_stacking_context_id,
|
||||
Some(frame_builder.next_scroll_layer_id()),
|
||||
webrender_scroll_policy,
|
||||
self.overflow.to_rectf(),
|
||||
self.overflow.to_rectf(),
|
||||
self.z_index,
|
||||
&Matrix4D::identity(),
|
||||
&Matrix4D::identity(),
|
||||
false,
|
||||
webrender_traits::MixBlendMode::Normal,
|
||||
Vec::new(),
|
||||
&mut frame_builder.auxiliary_lists_builder);
|
||||
let mut inner_builder = webrender_traits::DisplayListBuilder::new();
|
||||
self.convert_children_to_webrender(traversal,
|
||||
api,
|
||||
pipeline_id,
|
||||
epoch,
|
||||
None,
|
||||
scroll_policy,
|
||||
&mut inner_builder,
|
||||
frame_builder,
|
||||
false);
|
||||
|
||||
frame_builder.add_display_list(api, inner_builder.finalize(), &mut inner_sc);
|
||||
let new_id = frame_builder.add_stacking_context(api, pipeline_id, inner_sc);
|
||||
builder.push_stacking_context(new_id);
|
||||
} else {
|
||||
self.convert_children_to_webrender(traversal,
|
||||
api,
|
||||
pipeline_id,
|
||||
epoch,
|
||||
scroll_layer_id,
|
||||
scroll_policy,
|
||||
&mut builder,
|
||||
frame_builder,
|
||||
false);
|
||||
}
|
||||
|
||||
self.convert_children_to_webrender(traversal,
|
||||
api,
|
||||
pipeline_id,
|
||||
epoch,
|
||||
scroll_layer_id,
|
||||
scroll_policy,
|
||||
&mut builder,
|
||||
frame_builder,
|
||||
false);
|
||||
|
||||
frame_builder.add_display_list(api, builder.finalize(), &mut sc);
|
||||
frame_builder.add_stacking_context(api, pipeline_id, sc)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue