use anyhow::{Context, Result};
use std::path::Path;
use tiny_skia::Transform;
use super::RasterBuffer;
pub fn rasterize_sizes(svg_path: &Path, sizes: &[u32]) -> Result<Vec<RasterBuffer>> {
let data = std::fs::read(svg_path)
.with_context(|| format!("cannot read SVG '{}'", svg_path.display()))?;
let opt = usvg::Options::default();
let tree = usvg::Tree::from_data(&data, &opt)
.with_context(|| format!("cannot parse SVG '{}'", svg_path.display()))?;
sizes.iter().map(|&s| render_tree(&tree, s)).collect()
}
pub fn rasterize_as_pairs(svg_path: &Path, sizes: &[u32]) -> Result<Vec<(u32, RasterBuffer)>> {
let buffers = rasterize_sizes(svg_path, sizes)?;
Ok(sizes.iter().copied().zip(buffers).collect())
}
fn render_tree(tree: &usvg::Tree, size: u32) -> Result<RasterBuffer> {
let mut pixmap = tiny_skia::Pixmap::new(size, size)
.ok_or_else(|| anyhow::anyhow!("cannot allocate {}×{} pixmap", size, size))?;
let svg_w = tree.size().width();
let svg_h = tree.size().height();
let scale = (size as f32 / svg_w).min(size as f32 / svg_h);
let tx = (size as f32 - svg_w * scale) / 2.0;
let ty = (size as f32 - svg_h * scale) / 2.0;
let transform = Transform::from_translate(tx, ty).pre_scale(scale, scale);
resvg::render(tree, transform, &mut pixmap.as_mut());
Ok(RasterBuffer {
width: size,
height: size,
data: pixmap.take(),
})
}