use crate::{img::Size, FPS};
use gif;
use gif_dispose;
use std::{io::Read, mem};
pub fn load_gif(bytes: impl Read) -> anyhow::Result<(Size<u32>, Vec<Vec<u8>>, Vec<u32>)> {
let mut gif_opts = gif::DecodeOptions::new();
gif_opts.set_color_output(gif::ColorOutput::Indexed);
let mut decoder = gif_opts.read_info(bytes).unwrap();
let mut screen = gif_dispose::Screen::new_decoder(&decoder);
let size = Size {
width: decoder.width() as u32,
height: decoder.height() as u32,
};
let mut frames = vec![];
let mut pts_list = vec![];
let mut buffer = Vec::new();
while let Some(frame) = decoder.read_next_frame().unwrap() {
screen.blit_frame(frame).unwrap();
for rgba in screen.pixels.buf().iter() {
buffer.extend_from_slice(&[rgba.r, rgba.g, rgba.b, rgba.a]);
}
pts_list.push(frame.delay as u32);
frames.push(mem::take(&mut buffer));
}
Ok((size, frames, pts_list))
}