cranpose-render-pixels 0.1.14

Pixels renderer backend for Cranpose
Documentation
use cranpose_render_common::render_contract::{RenderedFrame, ALL_SHARED_RENDER_CASES};
use cranpose_render_pixels::{draw_scene, Scene};

#[test]
fn pixels_warning_state_is_scene_owned() {
    let draw_source = std::fs::read_to_string("src/draw.rs").expect("read pixels draw source");
    let pipeline_source =
        std::fs::read_to_string("src/pipeline.rs").expect("read pixels pipeline source");

    for source in [draw_source.as_str(), pipeline_source.as_str()] {
        assert!(
            !source.contains("static REPORTED_UNSUPPORTED_PIXELS_"),
            "pixels renderer warning state must be owned by the renderer scene, not process globals"
        );
        assert!(
            !source.contains("AtomicBool"),
            "pixels renderer warning suppression must not use process-global atomics"
        );
    }
}

#[test]
fn pixels_text_font_state_is_renderer_owned() {
    let draw_source = std::fs::read_to_string("src/draw.rs").expect("read pixels draw source");

    assert!(
        !draw_source.contains("static FONT")
            && !draw_source.contains("Lazy<Option<SoftwareTextFont>>"),
        "pixels renderer text font state must not be a process-global cache"
    );
    assert!(
        draw_source.contains("pub struct PixelsTextResources")
            && draw_source.contains("draw_scene_with_text_resources"),
        "pixels text resources should be explicit renderer-owned draw inputs"
    );
}

#[test]
fn pixels_renderer_matches_shared_render_contracts() {
    let app_context = cranpose_ui::AppContext::new();
    for case in ALL_SHARED_RENDER_CASES {
        let mut frames = Vec::new();
        for fixture in case.fixtures() {
            let mut scene = Scene::new();
            scene.graph = Some(fixture.graph);
            let mut frame = vec![0u8; (fixture.width * fixture.height * 4) as usize];
            app_context.enter(|| draw_scene(&mut frame, fixture.width, fixture.height, &scene));
            frames.push(RenderedFrame {
                width: fixture.width,
                height: fixture.height,
                pixels: frame,
                normalized_rect: fixture.normalized_rect,
            });
        }
        case.assert_frames(&frames);
    }
}