#include #include #include "flirt-debug.h" #include "SDL/SDL.h" #define WIDTH 800 #define HEIGHT 600 static SDL_Surface *screen; void doNothing(char *msg, ...) { } void sdlerror(char* msg) { fputs(msg, stderr); fputs(": ", stderr); fputs(SDL_GetError(), stderr); fputs("\n", stderr); exit(1); } void dd_initSDL() { /* Initialize the SDL library */ if ( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE) < 0 ) sdlerror("Couldn't initialize SDL"); /* Set video mode */ screen = SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_HWSURFACE); if ( screen == NULL ) sdlerror("Couldn't set SDL video mode"); } void dd_runSDL(ddPlayer* player, ddImage* image) { SDL_Event event; int done = 0; if ( SDL_LockSurface(screen) < 0 ) sdlerror("Couldn't lock the display surface"); ddImage_setBuffer(image, screen->pixels); // do one full-screen update first ddPlayer_readMovie(player); ddPlayer_step(player); while ( ddPlayer_executeFrameActions(player, STEP_FRAME) ) ; SDL_UnlockSurface(screen); SDL_UpdateRect(screen, 0, 0, WIDTH, HEIGHT); while ( !done ) { int i; if ( SDL_LockSurface(screen) < 0) sdlerror("Couldn't lock the display surface"); ddImage_setBuffer(image, screen->pixels); ddPlayer_step(player); while ( ddPlayer_executeFrameActions(player, STEP_FRAME) ) ; ddRect* rects; int count; ddPlayer_updateDisplay(player, &rects, &count); SDL_UnlockSurface(screen); for ( i = 0; i < count; ++i ) { ddRect rect = rects[i]; SDL_UpdateRect(screen, INT_F(rect.left), INT_F(rect.top), INT_F(rect.right - rect.left), INT_F(rect.bottom - rect.top)); } /* XXX - wait for next frame */ /* XXX - prolly want to toss extra mouse moves */ while ( SDL_PollEvent(&event) ) { switch ( event.type ) { case SDL_MOUSEMOTION: ddPlayer_doMouseMove(player, event.motion.x, event.motion.y); break; case SDL_MOUSEBUTTONDOWN: /* button number in event.button.button */ ddPlayer_doMouseDown(player, event.button.x, event.button.y); break; case SDL_MOUSEBUTTONUP: ddPlayer_doMouseUp(player, event.button.x, event.button.y); break; case SDL_KEYDOWN: if ( event.key.keysym.sym == SDLK_ESCAPE ) done = 1; ddPlayer_doKeyDown(player, event.key.which); break; case SDL_KEYUP: ddPlayer_doKeyUp(player, event.key.which); break; case SDL_QUIT: done = 1; break; //default: // printf("unhandled event type %i\n", event.type); } } } } int main(int argc, char *argv[]) { FILE* f; ddPlayer* player; ddImage* image = dd_newImage(WIDTH, HEIGHT); if ( argc == 1 ) { printf("usage: test \nAttempts to parse the named file\n"); exit(-1); } f = fopen(argv[1], "rb"); if ( f == NULL ) { printf("couldn't open file %s\n", argv[1]); exit(-1); } if ( !dd_init() ) { printf("dd_init() failed\n"); exit(-1); } //dd_setWarnFunction(doNothing); dd_initSDL(); player = dd_newPlayer_file(f, image); dd_setActionTraceFunction(player, (void *)puts, NULL); dd_runSDL(player, image); dd_destroyPlayer(player); SDL_Quit(); return 0; }