cranpose 0.1.164

Cranpose runtime and UI facade
Documentation
use super::*;

fn frame(width: u32, height: u32, fill: u8) -> Vec<u8> {
    vec![fill; (width * height * 4) as usize]
}

fn paint(pixels: &mut [u8], width: u32, x: u32, y: u32) {
    let offset = ((y * width + x) * 4) as usize;
    pixels[offset..offset + 4].copy_from_slice(&[1, 2, 3, 255]);
}

#[test]
fn rows_are_padded_to_the_copy_alignment() {
    assert_eq!(padded_row_bytes(64), 256);
    assert_eq!(padded_row_bytes(65), 512);
    assert_eq!(padded_row_bytes(1), 256);
}

#[test]
fn padding_is_stripped_from_every_row() {
    let padded = [1, 2, 0, 0, 3, 4, 0, 0];
    let mut pixels = vec![9; 10];
    copy_unpadded_rows(&padded, 4, 2, &mut pixels);

    assert_eq!(pixels, vec![1, 2, 3, 4]);
}

#[test]
fn identical_frames_have_no_changed_rect() {
    let before = frame(8, 6, 7);
    assert_eq!(changed_rect(&before, &before.clone(), 8, 6), None);
}

#[test]
fn a_frame_of_another_size_changes_entirely() {
    assert_eq!(
        changed_rect(&[], &frame(8, 6, 0), 8, 6),
        Some(PixelRect::full(8, 6))
    );
}

#[test]
fn one_changed_pixel_is_its_own_rect() {
    let before = frame(8, 6, 0);
    let mut after = before.clone();
    paint(&mut after, 8, 5, 3);

    assert_eq!(
        changed_rect(&before, &after, 8, 6),
        Some(PixelRect {
            x: 5,
            y: 3,
            width: 1,
            height: 1,
        })
    );
}

#[test]
fn scattered_changes_are_bounded_by_one_rect() {
    let before = frame(10, 10, 0);
    let mut after = before.clone();
    paint(&mut after, 10, 7, 1);
    paint(&mut after, 10, 2, 4);
    paint(&mut after, 10, 4, 8);

    assert_eq!(
        changed_rect(&before, &after, 10, 10),
        Some(PixelRect {
            x: 2,
            y: 1,
            width: 6,
            height: 8,
        })
    );
}