use crate::*;
use crate::d3d9::*;
use winapi::Interface;
use winapi::shared::d3d9::IDirect3DVolume9;
use winapi::shared::d3d9types::*;
use winapi::shared::guiddef::GUID;
use winapi::um::unknwnbase::IUnknown;
use std::convert::TryInto;
use std::ptr::*;
#[derive(Clone)] #[repr(transparent)]
pub struct Volume(pub(crate) mcom::Rc<IDirect3DVolume9>);
unsafe impl AsSafe<IUnknown > for Volume { fn as_safe(&self) -> &IUnknown { &*self.0 } }
unsafe impl AsSafe<IDirect3DVolume9 > for Volume { fn as_safe(&self) -> &IDirect3DVolume9 { &*self.0 } }
pub trait IDirect3DVolume9Ext : AsSafe<IDirect3DVolume9> {
fn free_private_data(&self, guid: &GUID) -> Result<(), MethodError> {
let hr = unsafe { self.as_winapi().FreePrivateData(guid) };
MethodError::check("IDirect3DVolume9::FreePrivateData", hr)
}
fn get_container<C: Raw>(&self) -> Result<C, MethodError> where C::Raw : Interface {
let mut container = null_mut();
let hr = unsafe { self.as_winapi().GetContainer(&C::Raw::uuidof(), &mut container) };
MethodError::check("IDirect3DVolume9::GetContainer", hr)?;
Ok(unsafe { C::from_raw(container.cast()) })
}
fn get_desc(&self) -> Result<VolumeDesc, MethodError> {
let mut desc = VolumeDesc::default();
let hr = unsafe { self.as_winapi().GetDesc(&mut *desc) };
MethodError::check("IDirect3DVolume9::GetDesc", hr)?;
Ok(desc)
}
fn get_device(&self) -> Result<Device, MethodError> {
let mut device = null_mut();
let hr = unsafe { self.as_winapi().GetDevice(&mut device) };
MethodError::check("IDirect3DVolume9::GetDevice", hr)?;
Ok(unsafe { Device::from_raw(device) })
}
fn get_private_data_inplace<'s>(&self, guid: &GUID, data: &'s mut [u8]) -> Result<&'s [u8], MethodError> {
let mut n : u32 = data.len().try_into().map_err(|_| MethodError("Resource::get_private_data_inplace", THINERR::SLICE_OVERFLOW))?;
let hr = unsafe { self.as_winapi().GetPrivateData(guid, data.as_mut_ptr().cast(), &mut n) };
MethodError::check("IDirect3DVolume9::GetPrivateData", hr)?;
Ok(&data[..(n as usize)])
}
fn set_private_data(&self, guid: &GUID, data: &[u8]) -> Result<(), MethodError> {
let n : u32 = data.len().try_into().map_err(|_| MethodError("Resource::set_private_data", THINERR::SLICE_OVERFLOW))?;
let hr = unsafe { self.as_winapi().SetPrivateData(guid, data.as_ptr().cast(), n, 0) };
MethodError::check("IDirect3DVolume9::SetPrivateData", hr)
}
unsafe fn lock_box_unchecked(&self, box_: impl IntoBoxOrFull, flags: impl Into<Lock>) -> Result<D3DLOCKED_BOX, MethodError> {
let mut locked = std::mem::zeroed::<D3DLOCKED_BOX>();
let box_ = box_.into_box();
let box_ = box_.as_ref().map_or(null(), |b| &**b);
let hr = self.as_winapi().LockBox(&mut locked, box_, flags.into().into());
MethodError::check("IDirect3DVolume9::LockBox", hr)?;
Ok(locked)
}
fn unlock_box(&self) -> Result<(), MethodError> {
let hr = unsafe { self.as_winapi().UnlockBox() };
MethodError::check("IDirect3DVolume9::UnlockBox", hr)
}
}
impl<T: AsSafe<IDirect3DVolume9>> IDirect3DVolume9Ext for T {}