diff --git a/graphics/src/layer.rs b/graphics/src/layer.rs index ea7911f9..bd14718c 100644 --- a/graphics/src/layer.rs +++ b/graphics/src/layer.rs @@ -143,23 +143,40 @@ impl Stack { pub fn merge(&mut self) { self.flush(); - let mut current = 0; + let mut left = self.active_count; - while current < self.active_count { - let (head, tail) = self.layers.split_at_mut(current + 1); + while left > 1 { + let mut current = left - 1; + let mut last = &self.layers[current]; + let mut last_start = last.start(); - let layer = &mut head[current]; - let mut candidate = 0; + while current > 0 { + let candidate = &self.layers[current - 1]; + let start = candidate.start(); + let end = candidate.end(); - while let Some(next_layer) = tail.get_mut(candidate) - && layer.end() <= next_layer.start() - && layer.bounds() == next_layer.bounds() - { - layer.merge(next_layer); - candidate += 1; + if end == 0 { + current -= 1; + continue; + } + + if end > last_start || candidate.bounds() != last.bounds() { + break; + } + + last = candidate; + last_start = start; + current -= 1; } - current += candidate + 1; + let (head, tail) = self.layers.split_at_mut(current + 1); + let layer = &mut head[current]; + + for middle in &mut tail[0..left - current - 1] { + layer.merge(middle); + } + + left = current; } } diff --git a/tiny_skia/src/layer.rs b/tiny_skia/src/layer.rs index 4555cdfa..00097f83 100644 --- a/tiny_skia/src/layer.rs +++ b/tiny_skia/src/layer.rs @@ -305,34 +305,38 @@ impl graphics::Layer for Layer { fn start(&self) -> usize { if !self.quads.is_empty() { - return 0; - } - - if !self.primitives.is_empty() { return 1; } - if !self.images.is_empty() { + if !self.primitives.is_empty() { return 2; } - if !self.text.is_empty() { + if !self.images.is_empty() { return 3; } - 0 + if !self.text.is_empty() { + return 4; + } + + usize::MAX } fn end(&self) -> usize { if !self.text.is_empty() { - return 3; + return 4; } if !self.images.is_empty() { - return 2; + return 3; } if !self.primitives.is_empty() { + return 2; + } + + if !self.quads.is_empty() { return 1; } diff --git a/wgpu/src/layer.rs b/wgpu/src/layer.rs index 1ad709d0..cd3a7de7 100644 --- a/wgpu/src/layer.rs +++ b/wgpu/src/layer.rs @@ -298,42 +298,46 @@ impl graphics::Layer for Layer { fn start(&self) -> usize { if !self.quads.is_empty() { - return 0; - } - - if !self.triangles.is_empty() { return 1; } - if !self.primitives.is_empty() { + if !self.triangles.is_empty() { return 2; } - if !self.images.is_empty() { + if !self.primitives.is_empty() { return 3; } - if !self.text.is_empty() { + if !self.images.is_empty() { return 4; } - 0 + if !self.text.is_empty() { + return 5; + } + + usize::MAX } fn end(&self) -> usize { if !self.text.is_empty() { - return 4; + return 5; } if !self.images.is_empty() { - return 3; + return 4; } if !self.primitives.is_empty() { - return 2; + return 3; } if !self.triangles.is_empty() { + return 2; + } + + if !self.quads.is_empty() { return 1; }