use super::ServerCompositionVisual;
use crate::rendering::composition::server::{
CompositionClipShape, IServerObject, IServerRenderResource, IServerRenderResourceObserver,
};
use std::rc::Rc;
impl ServerCompositionVisual {
pub fn composition_clip(&self) -> Option<Rc<dyn IServerObject>> {
self.props.base().composition_clip()
}
pub fn composition_clip_shape(&self) -> Option<CompositionClipShape> {
let clip = self.composition_clip()?;
CompositionClipShape::of(&*clip, self.size())
}
fn composition_clip_resource(&self) -> Option<Rc<dyn IServerRenderResource>> {
self.composition_clip().and_then(|clip| clip.as_render_resource())
}
pub(super) fn observe_composition_clip(&self, observe: bool) {
let (Some(resource), Some(this)) = (self.composition_clip_resource(), self.rc()) else { return };
let observer: Rc<dyn IServerRenderResourceObserver> = this;
if observe {
resource.add_observer(&observer);
} else {
resource.remove_observer(&observer);
}
}
pub(super) fn is_composition_clip(&self, sender: &dyn IServerRenderResource) -> bool {
self.composition_clip_resource()
.is_some_and(|resource| std::ptr::addr_eq(Rc::as_ptr(&resource), sender as *const dyn IServerRenderResource))
}
pub(super) fn composition_clip_changed(&self) {
self.trigger_composition_fields_dirty();
self.trigger_clip_size_dirty();
self.own_bounds_dirty.set(true);
}
}