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}