use anyhow::Context;
use crate::{prelude::*, renderer::Rendering};
use log::info;
use std::{fs::File, io::BufWriter, path::Path};
pub trait Draw {
fn draw(&self, s: &mut PixState) -> PixResult<()>;
}
impl PixState {
#[inline]
pub fn clear(&mut self) -> PixResult<()> {
self.renderer.set_draw_color(self.settings.background)?;
self.renderer.clear()
}
pub fn save_canvas<P, R>(&mut self, src: R, path: P) -> PixResult<()>
where
P: AsRef<Path>,
R: Into<Option<Rect<i32>>>,
{
info!("Saving canvas to {}", path.as_ref().display());
if let Some(src) = src.into() {
let bytes = self.renderer.to_bytes()?;
let render_texture = self.create_texture(self.width()?, self.height()?, None)?;
self.update_texture(render_texture, None, bytes, self.width()? as usize * 4)?;
let src_texture = self.create_texture(src.width() as u32, src.height() as u32, None)?;
self.set_texture_target(src_texture)?;
self.texture(render_texture, src, None)?;
self.save_canvas(None, path)?;
self.clear_texture_target();
self.delete_texture(render_texture)?;
self.delete_texture(src_texture)?;
Ok(())
} else {
let path = path.as_ref();
let png_file = BufWriter::new(File::create(path)?);
let mut png = png::Encoder::new(png_file, self.width()?, self.height()?);
png.set_color(PixelFormat::Rgba.into());
png.set_depth(png::BitDepth::Eight);
let mut writer = png
.write_header()
.with_context(|| format!("failed to write png header: {path:?}"))?;
writer
.write_image_data(&self.renderer.to_bytes()?)
.with_context(|| format!("failed to write png data: {path:?}"))
}
}
}