use std::fmt;
use std::sync::Arc;
use crate::composition::CompositionLayer;
use crate::geometry::{Clip, Matrix4, Offset, RRect, Rect};
use crate::media::VideoFrameReader;
use crate::painting::{BlendMode, ImageFilter, Path, Picture};
#[derive(Clone, Debug)]
pub enum Layer {
Container(EngineLayer),
DisplayList(DisplayListLayer),
Embedded(EmbeddedLayer),
Video(VideoLayer),
}
impl PartialEq for Layer {
fn eq(&self, other: &Layer) -> bool {
match (self, other) {
(Layer::Container(a), Layer::Container(b)) => Arc::ptr_eq(a, b) || a == b,
(Layer::DisplayList(a), Layer::DisplayList(b)) => a == b,
(Layer::Embedded(a), Layer::Embedded(b)) => a == b,
(Layer::Video(a), Layer::Video(b)) => a == b,
_ => false,
}
}
}
pub type EngineLayer = Arc<ContainerLayer>;
#[derive(Debug, PartialEq)]
pub struct ContainerLayer {
pub effect: Effect,
pub children: Vec<Layer>,
}
#[derive(Clone, Debug, PartialEq)]
pub enum Effect {
None,
Transform(Matrix4),
ClipRect { rect: Rect, clip_behavior: Clip },
ClipRRect { rrect: RRect, clip_behavior: Clip },
ClipPath {
path: Arc<Path>,
clip_behavior: Clip,
},
Opacity { alpha: u8, offset: Offset },
BackdropFilter {
filter: ImageFilter,
blend_mode: BlendMode,
backdrop_id: Option<u64>,
},
}
#[derive(Clone, Debug, PartialEq)]
pub struct DisplayListLayer {
pub offset: Offset,
pub picture: Arc<Picture>,
}
#[derive(Clone)]
pub struct EmbeddedLayer {
pub layer: Arc<dyn CompositionLayer>,
pub rect: Rect,
}
impl PartialEq for EmbeddedLayer {
fn eq(&self, other: &EmbeddedLayer) -> bool {
Arc::ptr_eq(&self.layer, &other.layer) && self.rect == other.rect
}
}
impl fmt::Debug for EmbeddedLayer {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("EmbeddedLayer")
.field("layer", &Arc::as_ptr(&self.layer).cast::<()>())
.field("rect", &self.rect)
.finish()
}
}
#[derive(Clone)]
pub struct VideoLayer {
pub reader: Arc<dyn VideoFrameReader>,
pub rect: Rect,
}
impl PartialEq for VideoLayer {
fn eq(&self, other: &VideoLayer) -> bool {
Arc::ptr_eq(&self.reader, &other.reader) && self.rect == other.rect
}
}
impl fmt::Debug for VideoLayer {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("VideoLayer")
.field("reader", &Arc::as_ptr(&self.reader).cast::<()>())
.field("rect", &self.rect)
.finish()
}
}