cranpose-ui-graphics 0.1.167

Pure math/data for drawing & units in Cranpose
Documentation
use super::*;

#[test]
fn an_srgb_colour_is_eight_bits_and_a_half_rounds_up() {
    let mixed = Color(9.9 / 255.0, 22.5 / 255.0, 34.2 / 255.0, 1.0);
    let snapped = mixed.srgb_8bit();
    assert_eq!(
        [
            (snapped.0 * 255.0).round() as u8,
            (snapped.1 * 255.0).round() as u8,
            (snapped.2 * 255.0).round() as u8,
        ],
        [10, 23, 34]
    );
    for channel in [snapped.0, snapped.1, snapped.2, snapped.3] {
        let scaled = channel * 255.0;
        assert!(
            (scaled - scaled.round()).abs() < 1e-3,
            "{scaled} is not a whole channel value"
        );
    }
}

#[test]
fn snapping_matches_the_platforms_own_expression_over_the_whole_range() {
    for step in 0..=100_000u32 {
        let channel = step as f32 / 100_000.0;
        let platform = (channel * 255.0 + 0.5) as u32;
        let ours = (srgb_channel_8bit(channel) * 255.0).round() as u32;
        assert_eq!(platform, ours, "channel {channel}");
    }
}

#[test]
fn snapping_is_idempotent_and_leaves_exact_bytes_alone() {
    for byte in 0..=255u8 {
        let colour = Color::from_rgba_u8(byte, byte, byte, byte);
        assert_eq!(colour.srgb_8bit(), colour);
    }
    let odd = Color(0.123_456, 0.789_012, 0.5, 0.25);
    assert_eq!(odd.srgb_8bit().srgb_8bit(), odd.srgb_8bit());
}

#[test]
fn snapping_clamps_out_of_range_channels() {
    let wild = Color(-2.0, 1.5, 0.0, 1.0).srgb_8bit();
    assert_eq!(wild, Color(0.0, 1.0, 0.0, 1.0));
}