mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
layout: Paint stacking contexts' overflow areas properly.
This was making `box-shadow` not show up in many cases, in particular, but the effects were not limited to that.
This commit is contained in:
parent
ba8cf6b0e6
commit
5ea2c6dcfd
30 changed files with 357 additions and 179 deletions
|
@ -148,20 +148,21 @@ fn initialize_layers<C>(compositor: &mut C,
|
|||
stacking_context: &StackingContext,
|
||||
page_position: &Point2D<Au>) {
|
||||
let page_position = stacking_context.bounds.origin + *page_position;
|
||||
match stacking_context.layer {
|
||||
None => {}
|
||||
Some(ref paint_layer) => {
|
||||
metadata.push(LayerMetadata {
|
||||
id: paint_layer.id,
|
||||
position:
|
||||
Rect(Point2D(page_position.x.to_nearest_px() as uint,
|
||||
page_position.y.to_nearest_px() as uint),
|
||||
Size2D(stacking_context.bounds.size.width.to_nearest_px() as uint,
|
||||
stacking_context.bounds.size.height.to_nearest_px() as uint)),
|
||||
background_color: paint_layer.background_color,
|
||||
scroll_policy: paint_layer.scroll_policy,
|
||||
})
|
||||
}
|
||||
if let Some(ref paint_layer) = stacking_context.layer {
|
||||
// Layers start at the top left of their overflow rect, as far as the info we give to
|
||||
// the compositor is concerned.
|
||||
let overflow_relative_page_position = page_position + stacking_context.overflow.origin;
|
||||
let layer_position =
|
||||
Rect(Point2D(overflow_relative_page_position.x.to_nearest_px() as i32,
|
||||
overflow_relative_page_position.y.to_nearest_px() as i32),
|
||||
Size2D(stacking_context.overflow.size.width.to_nearest_px() as i32,
|
||||
stacking_context.overflow.size.height.to_nearest_px() as i32));
|
||||
metadata.push(LayerMetadata {
|
||||
id: paint_layer.id,
|
||||
position: layer_position,
|
||||
background_color: paint_layer.background_color,
|
||||
scroll_policy: paint_layer.scroll_policy,
|
||||
})
|
||||
}
|
||||
|
||||
for kid in stacking_context.display_list.children.iter() {
|
||||
|
@ -384,15 +385,14 @@ impl<C> PaintTask<C> where C: PaintListener + Send {
|
|||
layer_id: LayerId) {
|
||||
profile(TimeProfilerCategory::Painting, None, self.time_profiler_chan.clone(), || {
|
||||
// Bail out if there is no appropriate stacking context.
|
||||
let stacking_context = match self.root_stacking_context {
|
||||
Some(ref stacking_context) => {
|
||||
match display_list::find_stacking_context_with_layer_id(stacking_context,
|
||||
layer_id) {
|
||||
Some(stacking_context) => stacking_context,
|
||||
None => return,
|
||||
}
|
||||
let stacking_context = if let Some(ref stacking_context) = self.root_stacking_context {
|
||||
match display_list::find_stacking_context_with_layer_id(stacking_context,
|
||||
layer_id) {
|
||||
Some(stacking_context) => stacking_context,
|
||||
None => return,
|
||||
}
|
||||
None => return,
|
||||
} else {
|
||||
return
|
||||
};
|
||||
|
||||
// Divide up the layer into tiles and distribute them to workers via a simple round-
|
||||
|
@ -547,8 +547,13 @@ impl WorkerThread {
|
|||
transient_clip: None,
|
||||
};
|
||||
|
||||
// Apply a translation to start at the boundaries of the stacking context, since the
|
||||
// layer's origin starts at its overflow rect's origin.
|
||||
let tile_bounds = tile.page_rect.translate(
|
||||
&Point2D(stacking_context.overflow.origin.x.to_subpx() as AzFloat,
|
||||
stacking_context.overflow.origin.y.to_subpx() as AzFloat));
|
||||
|
||||
// Apply the translation to paint the tile we want.
|
||||
let tile_bounds = tile.page_rect;
|
||||
let matrix: Matrix2D<AzFloat> = Matrix2D::identity();
|
||||
let matrix = matrix.scale(scale as AzFloat, scale as AzFloat);
|
||||
let matrix = matrix.translate(-tile_bounds.origin.x as AzFloat,
|
||||
|
@ -561,7 +566,7 @@ impl WorkerThread {
|
|||
profile(TimeProfilerCategory::PaintingPerTile, None,
|
||||
self.time_profiler_sender.clone(), || {
|
||||
stacking_context.optimize_and_draw_into_context(&mut paint_context,
|
||||
&tile.page_rect,
|
||||
&tile_bounds,
|
||||
&matrix,
|
||||
None);
|
||||
paint_context.draw_target.flush();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue