use windows::Foundation::Size;
use windows::Graphics::DirectX::{DirectXAlphaMode, DirectXPixelFormat};
use windows::UI::Composition::Visual;
use windows::Win32::System::Com::{COINIT_MULTITHREADED, CoInitializeEx};
use windows::core::{Interface, Result};
use wintf::ecs::{GraphicsCore, WucGraphicsResource};
pub fn setup_graphics() -> Result<GraphicsCore> {
GraphicsCore::new()
}
pub fn init_com_mta() {
unsafe {
let _ = CoInitializeEx(None, COINIT_MULTITHREADED);
}
}
pub struct WucVisualFactory {
resource: WucGraphicsResource,
#[allow(dead_code)]
warmup_surface: windows::UI::Composition::CompositionDrawingSurface,
}
impl WucVisualFactory {
pub fn new(_graphics: &GraphicsCore) -> Result<Self> {
init_com_mta();
let core = GraphicsCore::new()?;
let d2d = core.d2d_device().expect("D2Dデバイスが無効");
let resource = WucGraphicsResource::new(d2d).expect("WucGraphicsResource作成失敗");
let gd = resource.graphics_device().expect("graphics_device");
let warmup_surface = gd.CreateDrawingSurface(
Size {
Width: 1.0,
Height: 1.0,
},
DirectXPixelFormat::B8G8R8A8UIntNormalized,
DirectXAlphaMode::Premultiplied,
)?;
Ok(Self {
resource,
warmup_surface,
})
}
pub fn create_visual(&self) -> Result<Visual> {
let compositor = self.resource.compositor().expect("compositor should exist");
let v: Visual = compositor.CreateSpriteVisual()?.cast()?;
Ok(v)
}
}