#ifndef plat_h #define plat_h #include "error.h" #include "memory.h" #include "render.h" #ifdef assert #undef assert #endif #define assert(expr) \ imp_assert( \ expr, \ #expr, \ __FILE__, \ __LINE__ \ ) int imp_assert( int val, const char* expr, const char* file, int line ); void print(const char* fmt, ...); void print_err(const char* fmt, ...); void print_war(const char* fmt, ...); void pbreak(Error code); typedef struct File File; typedef enum { file_flags_write = 1 << 0, file_flags_read = 1 << 1, file_flags_read_write = 1 << 2, file_flags_create = 1 << 3 } File_Flags; typedef enum { file_whence_begin, file_whence_end, file_whence_cur } File_Whence; File* file_open(const char* name, File_Flags flags); void file_close(File* file); void file_read(File* file, void* buffer, int size); void file_write(File* file, const void* buffer, int size); void file_seek(File* file, int offset, File_Whence whence); int file_size(File* file); int file_exists(const char* name); typedef struct { int mpf; int fps; unsigned long pt, ct; unsigned long now, next; } FPS; void init_fps(FPS* f, int mpf); void fps_begin(FPS* f); void fps_end(FPS* f); void fps_update(FPS* f); #define key_xmacro() \ x(key_unknown) \ x(key_A) \ x(key_B) \ x(key_C) \ x(key_D) \ x(key_E) \ x(key_F) \ x(key_G) \ x(key_H) \ x(key_I) \ x(key_J) \ x(key_K) \ x(key_L) \ x(key_M) \ x(key_N) \ x(key_O) \ x(key_P) \ x(key_Q) \ x(key_R) \ x(key_S) \ x(key_T) \ x(key_U) \ x(key_V) \ x(key_W) \ x(key_X) \ x(key_Y) \ x(key_Z) \ x(key_f1) \ x(key_f2) \ x(key_f3) \ x(key_f4) \ x(key_f5) \ x(key_f6) \ x(key_f7) \ x(key_f8) \ x(key_f9) \ x(key_f10) \ x(key_f11) \ x(key_f12) \ x(key_down) \ x(key_left) \ x(key_right) \ x(key_up) \ x(key_escape) \ x(key_return) \ x(key_backspace) \ x(key_tab) \ x(key_delete) \ x(key_home) \ x(key_end) \ x(key_page_up) \ x(key_page_down) \ x(key_insert) \ x(key_shift) \ x(key_control) \ x(key_super) \ x(key_alt) \ x(key_space) \ x(key_period) \ x(key_0) \ x(key_1) \ x(key_2) \ x(key_3) \ x(key_4) \ x(key_5) \ x(key_6) \ x(key_7) \ x(key_8) \ x(key_9) \ typedef enum { #define x(name) name, key_xmacro() #undef x key_count } Key; typedef enum { mbtn_left, mbtn_middle, mbtn_right, mbtn_count } Mbtn; typedef enum { key_state_pressed = 1 << 0, key_state_just_pressed = 1 << 1, key_state_just_released = 1 << 2 } Key_State; typedef struct App { int w, h, s, o, mpf; int fps; int mx, my; int scrollx, scrolly; int dmx, dmy; Error err; Colour* fb; Heap* heap; unsigned char key_states[key_count]; unsigned char mbtn_states[mbtn_count]; } App; App* new_app(Heap* mem, int w, int h, const char* n); void deinit_app(App* a); void app_begin(App* a); void app_end(App* a); void cfg_mouse(App* a, int show); #endif