cranpose-render-wgpu 0.1.160

WGPU renderer backend for Cranpose
Documentation
mod support;

use cranpose_render_common::graph::RenderGraph;
use cranpose_ui_graphics::{DrawScopeDefault, Size};
use support::{LockedRenderer, SIZE, record_mixed_scene};

const TOGGLE: &str = "CRANPOSE_ABLATE";

fn graph_of(record: fn(&mut DrawScopeDefault)) -> RenderGraph {
    let mut scope = DrawScopeDefault::new(Size::new(SIZE as f32, SIZE as f32));
    record(&mut scope);
    support::draw_run_graph(SIZE, scope)
}

fn capture_under(
    renderer: &mut LockedRenderer,
    graph: &RenderGraph,
    switch: Option<&str>,
) -> Vec<u8> {
    cranpose_render_wgpu::set_debug_toggle(TOGGLE, switch);
    let pixels = support::settled_capture(renderer, graph);
    cranpose_render_wgpu::set_debug_toggle(TOGGLE, None);
    pixels
}

#[test]
fn the_shape_switches_remove_the_fragment_program_and_then_the_fill() {
    let mut renderer = match support::headless_renderer() {
        Ok(renderer) => renderer,
        Err(err) => {
            eprintln!("skipping shape ablation: headless WGPU init failed: {err}");
            return;
        }
    };
    let mixed = graph_of(record_mixed_scene);
    let base = capture_under(&mut renderer, &mixed, None);
    let flat = capture_under(&mut renderer, &mixed, Some("shape"));
    let discarded = capture_under(&mut renderer, &mixed, Some("shape_fill"));
    let cleared = capture_under(&mut renderer, &graph_of(|_| {}), None);

    assert!(
        support::distinct_colors(&base) > 8,
        "the scene must draw something"
    );
    assert_ne!(base, flat, "`shape` must drop coverage and brush");
    assert!(
        support::distinct_colors(&flat) > 1,
        "`shape` must keep the fill: flat fragments still write"
    );
    assert_ne!(
        discarded, flat,
        "`shape_fill` must remove the fill `shape` keeps"
    );
    assert_eq!(discarded, cleared, "`shape_fill` must leave only the clear");
}