// Corresponds roughly to section 6.2 of the Pico 8 manual // // However, all ranges are now half-open. // // https://www.lexaloffle.com/dl/docs/pico-8_manual.html // #ifndef CROCPARTY_SYS_GRAPHICS_H #define CROCPARTY_SYS_GRAPHICS_H #include #include #include "sys_data.h" /** * Set the clipping rectangle in pixels. * * All drawing operations will be clipped to this rectangle. */ void sys_clip_set(sys_i32 x0, sys_i32 y0, sys_i32 x1, sys_i32 y1); /** * Reset the clipping rectangle. */ void sys_clip_reset(); /** * Set the clipping rectangle in pixels. * * This is the same as `sys_clip_set`, but you can pass clip_previous in order * to clip to the previous region. */ void sys_clip_set_ext( sys_i32 x0, sys_i32 y0, sys_i32 x1, sys_i32 y1, bool clip_previous ); /** * Set the color of the pixel `(x, y)`. */ void sys_pixel_set( sys_i32 x, sys_i32 y, sys_color c ); /** * Get the color of the pixel `(x, y)`. * * Returns SYS_COLOR_TRANSPARENT if the pixel is out of bounds. */ sys_color sys_pixel_get( sys_i32 x, sys_i32 y ); // TODO: SSET/SGET // TODO: FGET/FSET /** * Output the dimensions of the text (x and y) */ void sys_measure_text(const char* str, sys_i32* x, sys_i32* y); /** * Print a string `str` in the color `col` */ void sys_print(const char* str, sys_i32 x, sys_i32 y, sys_color col); // TODO: CURSOR? COLOR? /** * Fill the entire screen with color `c`. */ void sys_cls(sys_color c); /** * Create a screen offset of `(-x, -y)` for all drawing operations. */ void sys_camera_set(sys_i32 x, sys_i32 y); /** * Reset the camera's offset to `(0, 0)`. */ void sys_camera_reset(); /** * Draw or fill a circle at `(x, y)` with radius `r`. * * The circle is centered at the center of the pixel, not at the junction * between pixels. * * If r is negative, the circle is not drawn. * * This is a special case of sys_oval_draw_ext. */ void sys_circ_draw(sys_i32 x, sys_i32 y, sys_i32 r, sys_color c); void sys_circ_fill(sys_i32 x, sys_i32 y, sys_i32 r, sys_color c); void sys_circ_draw_ext(sys_i32 x, sys_i32 y, sys_i32 r, sys_color c, bool fill); /** * Draw or fill an oval in the rectangle from `(x0, y0)` to `(x1, y1)` */ void sys_oval_draw(sys_i32 x0, sys_i32 y0, sys_i32 x1, sys_i32 y1, sys_color c); void sys_oval_fill(sys_i32 x0, sys_i32 y0, sys_i32 x1, sys_i32 y1, sys_color c); void sys_oval_draw_ext( sys_i32 x0, sys_i32 y0, sys_i32 x1, sys_i32 y1, sys_color c, bool fill ); /** * Draw a line from x0 to y0. * * The point `(x1, y1)` is not drawn. (because the line is a half-open interval) */ void sys_line_draw(sys_i32 x0, sys_i32 y0, sys_i32 x1, sys_i32 y1, sys_color c); /** * Draw or fill a rectangle `(x, y, w, h)` */ void sys_rect_draw(sys_i32 x0, sys_i32 y0, sys_i32 x1, sys_i32 y1, sys_color c); void sys_rect_fill(sys_i32 x0, sys_i32 y0, sys_i32 x1, sys_i32 y1, sys_color c); void sys_rect_draw_ext( sys_i32 x0, sys_i32 y0, sys_i32 x1, sys_i32 y1, sys_color c, bool fill ); /** * Set screen palette. * * After calling this function, virtual color `c0` will be rendered as * real color `rc1`. */ void sys_spal_set(sys_color c0, sys_screen_color rc1); /** * Reset screen palette. * * After calling this function, all screen colors are (0, 0, 0). */ void sys_spal_reset(); /** * Set draw palette. * * After calling this function, draws using color `c0` will be performed * using color `c1` instead. * * Any color mapped to `SYS_COLOR_TRANSPARENT` will not actually be drawn. */ void sys_dpal_set(sys_color c0, sys_color c1); /** * Reset draw palette. * * All colors are mapped to themselves. SYS_COLOR_TRANSPARENT is transparent. */ void sys_dpal_reset(); /** * Draw a given sprite. * * w, h default to 1. * flip_x and flip_y default to false. */ void sys_sprite_draw( sys_spritesheet spritesheet, sys_i32 n, sys_i32 x, sys_i32 y ); void sys_sprite_draw_ext( sys_spritesheet spritesheet, sys_i32 n, sys_i32 x, sys_i32 y, sys_i32 w, sys_i32 h, bool flip_x, bool flip_y ); // TODO: SSPR // TODO: FILLP? void sys_map_draw( // NOTE: not the same order of args // as on pico 8 // but: more consistent! sys_map map, sys_spritesheet spritesheet, sys_i32 sx, sys_i32 sy, sys_i32 tile_x, sys_i32 tile_y, sys_i32 tile_w, sys_i32 tile_h // TODO: Layers? ); /** * Get a single map tile, putting whether the coords were invalid into * flag_invalid. * * (flag_invalid may be null) */ sys_maptile sys_map_get( sys_map map, sys_i32 tile_x, sys_i32 tile_y, bool* flag_invalid ); #endif // CROCPARTY_SYS_GRAPHICS_H