mirror of
https://github.com/servo/servo.git
synced 2025-08-07 06:25:32 +01:00
auto merge of #2575 : mbrubeck/servo/2259-remove-old-layers, r=pcwalton
This fixes #2259 which was caused by some of the previous layers sticking around incorrectly. Depends on mozilla-servo/rust-layers#69. Also includes some related cleanup as separate commits. No reftest because our test harness doesn't yet support navigating to a new page (#2574).
This commit is contained in:
commit
473b9e488b
6 changed files with 7 additions and 73 deletions
|
@ -298,10 +298,6 @@ impl IOCompositor {
|
||||||
self.set_layer_clip_rect(pipeline_id, layer_id, new_rect);
|
self.set_layer_clip_rect(pipeline_id, layer_id, new_rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
(Ok(DeleteLayerGroup(id)), _) => {
|
|
||||||
self.delete_layer(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
(Ok(Paint(pipeline_id, layer_id, new_layer_buffer_set, epoch)), false) => {
|
(Ok(Paint(pipeline_id, layer_id, new_layer_buffer_set, epoch)), false) => {
|
||||||
self.paint(pipeline_id, layer_id, new_layer_buffer_set, epoch);
|
self.paint(pipeline_id, layer_id, new_layer_buffer_set, epoch);
|
||||||
}
|
}
|
||||||
|
@ -367,8 +363,10 @@ impl IOCompositor {
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
match self.root_pipeline {
|
match self.root_pipeline {
|
||||||
Some(ref root_pipeline) => (root_pipeline.clone(), LayerId::null()),
|
Some(ref root_pipeline) if root_pipeline.id == id => {
|
||||||
None => fail!("Compositor: Received new layer without initialized pipeline"),
|
(root_pipeline.clone(), LayerId::null())
|
||||||
|
},
|
||||||
|
_ => fail!("Compositor: Received new layer without initialized pipeline"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -381,13 +379,7 @@ impl IOCompositor {
|
||||||
self.opts.cpu_painting);
|
self.opts.cpu_painting);
|
||||||
new_layer.unrendered_color = unrendered_color;
|
new_layer.unrendered_color = unrendered_color;
|
||||||
|
|
||||||
let first_child = self.root_layer.first_child.borrow().clone();
|
self.root_layer.remove_all_children();
|
||||||
match first_child {
|
|
||||||
None => {}
|
|
||||||
Some(old_layer) => {
|
|
||||||
ContainerLayer::remove_child(self.root_layer.clone(), old_layer)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
assert!(new_layer.add_child_if_necessary(self.root_layer.clone(),
|
assert!(new_layer.add_child_if_necessary(self.root_layer.clone(),
|
||||||
root_pipeline_id,
|
root_pipeline_id,
|
||||||
|
@ -478,22 +470,6 @@ impl IOCompositor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn delete_layer(&mut self, id: PipelineId) {
|
|
||||||
let ask: bool = match self.compositor_layer {
|
|
||||||
Some(ref mut layer) => {
|
|
||||||
assert!(layer.delete(&self.graphics_context, id));
|
|
||||||
true
|
|
||||||
}
|
|
||||||
None => {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if ask {
|
|
||||||
self.ask_for_tiles();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn paint(&mut self,
|
fn paint(&mut self,
|
||||||
pipeline_id: PipelineId,
|
pipeline_id: PipelineId,
|
||||||
layer_id: LayerId,
|
layer_id: LayerId,
|
||||||
|
|
|
@ -857,40 +857,6 @@ impl CompositorLayer {
|
||||||
return None
|
return None
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deletes a specified sublayer, including hidden children. Returns false if the layer is not
|
|
||||||
// found.
|
|
||||||
pub fn delete(&mut self,
|
|
||||||
graphics_context: &NativeCompositingGraphicsContext,
|
|
||||||
pipeline_id: PipelineId)
|
|
||||||
-> bool {
|
|
||||||
match self.children.iter().position(|x| x.child.pipeline.id == pipeline_id) {
|
|
||||||
Some(i) => {
|
|
||||||
let mut child = self.children.remove(i);
|
|
||||||
match self.quadtree {
|
|
||||||
NoTree(..) => {} // Nothing to do
|
|
||||||
Tree(ref mut quadtree) => {
|
|
||||||
match *child.get_ref().container.scissor.borrow() {
|
|
||||||
Some(rect) => {
|
|
||||||
quadtree.set_status_page(rect, Normal, false); // Unhide this rect
|
|
||||||
}
|
|
||||||
None => {} // Nothing to do
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send back all tiles to renderer.
|
|
||||||
child.get_mut_ref().child.clear_all_tiles();
|
|
||||||
|
|
||||||
self.build_layer_tree(graphics_context);
|
|
||||||
true
|
|
||||||
}
|
|
||||||
None => {
|
|
||||||
self.children.mut_iter().map(|x| &mut x.child)
|
|
||||||
.any(|x| x.delete(graphics_context, pipeline_id))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Recursively sets occluded portions of quadtrees to Hidden, so that they do not ask for
|
// Recursively sets occluded portions of quadtrees to Hidden, so that they do not ask for
|
||||||
// tile requests. If layers are moved, resized, or deleted, these portions may be updated.
|
// tile requests. If layers are moved, resized, or deleted, these portions may be updated.
|
||||||
fn set_occlusions(&mut self) {
|
fn set_occlusions(&mut self) {
|
||||||
|
|
|
@ -126,10 +126,6 @@ impl RenderListener for CompositorChan {
|
||||||
self.chan.send(SetLayerClipRect(pipeline_id, layer_id, new_rect))
|
self.chan.send(SetLayerClipRect(pipeline_id, layer_id, new_rect))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn delete_layer_group(&self, id: PipelineId) {
|
|
||||||
self.chan.send(DeleteLayerGroup(id))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn set_render_state(&self, render_state: RenderState) {
|
fn set_render_state(&self, render_state: RenderState) {
|
||||||
self.chan.send(ChangeRenderState(render_state))
|
self.chan.send(ChangeRenderState(render_state))
|
||||||
}
|
}
|
||||||
|
@ -175,8 +171,6 @@ pub enum Msg {
|
||||||
SetLayerPageSize(PipelineId, LayerId, Size2D<f32>, Epoch),
|
SetLayerPageSize(PipelineId, LayerId, Size2D<f32>, Epoch),
|
||||||
/// Alerts the compositor that the specified layer's clipping rect has changed.
|
/// Alerts the compositor that the specified layer's clipping rect has changed.
|
||||||
SetLayerClipRect(PipelineId, LayerId, Rect<f32>),
|
SetLayerClipRect(PipelineId, LayerId, Rect<f32>),
|
||||||
/// Alerts the compositor that the specified pipeline has been deleted.
|
|
||||||
DeleteLayerGroup(PipelineId),
|
|
||||||
/// Scroll a page in a window
|
/// Scroll a page in a window
|
||||||
ScrollFragmentPoint(PipelineId, LayerId, Point2D<f32>),
|
ScrollFragmentPoint(PipelineId, LayerId, Point2D<f32>),
|
||||||
/// Requests that the compositor paint the given layer buffer set for the given page size.
|
/// Requests that the compositor paint the given layer buffer set for the given page size.
|
||||||
|
|
|
@ -78,7 +78,7 @@ impl NullCompositor {
|
||||||
|
|
||||||
CreateRootCompositorLayerIfNecessary(..) |
|
CreateRootCompositorLayerIfNecessary(..) |
|
||||||
CreateDescendantCompositorLayerIfNecessary(..) | SetLayerPageSize(..) |
|
CreateDescendantCompositorLayerIfNecessary(..) | SetLayerPageSize(..) |
|
||||||
SetLayerClipRect(..) | DeleteLayerGroup(..) | Paint(..) |
|
SetLayerClipRect(..) | Paint(..) |
|
||||||
ChangeReadyState(..) | ChangeRenderState(..) | ScrollFragmentPoint(..) |
|
ChangeReadyState(..) | ChangeRenderState(..) | ScrollFragmentPoint(..) |
|
||||||
SetUnRenderedColor(..) | LoadComplete(..) => ()
|
SetUnRenderedColor(..) | LoadComplete(..) => ()
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,8 +134,6 @@ pub trait RenderListener {
|
||||||
layer_id: LayerId,
|
layer_id: LayerId,
|
||||||
new_rect: Rect<uint>);
|
new_rect: Rect<uint>);
|
||||||
|
|
||||||
fn delete_layer_group(&self, PipelineId);
|
|
||||||
|
|
||||||
/// Sends new tiles for the given layer to the compositor.
|
/// Sends new tiles for the given layer to the compositor.
|
||||||
fn paint(&self,
|
fn paint(&self,
|
||||||
pipeline_id: PipelineId,
|
pipeline_id: PipelineId,
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 29a0f4c36292314671778631e336aa845276c733
|
Subproject commit 261bef5849b817df2288f2f7dac5fe8f255a04ab
|
Loading…
Add table
Add a link
Reference in a new issue