1use std::marker::PhantomData;
2use std::mem;
3use std::ops::Deref;
4use std::slice;
5
6use libraw_sys as sys;
7
8pub struct ProcessedImage<T> {
9 inner: *mut sys::libraw_processed_image_t,
10 _bits: PhantomData<T>,
11}
12
13impl<T> ProcessedImage<T> {
14 pub(crate) unsafe fn from_raw(ptr: *mut sys::libraw_processed_image_t) -> Self {
15 debug_assert!(!ptr.is_null());
16 debug_assert_eq!((*ptr).bits as usize, mem::size_of::<T>() * 8);
17
18 Self {
19 inner: ptr,
20 _bits: PhantomData,
21 }
22 }
23
24 pub fn width(&self) -> u32 {
25 unsafe { (*self.inner).width }.into()
26 }
27
28 pub fn height(&self) -> u32 {
29 unsafe { (*self.inner).height }.into()
30 }
31}
32
33impl Deref for ProcessedImage<u8> {
34 type Target = [u8];
35
36 fn deref(&self) -> &Self::Target {
37 unsafe {
38 slice::from_raw_parts(
39 (*self.inner).data.as_ptr(),
40 (*self.inner).data_size as usize,
41 )
42 }
43 }
44}
45
46impl Deref for ProcessedImage<u16> {
47 type Target = [u16];
48
49 fn deref(&self) -> &Self::Target {
50 unsafe {
51 slice::from_raw_parts(
52 (*self.inner).data.as_ptr() as *const u16,
53 (*self.inner).data_size as usize / 2,
54 )
55 }
56 }
57}
58
59impl<T> Drop for ProcessedImage<T> {
60 fn drop(&mut self) {
61 unsafe { sys::libraw_dcraw_clear_mem(self.inner) }
62 }
63}