Improve shapes pool performance

This commit is contained in:
Alejandro Alonso
2025-10-27 09:21:15 +01:00
committed by alonso.torres
parent ed4df73e42
commit c66a8f5dc5
12 changed files with 159 additions and 102 deletions

View File

@@ -25,7 +25,7 @@ use crate::shapes::{
all_with_ancestors, Blur, BlurType, Corners, Fill, Shadow, Shape, SolidColor, Stroke,
StructureEntry, Type,
};
use crate::state::ShapesPool;
use crate::state::{ShapesPoolMutRef, ShapesPoolRef};
use crate::tiles::{self, PendingTiles, TileRect};
use crate::uuid::Uuid;
use crate::view::Viewbox;
@@ -277,7 +277,7 @@ pub fn get_cache_size(viewbox: Viewbox, scale: f32) -> skia::ISize {
fn is_modified_child(
shape: &Shape,
shapes: &ShapesPool,
shapes: ShapesPoolRef,
modifiers: &HashMap<Uuid, Matrix>,
) -> bool {
if modifiers.is_empty() {
@@ -476,7 +476,7 @@ impl RenderState {
#[allow(clippy::too_many_arguments)]
pub fn render_shape(
&mut self,
shapes: &ShapesPool,
shapes: ShapesPoolRef,
modifiers: &HashMap<Uuid, Matrix>,
structure: &HashMap<Uuid, Vec<StructureEntry>>,
shape: &Shape,
@@ -839,7 +839,7 @@ impl RenderState {
pub fn render_from_cache(
&mut self,
shapes: &ShapesPool,
shapes: ShapesPoolRef,
modifiers: &HashMap<Uuid, Matrix>,
structure: &HashMap<Uuid, Vec<StructureEntry>>,
) {
@@ -884,7 +884,7 @@ impl RenderState {
pub fn start_render_loop(
&mut self,
tree: &ShapesPool,
tree: ShapesPoolRef,
modifiers: &HashMap<Uuid, Matrix>,
structure: &HashMap<Uuid, Vec<StructureEntry>>,
scale_content: &HashMap<Uuid, f32>,
@@ -944,7 +944,7 @@ impl RenderState {
pub fn process_animation_frame(
&mut self,
tree: &ShapesPool,
tree: ShapesPoolRef,
modifiers: &HashMap<Uuid, Matrix>,
structure: &HashMap<Uuid, Vec<StructureEntry>>,
scale_content: &HashMap<Uuid, f32>,
@@ -1031,7 +1031,7 @@ impl RenderState {
#[inline]
pub fn render_shape_exit(
&mut self,
tree: &ShapesPool,
tree: ShapesPoolRef,
modifiers: &HashMap<Uuid, Matrix>,
structure: &HashMap<Uuid, Vec<StructureEntry>>,
element: &Shape,
@@ -1141,7 +1141,7 @@ impl RenderState {
self.get_rect_bounds(rect)
}
pub fn get_shape_extrect_bounds(&mut self, shape: &Shape, tree: &ShapesPool) -> Rect {
pub fn get_shape_extrect_bounds(&mut self, shape: &Shape, tree: ShapesPoolRef) -> Rect {
let rect = shape.extrect(tree);
self.get_rect_bounds(rect)
}
@@ -1179,7 +1179,7 @@ impl RenderState {
#[allow(clippy::too_many_arguments)]
fn render_drop_black_shadow(
&mut self,
shapes: &ShapesPool,
shapes: ShapesPoolRef,
modifiers: &HashMap<Uuid, Matrix>,
structure: &HashMap<Uuid, Vec<StructureEntry>>,
shape: &Shape,
@@ -1253,7 +1253,7 @@ impl RenderState {
pub fn render_shape_tree_partial_uncached(
&mut self,
tree: &ShapesPool,
tree: ShapesPoolRef,
modifiers: &HashMap<Uuid, Matrix>,
structure: &HashMap<Uuid, Vec<StructureEntry>>,
scale_content: &HashMap<Uuid, f32>,
@@ -1537,7 +1537,7 @@ impl RenderState {
pub fn render_shape_tree_partial(
&mut self,
tree: &ShapesPool,
tree: ShapesPoolRef,
modifiers: &HashMap<Uuid, Matrix>,
structure: &HashMap<Uuid, Vec<StructureEntry>>,
scale_content: &HashMap<Uuid, f32>,
@@ -1655,13 +1655,13 @@ impl RenderState {
Ok(())
}
pub fn get_tiles_for_shape(&mut self, shape: &Shape, tree: &ShapesPool) -> TileRect {
pub fn get_tiles_for_shape(&mut self, shape: &Shape, tree: ShapesPoolRef) -> TileRect {
let extrect = shape.extrect(tree);
let tile_size = tiles::get_tile_size(self.get_scale());
tiles::get_tiles_for_rect(extrect, tile_size)
}
pub fn update_tile_for(&mut self, shape: &Shape, tree: &ShapesPool) {
pub fn update_tile_for(&mut self, shape: &Shape, tree: ShapesPoolRef) {
let TileRect(rsx, rsy, rex, rey) = self.get_tiles_for_shape(shape, tree);
let old_tiles: HashSet<tiles::Tile> = self
.tiles
@@ -1691,7 +1691,7 @@ impl RenderState {
pub fn rebuild_tiles_shallow(
&mut self,
tree: &ShapesPool,
tree: ShapesPoolRef,
modifiers: &HashMap<Uuid, Matrix>,
structure: &HashMap<Uuid, Vec<StructureEntry>>,
) {
@@ -1721,7 +1721,7 @@ impl RenderState {
pub fn rebuild_tiles(
&mut self,
tree: &ShapesPool,
tree: ShapesPoolRef,
modifiers: &HashMap<Uuid, Matrix>,
structure: &HashMap<Uuid, Vec<StructureEntry>>,
) {
@@ -1759,7 +1759,7 @@ impl RenderState {
pub fn invalidate_and_update_tiles(
&mut self,
shape_ids: &IndexSet<Uuid>,
tree: &mut ShapesPool,
tree: ShapesPoolMutRef<'_>,
) {
for shape_id in shape_ids {
if let Some(shape) = tree.get(shape_id) {
@@ -1776,7 +1776,7 @@ impl RenderState {
/// Additionally, it processes all ancestors of modified shapes to ensure their
/// extended rectangles are properly recalculated and their tiles are updated.
/// This is crucial for frames and groups that contain transformed children.
pub fn rebuild_modifier_tiles(&mut self, tree: &mut ShapesPool, ids: Vec<Uuid>) {
pub fn rebuild_modifier_tiles(&mut self, tree: ShapesPoolMutRef<'_>, ids: Vec<Uuid>) {
let ancestors = all_with_ancestors(&ids, tree, false);
self.invalidate_and_update_tiles(&ancestors, tree);
}