use super::inv::*;
use crate::filters::{FilterChain, MorphFilter};
use crate::protocol::animatable::Animatable;
use crate::protocol::keywords::LAYER_CACHE_KEYWORDS;
use crate::protocol::transform::{Transform, Transform3d};
use crate::style::{Codec, Invalidate, Invalidation, NodeCtx, StyleProperty};
use crate::transition::Transition;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum LayerCache {
#[default]
Auto,
Always,
Never,
}
pub static FILTER: StyleProperty<FilterChain> = StyleProperty {
invalidate: Invalidate::Fixed(COMPOSITE_PROMOTION),
..StyleProperty::with_codec("filter", Codec::serde_as("FilterChainValue"))
};
pub static BACKDROP_FILTER: StyleProperty<FilterChain> = StyleProperty {
invalidate: Invalidate::Fixed(COMPOSITE_PROMOTION),
..StyleProperty::with_codec("backdropFilter", Codec::serde_as("FilterChainValue"))
};
pub static MORPH_FILTER: StyleProperty<MorphFilter> = StyleProperty {
invalidate: Invalidate::Fixed(COMPOSITE_PROMOTION),
..StyleProperty::with_codec(
"morphFilter",
Codec::custom(erased!(de_morph_filter => MorphFilter), "MorphFilterValue"),
)
};
pub static TRANSFORM: StyleProperty<Transform> = StyleProperty {
invalidate: Invalidate::Computed(transform_invalidation),
..StyleProperty::with_codec("transform", Codec::serde_as("BevyTransform"))
};
pub static TRANSFORM3D: StyleProperty<Transform3d> = StyleProperty {
invalidate: Invalidate::Fixed(COMPOSITE_PROMOTION),
..StyleProperty::with_codec("transform3d", Codec::serde_as("BevyTransform3d"))
};
pub static OPACITY: StyleProperty<Animatable<f32>> = StyleProperty {
invalidate: Invalidate::Computed(opacity_invalidation),
..StyleProperty::with_codec("opacity", Codec::serde_as("Animatable<number>"))
};
pub static GROUP_ALPHA: StyleProperty<bool> = StyleProperty {
invalidate: Invalidate::Fixed(PROMOTION),
..StyleProperty::new("groupAlpha")
};
pub static CACHE: StyleProperty<LayerCache> = StyleProperty {
invalidate: Invalidate::Fixed(PROMOTION),
..StyleProperty::with_codec("cache", Codec::keyword(&LAYER_CACHE_KEYWORDS))
};
pub static TRANSITION: StyleProperty<Transition> = StyleProperty {
invalidate: Invalidate::Fixed(Invalidation::TRANSITION),
..StyleProperty::with_codec("transition", Codec::serde_as("BevyTransition"))
};
fn opacity_invalidation(
_old: Option<&Animatable<f32>>,
_new: Option<&Animatable<f32>>,
node: &NodeCtx<'_>,
) -> Invalidation {
if node.promoted {
COMPOSITE_PROMOTION
} else {
PAINT.union(PROMOTION)
}
}
fn transform_invalidation(
old: Option<&Transform>,
new: Option<&Transform>,
node: &NodeCtx<'_>,
) -> Invalidation {
match (old, new) {
(Some(o), Some(n))
if node.promoted
&& o.scale == n.scale
&& o.scale_x == n.scale_x
&& o.scale_y == n.scale_y
&& o.rotate == n.rotate =>
{
Invalidation::COMPOSITE
}
_ => PAINT,
}
}
fn de_morph_filter<'de, D: serde::Deserializer<'de>>(
d: D,
) -> Result<Option<MorphFilter>, D::Error> {
crate::filters::de_morph_filter(d).map(|m| m.map(|b| *b))
}