use crate::image::Image;
use crate::palette::Palette;
use sdl2::gfx::primitives::DrawRenderer;
use sdl2::pixels::PixelFormatEnum::RGB888 as ColorFormat;
use sdl2::{event::Event, keyboard::Keycode};
type Sdl2Color = sdl2::pixels::Color;
type MyColor = crate::color::Color;
pub fn color_from_rgb24(rgb24: u32) -> Sdl2Color {
Sdl2Color::from_u32(&ColorFormat.try_into().unwrap(), rgb24)
}
impl From<&MyColor> for Sdl2Color {
fn from(c: &MyColor) -> Self {
color_from_rgb24(c.rgb24())
}
}
pub fn render_sdl(image: Image) -> Result<(), Box<dyn std::error::Error>> {
let sdl_context = sdl2::init()?;
let video_subsystem = sdl_context.video()?;
let window = video_subsystem
.window("viewer", 320, 200)
.build()
.expect("could not initialize video subsystem");
let mut canvas = window
.into_canvas()
.build()
.expect("could not make a canvas");
canvas.set_draw_color(Sdl2Color::BLACK);
canvas.clear();
let sdlpal: Palette<Sdl2Color> = image.palette.iter().map(|m| m.into()).collect();
for (i, index) in image.output.iter().enumerate() {
let x = i % image.width;
let y = i / image.width;
canvas.pixel(
x.try_into().unwrap(),
y.try_into().unwrap(),
sdlpal[*index as usize],
)?;
}
canvas.present();
let mut event_pump = sdl_context.event_pump()?;
'running: loop {
for event in event_pump.poll_iter() {
match event {
Event::Quit { .. }
| Event::KeyDown {
keycode: Some(Keycode::Escape),
..
} => {
break 'running;
}
_ => {}
}
}
}
Ok(())
}