use super::*;
#[derive(Clone)]
pub struct Compositor(pub(crate) bindings::Compositor);
impl Compositor {
#[cfg(feature = "system")]
pub fn new() -> Result<Self> {
Ok(Self(bindings::Compositor::new()?))
}
#[cfg(feature = "reactor")]
pub fn from_host(compositor: windows_core::IUnknown) -> Result<Self> {
Ok(Self(compositor.cast()?))
}
#[cfg(feature = "system")]
pub fn create_desktop_window_target(
&self,
window: &windows_window::Window,
is_topmost: bool,
) -> Result<DesktopWindowTarget> {
unsafe { self.create_desktop_window_target_for_hwnd(window.hwnd(), is_topmost) }
}
#[cfg(feature = "system")]
pub unsafe fn create_desktop_window_target_for_hwnd(
&self,
hwnd: *mut core::ffi::c_void,
is_topmost: bool,
) -> Result<DesktopWindowTarget> {
let interop: bindings::ICompositorDesktopInterop = self.0.cast()?;
let target = unsafe { interop.CreateDesktopWindowTarget(hwnd, is_topmost)? };
Ok(DesktopWindowTarget::new(target))
}
pub fn create_container_visual(&self) -> ContainerVisual {
ContainerVisual::new(self.0.CreateContainerVisual().unwrap())
}
pub fn create_sprite_visual(&self) -> SpriteVisual {
SpriteVisual::new(self.0.CreateSpriteVisual().unwrap())
}
pub fn create_color_brush(&self, color: Color) -> CompositionColorBrush {
CompositionColorBrush(self.0.CreateColorBrushWithColor(color.0).unwrap())
}
pub fn create_nine_grid_brush(&self) -> CompositionNineGridBrush {
let compositor: bindings::ICompositor2 = self.0.cast().unwrap();
CompositionNineGridBrush(compositor.CreateNineGridBrush().unwrap())
}
pub fn create_shape_visual(&self) -> ShapeVisual {
let compositor: bindings::ICompositor5 = self.0.cast().unwrap();
ShapeVisual::new(compositor.CreateShapeVisual().unwrap())
}
pub fn create_container_shape(&self) -> CompositionContainerShape {
let compositor: bindings::ICompositor5 = self.0.cast().unwrap();
CompositionContainerShape(compositor.CreateContainerShape().unwrap())
}
pub fn create_ellipse_geometry(&self) -> CompositionEllipseGeometry {
let compositor: bindings::ICompositor5 = self.0.cast().unwrap();
CompositionEllipseGeometry(compositor.CreateEllipseGeometry().unwrap())
}
pub fn create_sprite_shape(
&self,
geometry: &CompositionEllipseGeometry,
) -> CompositionSpriteShape {
let compositor: bindings::ICompositor5 = self.0.cast().unwrap();
CompositionSpriteShape(
compositor
.CreateSpriteShapeWithGeometry(&geometry.as_geometry().0)
.unwrap(),
)
}
pub fn create_scoped_batch(&self, kind: BatchKind) -> CompositionScopedBatch {
CompositionScopedBatch(self.0.CreateScopedBatch(kind.into()).unwrap())
}
pub fn create_vector3_key_frame_animation(&self) -> Vector3KeyFrameAnimation {
Vector3KeyFrameAnimation(self.0.CreateVector3KeyFrameAnimation().unwrap())
}
pub fn create_animation_group(&self) -> CompositionAnimationGroup {
let compositor: bindings::ICompositor2 = self.0.cast().unwrap();
CompositionAnimationGroup(compositor.CreateAnimationGroup().unwrap())
}
pub fn create_scalar_key_frame_animation(&self) -> ScalarKeyFrameAnimation {
ScalarKeyFrameAnimation(self.0.CreateScalarKeyFrameAnimation().unwrap())
}
pub fn create_linear_easing_function(&self) -> CompositionEasingFunction {
CompositionEasingFunction(self.0.CreateLinearEasingFunction().unwrap().cast().unwrap())
}
pub fn create_cubic_bezier_easing_function(
&self,
control1: Vector2,
control2: Vector2,
) -> CompositionEasingFunction {
CompositionEasingFunction(
self.0
.CreateCubicBezierEasingFunction(control1, control2)
.unwrap()
.cast()
.unwrap(),
)
}
pub fn create_implicit_animation_collection(&self) -> ImplicitAnimationCollection {
let compositor: bindings::ICompositor2 = self.0.cast().unwrap();
ImplicitAnimationCollection(compositor.CreateImplicitAnimationCollection().unwrap())
}
#[cfg(feature = "system")]
pub fn create_graphics_device(
&self,
rendering_device: &impl Interface,
) -> Result<CompositionGraphicsDevice> {
let interop: bindings::ICompositorInterop = self.0.cast()?;
let device: windows_core::IUnknown = rendering_device.cast()?;
let graphics = unsafe { interop.CreateGraphicsDevice(&device)? };
Ok(CompositionGraphicsDevice(graphics.cast()?))
}
#[cfg(feature = "system")]
pub fn create_surface_brush(
&self,
surface: &CompositionDrawingSurface,
) -> CompositionSurfaceBrush {
CompositionSurfaceBrush(
self.0
.CreateSurfaceBrushWithSurface(&surface.as_surface())
.unwrap(),
)
}
}