surpass/painter/layer_workbench/passes/
tile_unchanged.rs
1use std::ops::ControlFlow;
6
7use crate::painter::layer_workbench::passes::PassesSharedState;
8use crate::painter::layer_workbench::{Context, LayerWorkbenchState, OptimizerTileWriteOp};
9use crate::painter::LayerProps;
10
11pub fn tile_unchanged_pass<'w, 'c, P: LayerProps>(
12 workbench: &'w mut LayerWorkbenchState,
13 state: &'w mut PassesSharedState,
14 context: &'c Context<'_, P>,
15) -> ControlFlow<OptimizerTileWriteOp> {
16 let clear_color_is_unchanged = context
17 .cached_clear_color
18 .map(|previous_clear_color| previous_clear_color == context.clear_color)
19 .unwrap_or_default();
20
21 let tile_paint = context.cached_tile.as_ref().and_then(|cached_tile| {
22 let layers = workbench.ids.len() as u32;
23 let previous_layers = cached_tile.update_layer_count(Some(layers));
24
25 let is_unchanged = previous_layers
26 .map(|previous_layers| {
27 state.layers_were_removed = layers < previous_layers;
28
29 previous_layers == layers
30 && workbench.ids.iter().all(|&id| context.props.is_unchanged(id))
31 })
32 .unwrap_or_default();
33
34 (clear_color_is_unchanged && is_unchanged).then_some(OptimizerTileWriteOp::None)
35 });
36
37 match tile_paint {
38 Some(tile_paint) => ControlFlow::Break(tile_paint),
39 None => ControlFlow::Continue(()),
40 }
41}