96 lines
1.6 KiB
C
96 lines
1.6 KiB
C
#ifndef PIXEL_H
|
|
#define PIXEL_H
|
|
|
|
#define LINEBYTES (((NUM_COLS-1)/8)+1)
|
|
|
|
extern unsigned char shl_table[];
|
|
extern unsigned char pixmap[NUMPLANE][NUM_ROWS][LINEBYTES];
|
|
|
|
typedef struct {
|
|
unsigned char x;
|
|
unsigned char y;
|
|
} pixel;
|
|
|
|
|
|
enum direction{
|
|
up,
|
|
right,
|
|
down,
|
|
left
|
|
};
|
|
#ifdef NDEBUG
|
|
typedef unsigned char direction_t;
|
|
#else
|
|
typedef enum direction direction_t;
|
|
#endif
|
|
|
|
|
|
enum pixelmode{
|
|
clear,
|
|
set
|
|
};
|
|
#ifdef NDEBUG
|
|
typedef unsigned char pixelmode_t;
|
|
#else
|
|
typedef enum pixelmode pixelmode_t;
|
|
#endif
|
|
|
|
|
|
typedef struct cursor{
|
|
pixel pos;
|
|
direction_t dir;
|
|
pixelmode_t mode;
|
|
} cursor_t;
|
|
|
|
|
|
#if NUM_ROWS < 64 && NUM_COLS < 64
|
|
/** use 8 bit operands where feasible */
|
|
typedef signed char operand_t;
|
|
#else
|
|
/** use 16 bit operands if either width or height are >= 64 */
|
|
typedef int operand_t;
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Pixel routines
|
|
*/
|
|
|
|
unsigned char get_pixel(pixel p);
|
|
|
|
inline static pixel next_pixel(pixel pix, direction_t dir){
|
|
static char const nDelta[] = {0, -1, 0, 1, 0};
|
|
return (pixel){pix.x + nDelta[dir], pix.y + nDelta[dir + 1]};
|
|
}
|
|
|
|
|
|
inline static unsigned char get_next_pixel(pixel p, direction_t dir){
|
|
return get_pixel(next_pixel(p, dir));
|
|
}
|
|
|
|
|
|
inline static direction_t direction_r(direction_t dir){
|
|
return (dir + 1u) % 4u;
|
|
}
|
|
|
|
|
|
void clear_screen(unsigned char value);
|
|
|
|
|
|
void setpixel(pixel p, unsigned char value);
|
|
#define clearpixel(p) setpixel(p, 0);
|
|
|
|
|
|
void shift_pixmap_l();
|
|
|
|
|
|
static inline void set_cursor(cursor_t* cur, pixel p){
|
|
cur->pos = p;
|
|
setpixel(p, cur->mode ? 3 : 0);
|
|
}
|
|
|
|
void line(pixel p1,
|
|
pixel const p2,
|
|
unsigned char const color);
|
|
|
|
#endif // PIXEL_H
|