mod builder;
mod layer;
mod placement;
mod slices;
pub use builder::SceneBuilder;
pub use layer::{ContainerLayer, DisplayListLayer, Effect, EngineLayer, Layer, SurfaceLayer};
pub use placement::{Mutator, SurfacePlacement};
pub use slices::{Part, Slices, slices};
#[derive(Debug, PartialEq)]
pub struct Scene {
pub root: ContainerLayer,
}
#[cfg(test)]
fn idle_surface() -> std::sync::Arc<dyn crate::Surface> {
struct IdleSurface;
impl crate::Surface for IdleSurface {
fn present(&self, _frame: crate::SurfaceFrame, _released: Box<dyn FnOnce() + Send + Sync>) {
}
}
impl crate::SurfaceParent for IdleSurface {
fn open_child(&self, _opaque: bool) -> std::sync::Arc<dyn crate::Surface> {
idle_surface()
}
}
std::sync::Arc::new(IdleSurface)
}
#[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");
}
}