pixelar/
pixel_book.rs

1use std::fs::File;
2
3use image::{
4    codecs::gif::{GifEncoder, Repeat},
5    Frame, ImageResult,
6};
7
8use crate::PixelPaper;
9
10pub struct PixelBook<const H: usize, const W: usize> {
11    repeat: Repeat,
12    papers: Vec<PixelPaper<H, W>>,
13}
14
15impl<const H: usize, const W: usize> PixelBook<H, W> {
16    pub fn new(repeat: Repeat) -> Self {
17        Self {
18            repeat,
19            papers: vec![],
20        }
21    }
22
23    pub fn save(&self, path: &str) -> ImageResult<()> {
24        let mut encoder = GifEncoder::new(File::create(path).unwrap());
25        encoder.set_repeat(self.repeat)?;
26        let frames = self.papers.iter().map(|f| Frame::new(f.get_image_buffer()));
27        encoder.encode_frames(frames)?;
28        Ok(())
29    }
30
31    pub fn add_paper(&mut self, paper: &PixelPaper<H, W>) {
32        self.papers.push(paper.clone());
33    }
34
35    pub fn add_papers<P>(&mut self, papers: P)
36    where
37        P: IntoIterator<Item = PixelPaper<H, W>>,
38    {
39        for paper in papers {
40            self.add_paper(&paper);
41        }
42    }
43}