icu_lib 0.11.0

Image Converter Ultra Library
Documentation
pub mod export;
pub mod import;

use crate::endecoder::{EnDecoder, ImageInfo};
use crate::midata::{MiData, SceneData};
use crate::EncoderParams;
use serde_json::json;

pub struct Svg;

impl EnDecoder for Svg {
    fn can_decode(&self, data: &[u8]) -> bool {
        if data.len() < 4 {
            return false;
        }
        let head = data.iter().take(64).copied().collect::<Vec<_>>();
        let s = String::from_utf8_lossy(&head);
        s.contains("<svg") || s.contains("<?xml")
    }

    fn encode(&self, data: &MiData, _params: EncoderParams) -> Vec<u8> {
        match data {
            MiData::PATH(sd) => export::scene_to_svg(&sd.scene, 0, 0).into_bytes(),
            _ => Vec::new(),
        }
    }

    fn decode(&self, data: Vec<u8>) -> MiData {
        let scene = import::svg_to_scene(&data);
        MiData::PATH(SceneData { scene })
    }

    fn info(&self, data: &[u8]) -> ImageInfo {
        let scene = import::svg_to_scene(data);
        ImageInfo {
            width: 0,
            height: 0,
            data_size: data.len() as u32,
            format: "svg".to_string(),
            other_info: json!({
                "layout": "svg",
                "op_count": scene.ops.len(),
            }),
        }
    }
}