hashavatar 1.1.0

Stable deterministic procedural avatars in Rust with configurable identity hashing, WebP, optional PNG/JPEG/GIF, and SVG export
Documentation
use super::*;

pub(crate) fn render_shield_svg(spec: AvatarSpec, identity: &AvatarIdentity) -> String {
    let w = spec.width as f32;
    let h = spec.height as f32;
    let cx = w / 2.0;
    let cy = h * 0.55;
    let rx = w * 0.25;
    let ry = h * 0.32;
    let metal = hsl_to_color(210.0 + identity.unit_f32(1) * 45.0, 0.28, 0.58);
    let accent = hsl_to_color(identity.unit_f32(2) * 360.0, 0.50, 0.50);
    let light = hsl_to_color(210.0 + identity.unit_f32(3) * 35.0, 0.18, 0.82);
    let outer = format!(
        "{},{} {},{} {},{} {},{} {},{}",
        cx - rx,
        cy - ry,
        cx + rx,
        cy - ry,
        cx + rx * 0.80,
        cy + ry * 0.25,
        cx,
        cy + ry,
        cx - rx * 0.80,
        cy + ry * 0.25
    );
    let left = format!(
        "{},{} {},{} {},{} {},{}",
        cx - rx,
        cy - ry,
        cx,
        cy - ry,
        cx,
        cy + ry,
        cx - rx * 0.80,
        cy + ry * 0.25
    );
    format!(
        r##"<polygon points="{outer}" fill="{metal}"/><polygon points="{left}" fill="{light}"/><rect x="{vx}" y="{vy}" width="{vw}" height="{vh}" fill="{accent}"/><rect x="{hx}" y="{hy}" width="{hw}" height="{hh}" fill="{accent}"/>"##,
        outer = outer,
        metal = color_hex(metal),
        left = left,
        light = color_hex(light),
        vx = cx - rx * 0.125,
        vy = cy - ry * 0.75,
        vw = rx * 0.25,
        vh = ry * 1.20,
        hx = cx - rx * 0.67,
        hy = cy - ry * 0.20,
        hw = rx * 1.34,
        hh = ry * 0.25,
        accent = color_hex(accent),
    )
}