libraw/
image.rs

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}