PicoDVI/software/libsprite/tile.h
2021-11-20 23:05:38 +00:00

52 lines
1.7 KiB
C

#ifndef _TILE_FUNCS_H
#define _TILE_FUNCS_H
#include "pico/types.h"
typedef enum {
TILESIZE_8 = 0,
TILESIZE_16
} tilesize_t;
// Dubiously-erased function type for fill loops (cast out before calling):
typedef void (*tile_loop_t)(void *dst, const void *tileset, uint x0, uint x1);
// Rather than defining the pixel format, the tilebg object has a function
// pointer to a pixel fill loop appropriate for the format and tile size.
//
// The asm fill loops are specialised for format (as well as tile size), are
// pretty large, and live in RAM. If we dispatched those loops dynamically,
// the references to all the loops would prevent their link-time garbage
// collection, wasting RAM we would rather use for sprite/tile assets.
// Instead, the creator of the tilebg object explicitly adds references to
// the appropriate fill routine symbols when configuring the tilebgs.
typedef struct tilebg {
uint16_t xscroll;
uint16_t yscroll;
const void *tileset;
const uint8_t *tilemap;
uint8_t log_size_x;
uint8_t log_size_y;
tilesize_t tilesize;
tile_loop_t fill_loop;
} tilebg_t;
// ----------------------------------------------------------------------------
// Functions from tile.S
// Signature of fill loops of a given pixel size:
typedef void (*tile16_loop_t)(uint16_t *dst, const uint16_t *tileset, uint x0, uint x1);
typedef void (*tile8_loop_t)(uint8_t *dst, const uint8_t *tileset, uint x0, uint x1);
void tile16_16px_alpha_loop(uint16_t *dst, const uint16_t *tileset, uint x0, uint x1);
void tile16_16px_loop(uint16_t *dst, const uint16_t *tileset, uint x0, uint x1);
// ----------------------------------------------------------------------------
// Functions from tile.c
void tile16(uint16_t *scanbuf, const tilebg_t *bg, uint raster_y, uint raster_w);
#endif