use std::mem;
use std::path::Path;
use image_ext;
use gl;
use errors::ProcessingErr;
pub fn load_image(filename: &str) -> Result<image_ext::RgbaImage, ProcessingErr> {
image_ext::open(filename).and_then(|img| Ok(img.to_rgba())).map_err(|e| ProcessingErr::ImageNotFound(e))
}
use Screen;
impl<'a> Screen<'a> {
pub fn image_mode(&mut self, mode: &str) {
self.image_mode = mode.to_owned();
}
pub fn no_tint(&mut self) {
self.tint_stuff = false
}
pub fn save(&self, filename: &str) -> Result<(), ProcessingErr> {
let data = vec![0f32; self.fb_size[0] as usize * self.fb_size[1] as usize * 4 * 4];
unsafe {
gl::ReadPixels(
0,
0,
self.fb_size[0] as gl::types::GLsizei,
self.fb_size[1] as gl::types::GLsizei,
gl::RGBA,
gl::FLOAT,
mem::transmute(&data[0]),
);
}
let mut img = image_ext::ImageBuffer::new(self.fb_size[0], self.fb_size[1]);
let mut i = 0;
for pixel in img.pixels_mut() {
*pixel = image_ext::Rgba(
[
(data[i] * 255.0) as u8,
(data[i + 1] * 255.0) as u8,
(data[i + 2] * 255.0) as u8,
255u8,
],
);
i += 4;
}
let fimg = image_ext::imageops::flip_vertical(&img);
fimg.save(&Path::new(filename)).map_err(|e| ProcessingErr::ImageNotSaved(e))
}
}