clay_core/buffer/
image_buffer.rs

1use ocl;
2use image;
3use crate::Context;
4
5/// Rendered and postprocessed image is stored here.
6pub struct Image {
7    bytes: ocl::Buffer<u8>,
8    dims: (usize, usize),
9}
10
11impl Image {
12    pub fn new(context: &Context, dims: (usize, usize)) -> crate::Result<Self> {
13        let len = 3*dims.0*dims.1;
14
15        let bytes = ocl::Buffer::<u8>::builder()
16        .queue(context.queue().clone())
17        .flags(ocl::flags::MEM_WRITE_ONLY)
18        .len(len)
19        .fill_val(0 as u8)
20        .build()?;
21
22        Ok(Image {
23            bytes, dims,
24        })
25    }
26    
27    pub fn read(&self) -> crate::Result<Vec<u8>> {
28        let mut vec = vec![0 as u8; self.bytes.len()];
29
30        self.bytes.cmd()
31        .offset(0)
32        .read(&mut vec)
33        .enq()?;
34
35        Ok(vec)
36    }
37
38    pub fn bytes(&self) -> &ocl::Buffer<u8> {
39        &self.bytes
40    }
41    pub fn bytes_mut(&mut self) -> &mut ocl::Buffer<u8> {
42        &mut self.bytes
43    }
44
45    pub fn dims(&self) -> (usize, usize) {
46        self.dims
47    }
48    pub fn len(&self) -> usize {
49        3*self.dims.0*self.dims.1
50    }
51
52    pub fn save_to_file(&self, filename: &str) -> crate::Result<()> {
53        image::save_buffer(
54            &filename,
55            &self.read()?,
56            self.dims.0 as u32, self.dims.1 as u32,
57            image::RGB(8),
58        )?;
59        Ok(())
60    }
61}