use crate::svg::{SvgParser, SvgRasterizer};
use super::avatar_renderer::AvatarRenderer;
use super::gif_writer::to_gif;
const FADE_IN_ALPHA: f64 = 0.45;
const FRAME_DELAY_MS: u32 = 100;
pub struct GifAvatarRenderer;
impl AvatarRenderer for GifAvatarRenderer {
fn render(&self, svg: &str, size: u32) -> Vec<u8> {
let doc = SvgParser::parse(svg);
let shapes = doc.shapes();
if shapes.is_empty() {
return Vec::new();
}
let mut frames = Vec::with_capacity(shapes.len() * 2 + 1);
frames.push(
SvgRasterizer::rasterize_partial(&doc, size, shapes.len(), 1.0, None)
.expect("GIF 首帧渲染失败"),
);
for k in 1..=shapes.len() {
frames.push(
SvgRasterizer::rasterize_partial(&doc, size, k, FADE_IN_ALPHA, None)
.expect("GIF 淡入帧渲染失败"),
);
frames.push(
SvgRasterizer::rasterize_partial(&doc, size, k, 1.0, None)
.expect("GIF 全显帧渲染失败"),
);
}
to_gif(&frames, (FRAME_DELAY_MS / 10).max(1) as u16)
}
}