# HG changeset patch # User John Tsiombikas # Date 1421543797 -7200 # Node ID cdbcae5b3b98b2ac5df1cdf39a2f38bbdd3cb768 # Parent bc0996863c79b98f71bc62b582cde33cf13a4f5e added fblib diff -r bc0996863c79 -r cdbcae5b3b98 .clang_complete --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.clang_complete Sun Jan 18 03:16:37 2015 +0200 @@ -0,0 +1,1 @@ +-DFBLIB_SDL diff -r bc0996863c79 -r cdbcae5b3b98 Makefile --- a/Makefile Sat Jan 17 18:40:49 2015 +0200 +++ b/Makefile Sun Jan 18 03:16:37 2015 +0200 @@ -3,7 +3,12 @@ obj = $(csrc:.c=.o) $(ccsrc:.cc=.o) bin = eobish -CFLAGS = -pedantic -Wall -g `pkg-config --cflags sdl` +warn = -pedantic -Wall +opt = -O0 +dbg = -g +def = -DFBLIB_SDL + +CFLAGS = $(warn) $(opt) $(dbg) $(def) `pkg-config --cflags sdl` CXXFLAGS = $(CFLAGS) LDFLAGS = `pkg-config --libs sdl` diff -r bc0996863c79 -r cdbcae5b3b98 src/fblib.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/fblib.c Sun Jan 18 03:16:37 2015 +0200 @@ -0,0 +1,48 @@ +#include "fblib.h" +#include "fblibimp.h" + +void fb_set_palette(int *colors) +{ + fb_set_palette_range(0, 256, colors); +} + +void fb_set_palette_entry(int idx, int r, int g, int b) +{ + int col[3]; + col[0] = r; + col[1] = g; + col[2] = b; + + fb_set_palette_range(idx, 1, col); +} + +int fb_key_state(int key) +{ + if(key < 256) { + return fb_inp.key[key]; + } + return 0; +} + +int fb_mouse_state(int bn, int *x, int *y) +{ + return 0; +} + +void fb_keyboard_callback(void (*func)(int, int, void*), void *cls) +{ + fb_cb.keyb = func; + fb_cb.keyb_data = cls; +} + +void fb_mouse_button_callback(void (*func)(int, int, int, int, void*), void *cls) +{ + fb_cb.button = func; + fb_cb.button_data = cls; +} + +void fb_mouse_motion_callback(void (*func)(int, int, void*), void *cls) +{ + fb_cb.motion = func; + fb_cb.motion_data = cls; +} diff -r bc0996863c79 -r cdbcae5b3b98 src/fblib.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/fblib.h Sun Jan 18 03:16:37 2015 +0200 @@ -0,0 +1,47 @@ +#ifndef FBLIB_H_ +#define FBLIB_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* pixel formats for various bpp values + * 32: [R8][G8][B8][X8] or [X|B|G|R] (little endian) + * 24: [R8][G8][B8] + * 16: [R5|G6|B5] + * 15: [R5|G5|B5] + * 8: [I8] (8 bit color index) + */ +int fb_init(int width, int height, int bpp); +void fb_shutdown(void); + +int fb_get_width(void); +int fb_get_height(void); +int fb_get_bpp(void); + +void *fb_begin_frame(void); +void fb_end_frame(void); + +void fb_set_palette(int *colors); +void fb_set_palette_range(int start, int count, int *colors); +void fb_set_palette_entry(int idx, int r, int g, int b); + +/* event handling */ +int fb_key_state(int key); +int fb_mouse_state(int bn, int *x, int *y); + +void fb_keyboard_callback(void (*func)(int, int, void*), void *cls); +void fb_mouse_button_callback(void (*func)(int, int, int, int, void*), void *cls); +void fb_mouse_motion_callback(void (*func)(int, int, void*), void *cls); + +int fb_process_events(void); + +/* misc */ +unsigned long fb_get_time(void); + +#ifdef __cplusplus +} +#endif + + +#endif /* FBLIB_H_ */ diff -r bc0996863c79 -r cdbcae5b3b98 src/fblibimp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/fblibimp.h Sun Jan 18 03:16:37 2015 +0200 @@ -0,0 +1,22 @@ +#ifndef FBLIBIMP_H_ +#define FBLIBIMP_H_ + +#include "fblib.h" + +struct callbacks { + void (*keyb)(int, int, void*); + void (*button)(int, int, int, int, void*); + void (*motion)(int, int, void*); + + void *keyb_data, *button_data, *motion_data; +} fb_cb; + +struct input_state { + unsigned char key[256]; + unsigned char mbutton[8]; + int mx, my; +} fb_inp; + +int fb_width, fb_height, fb_bpp; + +#endif /* FBLIBIMP_H_ */ diff -r bc0996863c79 -r cdbcae5b3b98 src/fblibsdl.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/fblibsdl.c Sun Jan 18 03:16:37 2015 +0200 @@ -0,0 +1,199 @@ +#ifdef FBLIB_SDL +#include +#include +#include +#include +#include "fblib.h" +#include "fblibimp.h" + +static int scale; +static SDL_Surface *surf; +static unsigned char *scalebuf; /* only if scale != 1 */ +static int pixbytes; /* pixel size in bytes */ + +int fb_init(int width, int height, int bpp) +{ + static int sdlinit_done; + char *env, title[64]; + + if((env = getenv("FBLIB_SCALE"))) { + scale = atoi(env); + } + if(!scale) scale = 1; + + fb_width = width; + fb_height = height; + fb_bpp = bpp; + + pixbytes = (bpp + 7) / 8; + + if(!sdlinit_done) { + if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { + fprintf(stderr, "failed to initialize SDL!\n"); + return -1; + } + sdlinit_done = 1; + } + + if(!(surf = SDL_SetVideoMode(width * scale, height * scale, bpp, SDL_SWSURFACE))) { + fprintf(stderr, "failed to set video mode\n"); + return -1; + } + sprintf(title, "fblib window (%dx)", scale); + SDL_WM_SetCaption(title, 0); + + if(scale != 1) { + if(!(scalebuf = malloc(width * height * pixbytes))) { + fprintf(stderr, "failed to allocate back buffer\n"); + SDL_Quit(); + return -1; + } + } else { + scalebuf = 0; + } + + return 0; +} + +void fb_shutdown(void) +{ + free(scalebuf); + SDL_Quit(); +} + +int fb_get_width(void) +{ + return fb_width; +} + +int fb_get_height(void) +{ + return fb_height; +} + +int fb_get_bpp(void) +{ + return fb_bpp; +} + +void *fb_begin_frame(void) +{ + if(!surf) return 0; + + if(scalebuf) { + return scalebuf; + } + + if(SDL_MUSTLOCK(surf)) { + SDL_LockSurface(surf); + } + return surf->pixels; +} + +void fb_end_frame(void) +{ + if(scalebuf) { + int i, j, k; + unsigned char *dest; + + if(SDL_MUSTLOCK(surf)) { + SDL_LockSurface(surf); + } + dest = surf->pixels; + + for(i=0; ih; i++) { + int y = i / scale; + unsigned char *scan = scalebuf + y * fb_width * pixbytes; + + for(j=0; jw; j++) { + int x = j / scale; + + for(k=0; k -#include +#include "fblib.h" static void display(); -static bool proc_event(SDL_Event *ev); -static void set_pal_entry(int idx, int r, int g, int b); - -static SDL_Surface *fbsurf; int main(int argc, char **argv) { - SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER); - - if(!(fbsurf = SDL_SetVideoMode(320, 240, 8, SDL_SWSURFACE))) { - fprintf(stderr, "failed to set video mode\n"); + if(fb_init(320, 240, 8) == -1) { return 1; } - set_pal_entry(1, 255, 0, 0); + fb_set_palette_entry(1, 255, 0, 0); for(;;) { - SDL_Event ev; - while(SDL_PollEvent(&ev)) { - if(!proc_event(&ev)) { - goto done; - } + if(fb_process_events() == -1) { + break; } - display(); } done: - SDL_Quit(); + fb_shutdown(); return 0; } void display() { - if(SDL_MUSTLOCK(fbsurf)) { - SDL_LockSurface(fbsurf); - } + int width = fb_get_width(); + int height = fb_get_height(); + unsigned char *pixels = (unsigned char*)fb_begin_frame(); - unsigned char *pixels = (unsigned char*)fbsurf->pixels; - for(int i=0; iw * fbsurf->h; i++) { + for(int i=0; itype) { - case SDL_KEYDOWN: - if(ev->key.keysym.sym == SDLK_ESCAPE) { - return false; - } - break; - - default: - break; - } - return true; -} - -static void set_pal_entry(int idx, int r, int g, int b) -{ - SDL_Color col; - col.r = r; - col.g = g; - col.b = b; - - SDL_SetPalette(fbsurf, SDL_LOGPAL | SDL_PHYSPAL, &col, idx, 1); - - /*palette[idx].r = r; - palette[idx].g = g; - palette[idx].b = b;*/ -}