mod builder;
mod layer;
mod placement;
mod slices;
pub use builder::SceneBuilder;
pub use layer::{
ContainerLayer, DisplayListLayer, Effect, EmbeddedLayer, EngineLayer, Layer, VideoLayer,
};
pub use placement::{Mutator, Placement};
pub use slices::{Part, Slices, slices};
#[derive(Debug, PartialEq)]
pub struct Scene {
pub root: ContainerLayer,
}
#[cfg(test)]
fn idle_layer() -> std::sync::Arc<dyn crate::CompositionLayer> {
struct IdleLayer;
impl crate::CompositionLayer for IdleLayer {
fn present(
&self,
_buffer: crate::HardwareBuffer,
_children: Vec<(
std::sync::Arc<dyn crate::CompositionLayer>,
crate::Placement,
)>,
_released: Box<dyn FnOnce() + Send + Sync>,
) {
}
}
std::sync::Arc::new(IdleLayer)
}
#[cfg(test)]
mod tests {
use std::sync::Arc;
use super::*;
use crate::{Canvas, Offset, Paint, Rect};
fn square() -> Arc<crate::Picture> {
let mut canvas = Canvas::new();
canvas.draw_rect(Rect::from_ltwh(0.0, 0.0, 10.0, 10.0), &Paint::default());
Arc::new(canvas.build())
}
#[cfg(not(target_arch = "wasm32"))]
#[test]
fn a_scene_crosses_threads() {
fn sendable<T: Send + Sync>() {}
sendable::<Scene>();
}
#[test]
fn a_scene_that_retains_a_container_equals_one_that_built_the_same() {
let picture = square();
let mut builder = SceneBuilder::new();
builder.push_offset(1.0, 2.0);
builder.add_picture(Offset::ZERO, &picture, false, false);
let retained = builder.pop();
let first = builder.build();
let mut builder = SceneBuilder::new();
builder.add_retained(&retained);
assert_eq!(builder.build(), first);
let mut builder = SceneBuilder::new();
builder.push_offset(1.0, 2.0);
builder.add_picture(Offset::ZERO, &square(), false, false);
builder.pop();
assert_eq!(
builder.build(),
first,
"an equal picture in a new container"
);
let mut builder = SceneBuilder::new();
builder.push_offset(1.0, 3.0);
builder.add_picture(Offset::ZERO, &picture, false, false);
builder.pop();
assert_ne!(builder.build(), first, "the same picture elsewhere");
}
}