/painterz

Low-level implementation of different painting primitives (lines, rectangles, ...) without specialization on a certain draw target

Primary LanguageZigMIT LicenseMIT

painterz

The idea of this library is to provide platform-independent, embedded-feasible implementations of several drawing primitives.

The library exports a generic Canvas type which is specialized on a setPixel function that will put pixels of type Color onto a Framebuffer. It's currently not possible or planned to do blending, but alpha test could be implemented by ignoring certain color values in the setPixel function.

Usage Example

Usage example rendering

See src/example.zig for a full usage example.

const Pixel = packed struct {
    r: u8, g: u8, b: u8, a: u8
};

const Framebuffer = struct {
    buffer: []Pixel,

    fn setPixel(fb: @This(), x: isize, y: isize, c: Pixel) void {
        if (x < 0 or y < 0) return;
        if (x >= 100 or y >= 100) return;
        fb.buffer[100 * std.math.absCast(y) + std.math.absCast(x)] = c;
    }
};

var canvas = painterz.Canvas(Framebuffer, Pixel, Framebuffer.setPixel).init(Framebuffer{
    .buffer = …,
});

canvas.drawLine(100, 120, 110, 90, Pixel{
    .r = 0xFF,
    .g = 0x00,
    .b = 0xFF,
    .a = 0xFF,
});