/* * Copyright (c) 2012 Jean-Christophe PLAGNIOL-VILLARD * * GPL v2 */ #include #include #include #include #include #include #include struct fb_bitfield { uint32_t offset; /* beginning of bitfield */ uint32_t length; /* length of bitfield */ uint32_t msb_right; /* != 0 : Most significant bit is */ /* right */ }; static SDL_Surface *real_screen; static void *buffer = NULL; pthread_t th; int sdl_init(void) { return SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE); } static void sdl_copy_buffer(SDL_Surface *screen) { if (SDL_MUSTLOCK(screen)) { if (SDL_LockSurface(screen) < 0) return; } memcpy(screen->pixels, buffer, screen->pitch * screen->h); if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); } static void *threadStart(void *ptr) { while (1) { usleep(1000 * 100); sdl_copy_buffer(real_screen); SDL_Flip(real_screen); } return 0; } void sdl_start_timer(void) { pthread_attr_t attr; pthread_attr_init(&attr); pthread_create(&th, &attr, threadStart, NULL); } void sdl_stop_timer(void) { pthread_cancel(th); } void sdl_get_bitfield_rgba(struct fb_bitfield *r, struct fb_bitfield *g, struct fb_bitfield *b, struct fb_bitfield *a) { SDL_Surface *screen = real_screen; r->length = 8 - screen->format->Rloss; r->offset = screen->format->Rshift; g->length = 8 - screen->format->Gloss; g->offset = screen->format->Gshift; b->length = 8 - screen->format->Bloss; b->offset = screen->format->Bshift; a->length = 8 - screen->format->Aloss; a->offset = screen->format->Ashift; } int sdl_open(int xres, int yres, int bpp, void* buf) { int flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL; if (sdl_init() < 0) { printf("Could not initialize SDL: %s.\n", SDL_GetError()); return -1; } real_screen = SDL_SetVideoMode(xres, yres, bpp, flags); if (!real_screen) { sdl_close(); fprintf(stderr, "Couldn't create renderer: %s\n", SDL_GetError()); return -1; } buffer = buf; return 0; } void sdl_close(void) { sdl_stop_timer(); SDL_Quit(); }