use ferroui_microcom::{ComPtr, Guid, HResult, IUnknown, Interface};
use std::ffi::c_void;
#[cfg_attr(not(target_arch = "x86"), link(name = "dcomp", kind = "raw-dylib"))]
#[cfg_attr(target_arch = "x86", link(name = "dcomp", kind = "raw-dylib", import_name_type = "undecorated"))]
extern "system" {
fn DCompositionCreateDevice2(
rendering_device: *mut c_void,
iid: *const Guid,
dcomposition_device: *mut *mut c_void,
) -> i32;
}
pub struct NativeMethods;
impl NativeMethods {
pub fn d_composition_create_device2<T: Interface>(
rendering_device: Option<&ComPtr<IUnknown>>,
) -> Result<ComPtr<T>, HResult> {
let iid = T::IID;
let rendering_device = rendering_device.map_or(std::ptr::null_mut(), |device| device.as_raw().cast());
let mut device = std::ptr::null_mut();
let result = unsafe { DCompositionCreateDevice2(rendering_device, &iid, &mut device) };
if result < 0 {
return Err(HResult(result as u32));
}
unsafe { ComPtr::<T>::from_raw(device.cast()) }.ok_or(HResult::POINTER)
}
}