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 fn render_diamond_avatar_for_identity(
    spec: AvatarSpec,
    identity: &AvatarIdentity,
    background: AvatarBackground,
) -> Result<RgbaImage, AvatarSpecError> {
    spec.validate()?;

    let width = spec.width as i32;
    let height = spec.height as i32;
    let center_x = width / 2;
    let center_y = (height as f32 * 0.56) as i32;
    let rx = (width as f32 * 0.25) as i32;
    let ry = (height as f32 * 0.30) as i32;
    let gem = hsl_to_color(180.0 + identity.unit_f32(1) * 95.0, 0.55, 0.60);
    let highlight = hsl_to_color(190.0 + identity.unit_f32(2) * 70.0, 0.40, 0.82);
    let shade = hsl_to_color(200.0 + identity.unit_f32(3) * 70.0, 0.42, 0.42);
    let bg = hsl_to_color(200.0 + identity.unit_f32(4) * 50.0, 0.18, 0.94);
    let mut image = ImageBuffer::from_pixel(
        spec.width,
        spec.height,
        background_fill(background, bg).into(),
    );
    draw_background_accent(
        &mut image, center_x, center_y, rx, ry, highlight, 0.32, background, identity,
    );

    let outer = [
        Point::new(center_x - rx, center_y - ry / 3),
        Point::new(center_x - rx / 2, center_y - ry),
        Point::new(center_x + rx / 2, center_y - ry),
        Point::new(center_x + rx, center_y - ry / 3),
        Point::new(center_x, center_y + ry),
    ];
    draw_polygon_mut(&mut image, &outer, gem.into());
    draw_polygon_mut(
        &mut image,
        &[
            outer[0],
            outer[1],
            Point::new(center_x, center_y + ry),
            Point::new(center_x - rx / 5, center_y - ry / 3),
        ],
        highlight.into(),
    );
    draw_polygon_mut(
        &mut image,
        &[
            outer[2],
            outer[3],
            Point::new(center_x, center_y + ry),
            Point::new(center_x + rx / 5, center_y - ry / 3),
        ],
        shade.into(),
    );
    for x in [center_x - rx / 2, center_x, center_x + rx / 2] {
        draw_line_segment_mut(
            &mut image,
            (x as f32, (center_y - ry) as f32),
            (center_x as f32, (center_y + ry) as f32),
            Color::rgba(255, 255, 255, 110).into(),
        );
    }

    Ok(image)
}