use std::{marker::PhantomData, mem::MaybeUninit, ptr::addr_of};
use crate::{prelude::*, image::{channel::{RawPixel, AsChannelType}, RawImage, ChannelOrder}, event::WaitList, memobj::{IntoSlice2D}};
#[repr(transparent)]
pub struct FillImage<'dst> {
event: RawEvent,
dst: PhantomData<&'dst mut RawImage>
}
impl<'dst> FillImage<'dst> {
#[inline]
pub unsafe fn new<P: RawPixel> (dst: &'dst mut RawImage, color: &P, slice: impl IntoSlice2D, queue: &CommandQueue, wait: impl Into<WaitList>) -> Result<Self> {
if let Some(slice) = slice.into_slice(dst.width()?, dst.height()?) {
let [origin, region] = slice.raw_parts();
let color = Self::get_color(color);
let event = dst.fill(color.as_ptr().cast(), origin, region, queue, wait)?;
return Ok(Self {
event,
dst: PhantomData
})
}
todo!()
}
fn get_color<P: RawPixel> (color: &P) -> [MaybeUninit<u8>; 16] {
let mut result = MaybeUninit::uninit_array::<16>();
let ptr = result.as_mut_ptr();
#[cfg(feature = "cl2")]
if P::ORDER == ChannelOrder::Depth {
let value = color.channels()[0].convert::<f32>();
unsafe { core::ptr::copy_nonoverlapping(addr_of!(value), ptr as *mut f32, 1) };
return result
}
if !<P::Type as AsChannelType>::TYPE.is_norm() {
let channels = color.channels();
unsafe { core::ptr::copy_nonoverlapping(channels.as_ptr(), ptr as *mut P::Type, channels.len()) }
return result
}
todo!()
}
}
impl<'dst> Event for FillImage<'dst> {
type Output = ();
#[inline(always)]
fn as_raw (&self) -> &RawEvent {
&self.event
}
#[inline(always)]
fn consume (self, err: Option<Error>) -> Result<Self::Output> {
if let Some(err) = err { return Err(err) }
Ok(())
}
}