Fix naive merging logic in layer::Stack

This commit is contained in:
Héctor Ramón Jiménez 2025-08-17 00:04:45 +02:00
parent d3e9547079
commit c639c185d3
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
3 changed files with 46 additions and 7 deletions

View file

@ -24,17 +24,20 @@ pub trait Layer: Default {
/// Clears all the layers contents and resets its bounds. /// Clears all the layers contents and resets its bounds.
fn reset(&mut self); fn reset(&mut self);
/// Returns the level of the [`Layer`]. /// Returns the start level of the [`Layer`].
/// ///
/// The level is the lowest "sublayer" index inside of a [`Layer`]. /// A level is a "sublayer" index inside of a [`Layer`].
/// ///
/// A [`Layer`] may draw multiple primitive types in a certain order. /// A [`Layer`] may draw multiple primitive types in a certain order.
/// The level represents the lowest index of the primitive types it /// The level represents the lowest index of the primitive types it
/// contains. /// contains.
/// ///
/// Two layers A and B can therefore be merged if they have the same bounds, /// Two layers A and B can therefore be merged if they have the same bounds,
/// and the level of A is lower or equal than the level of B. /// and the end level of A is lower or equal than the start level of B.
fn level(&self) -> usize; fn start(&self) -> usize;
/// Returns the end level of the [`Layer`].
fn end(&self) -> usize;
/// Merges a [`Layer`] with the current one. /// Merges a [`Layer`] with the current one.
fn merge(&mut self, _layer: &mut Self); fn merge(&mut self, _layer: &mut Self);
@ -106,7 +109,7 @@ impl<T: Layer> Stack<T> {
let previous_layer = &mut head[previous]; let previous_layer = &mut head[previous];
let current_layer = &mut tail[self.current - previous - 1]; let current_layer = &mut tail[self.current - previous - 1];
if previous_layer.level() <= current_layer.level() if previous_layer.end() <= current_layer.start()
&& previous_layer.bounds() == current_layer.bounds() && previous_layer.bounds() == current_layer.bounds()
{ {
previous_layer.merge(current_layer); previous_layer.merge(current_layer);

View file

@ -303,7 +303,23 @@ impl graphics::Layer for Layer {
self.images.clear(); self.images.clear();
} }
fn level(&self) -> usize { fn start(&self) -> usize {
if !self.quads.is_empty() {
return 0;
}
if !self.primitives.is_empty() {
return 1;
}
if !self.images.is_empty() {
return 2;
}
return 3;
}
fn end(&self) -> usize {
if !self.text.is_empty() { if !self.text.is_empty() {
return 3; return 3;
} }

View file

@ -293,7 +293,27 @@ impl graphics::Layer for Layer {
self.pending_text.clear(); self.pending_text.clear();
} }
fn level(&self) -> usize { fn start(&self) -> usize {
if !self.quads.is_empty() {
return 0;
}
if !self.triangles.is_empty() {
return 1;
}
if !self.primitives.is_empty() {
return 2;
}
if !self.images.is_empty() {
return 3;
}
4
}
fn end(&self) -> usize {
if !self.text.is_empty() { if !self.text.is_empty() {
return 4; return 4;
} }