Skip to main content

Crate denise_render

Crate denise_render 

Source
Expand description

Denise’s software rasteriser.

Rectangles, rounded rectangles, circles, arcs, stars, lines, image blitting, rectangular clipping and source-over alpha blending, straight into a denise::Frame. No GPU, no path builder, no allocator: this crate needs neither std nor alloc, and every operation writes through a borrowed slice the caller already owns.

let mut canvas = Canvas::new(frame);
for region in damage {
    // Everything inside this borrow is confined to `region`.
    let mut c = canvas.with_clip(*region);
    c.clear(Color::from_rgb888(0x1E1E2E));
    c.fill_rounded_rect(Rect::new(40, 40, 200, 64), 12, Color::rgba(255, 255, 255, 32));
    c.draw_line(Point::new(40, 120), Point::new(240, 121), Color::WHITE);
    // A 70% progress ring. Angles are binary turns: 0 is twelve o'clock,
    // clockwise positive, no radians and no floats anywhere.
    c.stroke_arc(Point::new(300, 90), 40, 8, 0, 70 * denise_render::TURN / 100, Color::WHITE);
}

§No floating point

The rasteriser is integer throughout, including anti-aliasing coverage. That avoids a libm dependency on no_std targets and keeps output bit-identical between x86 and ARM, so the reference tests mean the same thing on a developer’s desktop and on the Pi.

§No unsafe

Deliberately, for now. Bounds checks are hoisted by working through row slices rather than indexing pixel by pixel. If the benches ever show that costing real time, that is the evidence needed to justify unchecked access — not before.

Re-exports§

pub use blend::Paint;
pub use canvas::Canvas;
pub use canvas::PixelView;
pub use coverage::Mask;
pub use font::BitmapFont;

Modules§

blend
Pixel arithmetic.
canvas
The drawing target: a borrowed frame plus a clip rectangle.
coverage
Compositing 8-bit coverage masks.
font
The built-in bitmap font.

Constants§

TURN
One full revolution, in the angle unit every arc call takes.