use super::{Encoder, Result};
use bevy::prelude::*;
use image::{codecs::gif, Frame};
use std::io::Write;
pub use gif::Repeat;
pub struct GifEncoder<W: Write>(gif::GifEncoder<W>);
impl<W: Write> GifEncoder<W> {
pub fn new(writer: W) -> Self {
Self(gif::GifEncoder::new(writer))
}
pub fn new_with_speed(writer: W, speed: i32) -> Self {
Self(gif::GifEncoder::new_with_speed(writer, speed))
}
pub fn with_repeat(mut self, repeat: Repeat) -> Self {
self.0.set_repeat(repeat).unwrap();
self
}
}
impl<W: Write> Encoder for GifEncoder<W> {
fn encode(&mut self, image: &Image) -> Result<()> {
let image = image.clone().try_into_dynamic()?;
let buffer = image.to_rgba8();
self.0.encode_frame(Frame::new(buffer))?;
Ok(())
}
}