mod accels;
pub mod application;
pub mod clipboard;
pub mod dcomp;
pub mod dialog;
pub mod error;
pub mod keycodes;
pub mod menu;
pub mod paint;
mod timers;
pub mod util;
pub mod window;
use piet_common::d2d::{D2DFactory, DeviceContext};
use std::fmt::{Debug, Display, Formatter};
use winapi::shared::windef::HWND;
use winapi::shared::winerror::{HRESULT, SUCCEEDED};
use winapi::um::d2d1::{
ID2D1HwndRenderTarget, ID2D1RenderTarget, D2D1_HWND_RENDER_TARGET_PROPERTIES,
D2D1_RENDER_TARGET_PROPERTIES, D2D1_SIZE_U,
};
use winapi::um::dcommon::D2D1_PIXEL_FORMAT;
use wio::com::ComPtr;
#[derive(Clone)]
pub struct HwndRenderTarget {
ptr: ComPtr<ID2D1HwndRenderTarget>,
}
impl HwndRenderTarget {
pub fn create(
factory: &D2DFactory,
hwnd: HWND,
width: u32,
height: u32,
) -> Result<Self, Error> {
let rt_props = DEFAULT_PROPS;
let mut hwnd_props = DEFAULT_HWND_PROPS;
hwnd_props.hwnd = hwnd;
hwnd_props.pixelSize.width = width;
hwnd_props.pixelSize.height = height;
unsafe {
let mut ptr = std::ptr::null_mut();
let hr = (*factory.get_raw()).CreateHwndRenderTarget(&rt_props, &hwnd_props, &mut ptr);
if SUCCEEDED(hr) {
Ok(HwndRenderTarget::from_raw(ptr))
} else {
Err(hr.into())
}
}
}
pub unsafe fn from_ptr(ptr: ComPtr<ID2D1HwndRenderTarget>) -> Self {
Self { ptr }
}
pub unsafe fn from_raw(raw: *mut ID2D1HwndRenderTarget) -> Self {
Self::from_ptr(ComPtr::from_raw(raw))
}
pub fn get_comptr(&self) -> &ComPtr<ID2D1HwndRenderTarget> {
&self.ptr
}
}
const DEFAULT_PROPS: D2D1_RENDER_TARGET_PROPERTIES = D2D1_RENDER_TARGET_PROPERTIES {
_type: 0u32, pixelFormat: D2D1_PIXEL_FORMAT {
format: 87u32, alphaMode: 0u32, },
dpiX: 0.0,
dpiY: 0.0,
usage: 0,
minLevel: 0,
};
const DEFAULT_HWND_PROPS: D2D1_HWND_RENDER_TARGET_PROPERTIES = D2D1_HWND_RENDER_TARGET_PROPERTIES {
hwnd: std::ptr::null_mut(),
pixelSize: D2D1_SIZE_U {
width: 0,
height: 0,
},
presentOptions: 0,
};
#[derive(Clone)]
pub struct DxgiSurfaceRenderTarget {
ptr: ComPtr<ID2D1RenderTarget>,
}
impl DxgiSurfaceRenderTarget {
pub unsafe fn from_raw(raw: *mut ID2D1RenderTarget) -> Self {
DxgiSurfaceRenderTarget {
ptr: ComPtr::from_raw(raw),
}
}
pub unsafe fn as_device_context(&self) -> Option<DeviceContext> {
self.ptr
.cast()
.ok()
.map(|com_ptr| DeviceContext::new(com_ptr))
}
}
pub enum Error {
WinapiError(HRESULT),
}
impl From<HRESULT> for Error {
fn from(hr: HRESULT) -> Error {
Error::WinapiError(hr)
}
}
impl Debug for Error {
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
match self {
Error::WinapiError(hr) => write!(f, "hresult {:x}", hr),
}
}
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
match self {
Error::WinapiError(hr) => write!(f, "hresult {:x}", hr),
}
}
}
impl std::error::Error for Error {
fn description(&self) -> &str {
"winapi error"
}
}