Files
photocraft/crates/compose/tests/shape_split_cache.rs

40 lines
1.8 KiB
Rust

use std::sync::Arc;
use photocraft_color::{Color, SampleType};
use photocraft_compose::shape_split;
use photocraft_doc::Fill;
use photocraft_doc::vector::{Path, ShapeLayer, ShapeStroke, Subpath};
use photocraft_geom::Rect;
/// A small working set beyond 32 shapes should reuse its tiles at every sample depth.
#[test]
fn small_shape_working_sets_keep_their_cached_tiles() {
let canvas = Rect::new(0, 0, 400, 240);
let shapes: Vec<_> = (0..40)
.map(|i| {
let (x, y) = (12.0 + f64::from(i % 8) * 40.0, 12.0 + f64::from(i / 8) * 40.0);
ShapeLayer {
path: Path::new(vec![Subpath::polygon(&[(x, y), (x + 20.0, y), (x + 20.0, y + 20.0), (x, y + 20.0)])]),
fill: Some(Fill::Solid(Color::rgb(0.2, 0.4, 0.6))),
stroke: Some(ShapeStroke { width: 2.0, ..ShapeStroke::default() }),
..ShapeLayer::default()
}
})
.collect();
for depth in SampleType::ALL {
shape_split::purge_cache();
let first: Vec<_> = shapes.iter().map(|shape| shape_split::split(shape, canvas, depth).expect("stroked shape")).collect();
for (i, (shape, before)) in shapes.iter().zip(&first).enumerate() {
let after = shape_split::split(shape, canvas, depth).expect("cached shape");
for (before, after) in [(&before.0, &after.0), (&before.1, &after.1)] {
assert!(before.tile_count() > 0);
assert_eq!(before.tile_count(), after.tile_count());
for (coord, tile) in before.tiles() {
assert!(Arc::ptr_eq(tile, after.tile(*coord).expect("cached tile")), "shape {i}, {depth:?}: rerasterized cached pixels");
}
}
}
}
shape_split::purge_cache();
}