#pragma once #include #include #include "vector.h" enum DrawMode { WhiteOnly, BlackOnly, WhiteAsBlack, BlackAsWhite, WhiteAsInverted, BlackAsInverted, }; typedef struct { uint8_t *data; uint8_t *back_buffer; uint8_t width; uint8_t height; bool double_buffered; } Buffer; enum PixelColor { Black, //or White, // Flip //not }; typedef struct { const Vector anchor; enum DrawMode drawMode; } RenderSettings; #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define DEFAULT_RENDER (RenderSettings){.anchor={.x=0.5f, .y=0.5f}, .drawMode=BlackOnly} Buffer *buffer_create(uint8_t width, uint8_t height, bool double_buffered); void buffer_release(Buffer *buffer); bool buffer_test_coordinate(Buffer *const buffer, int x, int y); bool buffer_get_pixel(Buffer *const buffer, int x, int y); void buffer_set_pixel(Buffer *buffer, int16_t x, int16_t y, enum PixelColor draw_mode); Buffer *buffer_copy(Buffer *buffer); void buffer_swap_back(Buffer *buffer); void buffer_swap_with(Buffer *buffer_a, Buffer *buffer_b); void buffer_draw_all(Buffer *target, Buffer *const sprite, Vector *position, float rotation); void buffer_draw(Buffer *target, Buffer *const sprite, Vector *position, uint8_t x_cap, uint8_t y_cap, float rotation, RenderSettings *settings); //void buffer_draw_internal(Buffer *target, Buffer* sprite, bool is_black, enum PixelColor color, Vector *const position, uint8_t x_cap, uint8_t y_cap, float rotation); void buffer_render(Buffer *buffer, Canvas *const canvas); void buffer_clear(Buffer *buffer); void buffer_draw_line(Buffer *buffer, int x0, int y0, int x1, int y1, enum PixelColor draw_mode); void buffer_draw_rbox(Buffer *buffer, int16_t x0, int16_t y0, int16_t x1, int16_t y1, enum PixelColor draw_mode); void buffer_draw_rbox_frame(Buffer *buffer, int16_t x0, int16_t y0, int16_t x1, int16_t y1, enum PixelColor draw_mode); void buffer_draw_box(Buffer *buffer, int16_t x0, int16_t y0, int16_t x1, int16_t y1, enum PixelColor draw_mode); void buffer_draw_circle(Buffer *buffer, int x, int y, int r, enum PixelColor draw_mode);