diff --git a/src/input.c b/src/input.c index 0ac929b..9c109cb 100644 --- a/src/input.c +++ b/src/input.c @@ -112,14 +112,17 @@ unsigned int input_afterburnSensibility = 200; /**< ms between taps to afterbur /* From player.c */ extern double player_turn; -static const char* keyconv[SDLK_LAST]; /**< Key conversion table. */ +#if SDL_VERSION_ATLEAST(1,3,0) +# define INPUT_NUMKEYS SDL_NUM_SCANCODES /**< Number of keys available. */ +#else /* SDL_VERSION_ATLEASE(1,3,0) */ +# define INPUT_NUMKEYS SDLK_LAST /**< Number of keys available. */ +#endif /* SDL_VERSION_ATLEAST(1,3,0) */ +static const char* keyconv[INPUT_NUMKEYS]; /**< Key conversion table. */ static void input_keyConvGen(void); static void input_keyConvDestroy(void); /** - * @fn void input_setDefault(void) - * * @brief Set the default input keys. */ void input_setDefault(void) { @@ -167,17 +170,47 @@ void input_setDefault(void) { } /** - * @fn void input_init(void) - * * @brief Initialize the input subsystem (does not set keys). */ void input_init(void) { Keybind* tmp; int i; - for(i = 0; strcmp(keybindNames[i], "end"); i++); /* Get number of bindings. */ + +#if SDL_VERSION_ATLEAST(1,3,0) + /* Window. */ + SDL_EventState(SDL_WINDOW_EVENT, SDL_DISABLE); + sDL_EventState(SDL_SYSWMEVENT, SDL_DISABLE); + + /* Keyboard. */ + SDL_EventState(SDL_KEYDOWN, SDL_ENABLE); + SDL_EventState(SDL_KEYUP, SDL_ENABLE); + SDL_EventState(SDL_TEXTINPUT, SDL_DISABLE); + + /* Mice. */ + SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE); + SDL_EventState(SDL_MOUSEBUTTONDOWN, SDL_ENABLE); + SDL_EventState(SDL_MOUSEBUTTONUP, SDL_ENABLE); + SDL_EventState(SDL_MOUSEWHEEL, SDL_ENABLE); + + /* Joystick, enabled in joystick.c if needed. */ + SDL_EventState(SDL_JOYAXISMOTION, SDL_DISABLE); + SDL_EventState(SDL_JOYHATMOTION, SDL_DISABLE); + SDL_EventState(SDL_JOYBUTTONDOWN, SDL_DISABLE); + SDL_EventState(SDL_JOYBUTTONUP, SDL_DISABLE); + + /* Quit. */ + SDL_EventState(SDL_QUIT, SDL_ENABLE); + + /* Proximity. */ + SDL_EventState(SDL_PROXIMITYIN, SDL_DISABLE); + SDL_EventState(SDL_PROXIMITYOUT, SDL_DISABLE); +#endif + + /* Get the number of keybindings. */ + for(i = 0; strcmp(keybindNames[i], "end"); i++); input_keybinds = malloc(i*sizeof(Keybind*)); - /* Create a null keybinding for each. */ + /* Create sane null keybinding for each. */ for(i = 0; strcmp(keybindNames[i], "end"); i++) { tmp = malloc(sizeof(Keybind)); tmp->name = (char*)keybindNames[i]; @@ -188,12 +221,11 @@ void input_init(void) { input_keybinds[i] = tmp; } + /* Generate key translation table. */ input_keyConvGen(); } /** - * @fn void input_exit(void) - * * @brief Exit the input subsystem. */ void input_exit(void) { @@ -211,15 +243,18 @@ void input_exit(void) { static void input_keyConvGen(void) { SDLKey k; - for(k = SDLK_FIRST; k < SDLK_LAST; k++) - keyconv[k] = SDL_GetKeyName(k); + for(k = 0; k < INPUT_NUMKEYS; k++) + keyconv[k] = strdup(SDL_GetKeyName(k)); } /** * @brief Destroy the key conversion table. */ static void input_keyConvDestroy(void) { + int i; + for(i = 0; i < INPUT_NUMKEYS; i++) + free(keyconv[i]); } /** @@ -236,7 +271,7 @@ SDLKey input_keyConv(char* name) { buf[0] = tolower(name[0]); buf[1] = '\0'; - for(k = SDLK_FIRST; k < SDLK_LAST; k++) + for(k = 0; k < INPUT_NUMKEYS; k++) if(strcmp((l==1) ? buf : name, keyconv[k])==0) return k; @@ -245,8 +280,6 @@ SDLKey input_keyConv(char* name) { } /** - * @fn void input_setKeybind(char* keybind, KeybindType type, int key, int reverse) - * * @brief Bind a key of type to action keybind. * @param keybind The name of the keybind defined above. * @param type The type of the keybind. diff --git a/src/lephisto.c b/src/lephisto.c index 42e4a89..4b58f0b 100644 --- a/src/lephisto.c +++ b/src/lephisto.c @@ -232,7 +232,7 @@ int main(int argc, char** argv) { /* Main loop. */ SDL_Event event; - /* flushes the event loop, since I notices that when the joystick is loaded, it */ + /* Flushes the event loop, since I notices that when the joystick is loaded, it */ /* creates button events that results in the player starting out accelerating. */ while(SDL_PollEvent(&event)); while(!quit) { diff --git a/src/opengl.c b/src/opengl.c index 71b95c9..5fca21b 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -137,12 +137,15 @@ static int SDL_VFlipSurface(SDL_Surface* surface) { * @return 0 if the pixel isn't transparent, 0 if it is. */ static int SDL_IsTrans(SDL_Surface* s, int x, int y) { - int bpp = s->format->BytesPerPixel; + int bpp; + Uint8* p; + Uint32 pixelcolour; + + bpp = s->format->BytesPerPixel; /* p is the address to the pixel we want to retrieve. */ - Uint8* p = (Uint8*)s->pixels + y * s->pitch + x*bpp; - - Uint32 pixelcolour = 0; + p = (Uint8*)s->pixels + y * s->pitch + x*bpp; + pixelcolour = 0; switch(bpp) { case 1: pixelcolour = *p; @@ -160,9 +163,15 @@ static int SDL_IsTrans(SDL_Surface* s, int x, int y) { pixelcolour = *(Uint32*)p; break; } - /* Test whetehr the pixels color is equal to color of */ - /*transparent pixels for that surface. */ + /* + * Test whether the pixels color is equal to color of + * transparent pixels for that surface. + */ +#if SDL_VERSION_ATLEAST(1,3,0) + return ((pixelcolour & s->format->Amask) == 0); +#else return (pixelcolour == s->format->colorkey); +#endif } /** @@ -174,17 +183,22 @@ static int SDL_IsTrans(SDL_Surface* s, int x, int y) { * @return 0 on success. */ static uint8_t* SDL_MapTrans(SDL_Surface* s) { + int i, j; + int size; + uint8* t; + /* Allocate memory for just enough bits to hold all the data we need. */ - int size = s->w*s->h/8 + ((s->w*s->h%8)?1:0); - uint8_t* t = malloc(size); + size = s->w*s->h/8 + ((s->w*s->h%8)?1:0); + t = malloc(size); memset(t, 0, size); /* *must* be set to zero. */ if(t == NULL) { WARN("Out of memeory"); return NULL; } + memset(t, 0, size); /* Important, must be set to zero. */ - int i, j; + /* Check each pixel individually. */ for(i = 0; i < s->h; i++) for(j = 0; j < s->w; j++) /* Set each bit to be 1 if not transparent or 0 if it is. */ t[(i*s->w+j)/8] |= (SDL_IsTrans(s,j,i)) ? 0 : (1<<((i*s->w+j)%8)); @@ -226,8 +240,10 @@ int SDL_savePNG(SDL_Surface* surface, const char* file) { int alpha; int pixel_bits; +#if ! SDL_VERSION_ATLEAST(1,3,0) unsigned int surf_flags; unsigned int surf_alpha; +#endif ss_rows = NULL; ss_size = 0; @@ -251,18 +267,22 @@ int SDL_savePNG(SDL_Surface* surface, const char* file) { return -1; } +#if SDL_VERSION_ATLEAST(1,3,0) + SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); +#else surf_flags = surface->flags & (SDL_SRCALPHA | SDL_SRCCOLORKEY); surf_alpha = surface->format->alpha; if(surf_flags & SDL_SRCALPHA) SDL_SetAlpha(surface, 0, SDL_ALPHA_OPAQUE); if(surf_flags & SDL_SRCCOLORKEY) SDL_SetColorKey(surface, 0, surface->format->colorkey); +#endif ss_rect.x = 0; ss_rect.y = 0; ss_rect.w = ss_w; ss_rect.h = ss_h; - SDL_BlitSurface(surface, &ss_rect, ss_surface, 0); + SDL_BlitSurface(surface, &ss_rect, ss_surface, NULL); if(ss_size == 0) { ss_size = ss_h; @@ -271,10 +291,13 @@ int SDL_savePNG(SDL_Surface* surface, const char* file) { return -1; } } +#if SDL_VERSION_ATLEAST(1,3,0) +#else if(surf_flags & SDL_SRCALPHA) SDL_SetAlpha(surface, SDL_SRCALPHA, (Uint8)surf_alpha); if(surf_flags & SDL_SRCCOLORKEY) SDL_SetColorKey(surface, SDL_SRCCOLORKEY, surface->format->colorkey); +#endif for(i = 0; i < ss_h; i++) ss_rows[i] = ((unsigned char*)ss_surface->pixels) + i * ss_surface->pitch; @@ -303,10 +326,12 @@ int SDL_savePNG(SDL_Surface* surface, const char* file) { */ SDL_Surface* gl_prepareSurface(SDL_Surface* surface) { SDL_Surface* tmp; - Uint32 saved_flags; - Uint8 saved_alpha; int potw, poth; SDL_Rect rtemp; +#if ! SDL_VERSION_ATLEAST(1,3,0) + Uint32 saved_flags; + Uint8 saved_alpha; +#endif /* Make size power of two. */ potw = gl_pot(surface->w); @@ -317,6 +342,13 @@ SDL_Surface* gl_prepareSurface(SDL_Surface* surface) { rtemp.h = surface->h; /* Save alpha. */ +#if SDL_VERSION_ATLEAST(1,3,0) + SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); + + /* Create the tmp POT surface. */ + tmp = SDL_CreateRGBSurface(0, potw, poth, + surface->format->BytesPerPixel*8, RGBAMASK); +#else saved_flags = surface->flags & (SDL_SRCALPHA | SDL_RLEACCELOK); saved_alpha = surface->format->alpha; if((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA) @@ -327,6 +359,8 @@ SDL_Surface* gl_prepareSurface(SDL_Surface* surface) { /* Create the temp POT surface. */ tmp = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, potw, poth, surface->format->BytesPerPixel*8, RGBAMASK); +#endif + if(tmp == NULL) { WARN("Unable to create POT surface: %s", SDL_GetError()); return 0; @@ -342,9 +376,11 @@ SDL_Surface* gl_prepareSurface(SDL_Surface* surface) { SDL_FreeSurface(surface); surface = tmp; +#if ! SDL_VERSION_ATLEAST(1,3,0) /* Set saved alpha. */ if((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA) SDL_SetAlpha(surface, 0, 0); +#endif return surface; } @@ -1063,7 +1099,11 @@ int gl_init(void) { SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, gl_screen.fsaa); } if(gl_has(OPENGL_VSYNC)) +#if SDL_VERSION_ATLEAST(1,3,0) + SDL_GL_SetSwapInterval(1); +#else SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); +#endif if(gl_has(OPENGL_FULLSCREEN)) { /* Try to use desktop resolution if nothing is specifically set. */