mirror of
https://github.com/storytold/photocraft.git
synced 2026-11-12 21:23:02 +00:00
40 lines
1.8 KiB
Rust
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();
|
|
}
|