1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
extern crate image;
use crate::emulator::Emulator;
use crate::error::*;
use std::convert::TryInto;
pub trait FramebufferToImageBuffer {
    fn create_imagebuffer(
        &self,
    ) -> Result<image::ImageBuffer<image::Rgb<u8>, Vec<u8>>, RetroRsError>;
}
impl FramebufferToImageBuffer for Emulator {
    fn create_imagebuffer(
        &self,
    ) -> Result<image::ImageBuffer<image::Rgb<u8>, Vec<u8>>, RetroRsError> {
        let (w, h) = self.framebuffer_size();
        let mut bytes = vec![0; w * h * 3];
        self.copy_framebuffer(&mut bytes)?;
        let w: u32 = w.try_into()?;
        let h: u32 = h.try_into()?;
        image::ImageBuffer::from_vec(w, h, bytes).ok_or(RetroRsError::ImageBufferError)
    }
}