use super::*;
#[derive(Clone)]
pub struct CompositionGraphicsDevice(pub(crate) bindings::CompositionGraphicsDevice);
impl CompositionGraphicsDevice {
pub fn create_drawing_surface(
&self,
width: f32,
height: f32,
) -> Result<CompositionDrawingSurface> {
let surface = self.0.CreateDrawingSurface(
bindings::Size { width, height },
bindings::DirectXPixelFormat::B8G8R8A8UIntNormalized,
bindings::DirectXAlphaMode::Premultiplied,
)?;
CompositionDrawingSurface::new(surface)
}
}
#[derive(Clone)]
pub struct CompositionDrawingSurface {
surface: bindings::CompositionDrawingSurface,
interop: bindings::ICompositionDrawingSurfaceInterop,
}
impl CompositionDrawingSurface {
fn new(surface: bindings::CompositionDrawingSurface) -> Result<Self> {
let interop = surface.cast()?;
Ok(Self { surface, interop })
}
pub fn begin_draw<T: Interface>(&self) -> Result<(T, (i32, i32))> {
let mut offset = bindings::POINT::default();
let object = unsafe { self.interop.BeginDraw::<T>(None, &mut offset)? };
Ok((object, (offset.x, offset.y)))
}
pub fn end_draw(&self) -> Result<()> {
unsafe { self.interop.EndDraw().ok() }
}
pub fn resize(&self, width: i32, height: i32) -> Result<()> {
unsafe {
self.interop
.Resize(bindings::SIZE {
cx: width,
cy: height,
})
.ok()
}
}
pub(crate) fn as_surface(&self) -> bindings::ICompositionSurface {
self.surface.cast().unwrap()
}
}
#[derive(Clone)]
pub struct CompositionSurfaceBrush(pub(crate) bindings::CompositionSurfaceBrush);
impl Sealed for CompositionSurfaceBrush {}
impl Brush for CompositionSurfaceBrush {
fn as_brush(&self) -> CompositionBrush {
CompositionBrush(self.0.cast().unwrap())
}
}