nuclear@2: #ifdef FBLIB_SDL nuclear@2: #include nuclear@2: #include nuclear@2: #include nuclear@2: #include nuclear@2: #include "fblib.h" nuclear@2: #include "fblibimp.h" nuclear@2: nuclear@2: static int scale; nuclear@2: static SDL_Surface *surf; nuclear@2: static unsigned char *scalebuf; /* only if scale != 1 */ nuclear@2: static int pixbytes; /* pixel size in bytes */ nuclear@2: nuclear@2: int fb_init(int width, int height, int bpp) nuclear@2: { nuclear@2: static int sdlinit_done; nuclear@2: char *env, title[64]; nuclear@2: nuclear@2: if((env = getenv("FBLIB_SCALE"))) { nuclear@2: scale = atoi(env); nuclear@2: } nuclear@2: if(!scale) scale = 1; nuclear@2: nuclear@2: fb_width = width; nuclear@2: fb_height = height; nuclear@2: fb_bpp = bpp; nuclear@2: nuclear@2: pixbytes = (bpp + 7) / 8; nuclear@2: nuclear@2: if(!sdlinit_done) { nuclear@2: if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { nuclear@2: fprintf(stderr, "failed to initialize SDL!\n"); nuclear@2: return -1; nuclear@2: } nuclear@2: sdlinit_done = 1; nuclear@2: } nuclear@2: nuclear@2: if(!(surf = SDL_SetVideoMode(width * scale, height * scale, bpp, SDL_SWSURFACE))) { nuclear@2: fprintf(stderr, "failed to set video mode\n"); nuclear@2: return -1; nuclear@2: } nuclear@2: sprintf(title, "fblib window (%dx)", scale); nuclear@2: SDL_WM_SetCaption(title, 0); nuclear@2: nuclear@2: if(scale != 1) { nuclear@2: if(!(scalebuf = malloc(width * height * pixbytes))) { nuclear@2: fprintf(stderr, "failed to allocate back buffer\n"); nuclear@2: SDL_Quit(); nuclear@2: return -1; nuclear@2: } nuclear@2: } else { nuclear@2: scalebuf = 0; nuclear@2: } nuclear@2: nuclear@2: return 0; nuclear@2: } nuclear@2: nuclear@2: void fb_shutdown(void) nuclear@2: { nuclear@2: free(scalebuf); nuclear@2: SDL_Quit(); nuclear@2: } nuclear@2: nuclear@2: int fb_get_width(void) nuclear@2: { nuclear@2: return fb_width; nuclear@2: } nuclear@2: nuclear@2: int fb_get_height(void) nuclear@2: { nuclear@2: return fb_height; nuclear@2: } nuclear@2: nuclear@2: int fb_get_bpp(void) nuclear@2: { nuclear@2: return fb_bpp; nuclear@2: } nuclear@2: nuclear@2: void *fb_begin_frame(void) nuclear@2: { nuclear@2: if(!surf) return 0; nuclear@2: nuclear@2: if(scalebuf) { nuclear@2: return scalebuf; nuclear@2: } nuclear@2: nuclear@2: if(SDL_MUSTLOCK(surf)) { nuclear@2: SDL_LockSurface(surf); nuclear@2: } nuclear@2: return surf->pixels; nuclear@2: } nuclear@2: nuclear@2: void fb_end_frame(void) nuclear@2: { nuclear@2: if(scalebuf) { nuclear@2: int i, j, k; nuclear@2: unsigned char *dest; nuclear@2: nuclear@2: if(SDL_MUSTLOCK(surf)) { nuclear@2: SDL_LockSurface(surf); nuclear@2: } nuclear@2: dest = surf->pixels; nuclear@2: nuclear@2: for(i=0; ih; i++) { nuclear@2: int y = i / scale; nuclear@2: unsigned char *scan = scalebuf + y * fb_width * pixbytes; nuclear@2: nuclear@2: for(j=0; jw; j++) { nuclear@2: int x = j / scale; nuclear@2: nuclear@2: for(k=0; k