X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=0325c45f038383c8a5e971be60c59dd1d9930906;hb=41b805f296b21b950aa8372c2f1792bf301f4ef9;hp=794bad30a1f836748679d342b8914b2d1d9cc7d8;hpb=4cd59cef0737229da365e385a8762e681a5e471f;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index 794bad30..0325c45f 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -84,8 +84,8 @@ static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay) static int LastFrameCounter = 0; boolean changed = (FrameCounter != LastFrameCounter); - printf("::: FrameCounter == %d [%s]\n", FrameCounter, - (changed ? "-" : "SAME FRAME UPDATED")); + Debug("internal:frame", "FrameCounter == %d [%s]", FrameCounter, + (changed ? "-" : "SAME FRAME UPDATED")); LastFrameCounter = FrameCounter; @@ -297,6 +297,7 @@ static boolean equalSDLPixelFormat(SDL_PixelFormat *format1, format1->Bmask == format2->Bmask); } +#if 0 static Pixel SDLGetColorKey(SDL_Surface *surface) { Pixel color_key; @@ -306,10 +307,37 @@ static Pixel SDLGetColorKey(SDL_Surface *surface) return color_key; } +#endif + +static void SDLCopyColorKey(SDL_Surface *src_surface, SDL_Surface *dst_surface) +{ + Pixel color_key; + Uint8 r, g, b; + + // check if source surface has a color key + if (SDL_GetColorKey(src_surface, &color_key) == 0) + { + // get RGB values of color key of source surface + SDL_GetRGB(color_key, src_surface->format, &r, &g, &b); + + // get color key from RGB values in destination surface format + color_key = SDL_MapRGB(dst_surface->format, r, g, b); + + // set color key in destination surface + SDL_SetColorKey(dst_surface, SET_TRANSPARENT_PIXEL, color_key); + } + else + { + // unset color key in destination surface + SDL_SetColorKey(dst_surface, UNSET_TRANSPARENT_PIXEL, 0); + } +} static boolean SDLHasColorKey(SDL_Surface *surface) { - return (SDLGetColorKey(surface) != -1); + Pixel color_key; + + return (SDL_GetColorKey(surface, &color_key) == 0); } static boolean SDLHasAlpha(SDL_Surface *surface) @@ -360,12 +388,11 @@ SDL_Surface *SDLGetNativeSurface(SDL_Surface *surface) new_surface = SDL_ConvertSurface(surface, &format, 0); if (new_surface == NULL) - Error(ERR_EXIT, "SDL_ConvertSurface() failed: %s", SDL_GetError()); + Fail("SDL_ConvertSurface() failed: %s", SDL_GetError()); // workaround for a bug in SDL 2.0.12 (which does not convert the color key) if (SDLHasColorKey(surface) && !SDLHasColorKey(new_surface)) - SDL_SetColorKey(new_surface, SET_TRANSPARENT_PIXEL, - SDLGetColorKey(surface)); + SDLCopyColorKey(surface, new_surface); return new_surface; } @@ -401,8 +428,7 @@ static SDL_Texture *SDLCreateTextureFromSurface(SDL_Surface *surface) SDL_Texture *texture = SDL_CreateTextureFromSurface(sdl_renderer, surface); if (texture == NULL) - Error(ERR_EXIT, "SDL_CreateTextureFromSurface() failed: %s", - SDL_GetError()); + Fail("SDL_CreateTextureFromSurface() failed: %s", SDL_GetError()); return texture; } @@ -443,7 +469,7 @@ void SDLInitVideoDisplay(void) // initialize SDL video if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) - Error(ERR_EXIT, "SDL_InitSubSystem() failed: %s", SDL_GetError()); + Fail("SDL_InitSubSystem() failed: %s", SDL_GetError()); // set default SDL depth video.default_depth = 32; // (how to determine video depth in SDL2?) @@ -467,7 +493,7 @@ static void SDLInitVideoBuffer_VideoBuffer(boolean fullscreen) // open SDL video output device (window or fullscreen mode) if (!SDLSetVideoMode(fullscreen)) - Error(ERR_EXIT, "setting video mode failed"); + Fail("setting video mode failed"); // !!! SDL2 can only set the window icon if the window already exists !!! // set window icon @@ -913,7 +939,7 @@ void SDLCreateBitmapContent(Bitmap *bitmap, int width, int height, SDL_CreateRGBSurface(SURFACE_FLAGS, width, height, depth, 0,0,0, 0); if (surface == NULL) - Error(ERR_EXIT, "SDL_CreateRGBSurface() failed: %s", SDL_GetError()); + Fail("SDL_CreateRGBSurface() failed: %s", SDL_GetError()); SDLSetNativeSurface(&surface); @@ -2237,7 +2263,7 @@ static SDL_Surface *SDLGetOpaqueSurface(SDL_Surface *surface) return NULL; if ((new_surface = SDLGetNativeSurface(surface)) == NULL) - Error(ERR_EXIT, "SDLGetNativeSurface() failed"); + Fail("SDLGetNativeSurface() failed"); // remove alpha channel from native non-transparent surface, if defined SDLSetAlpha(new_surface, FALSE, 0); @@ -2268,8 +2294,7 @@ Bitmap *SDLZoomBitmap(Bitmap *src_bitmap, int dst_width, int dst_height) // set color key for zoomed surface from source surface, if defined if (SDLHasColorKey(src_surface)) - SDL_SetColorKey(dst_surface, SET_TRANSPARENT_PIXEL, - SDLGetColorKey(src_surface)); + SDLCopyColorKey(src_surface, dst_surface); // create native non-transparent surface for opaque blitting dst_bitmap->surface = SDLGetOpaqueSurface(dst_surface); @@ -2304,8 +2329,7 @@ Bitmap *SDLLoadImage(char *filename) // load image to temporary surface if ((sdl_image_tmp = IMG_Load(filename)) == NULL) - Error(ERR_EXIT, "IMG_Load('%s') failed: %s", getBaseNamePtr(filename), - SDL_GetError()); + Fail("IMG_Load('%s') failed: %s", getBaseNamePtr(filename), SDL_GetError()); print_timestamp_time("IMG_Load"); @@ -2313,7 +2337,7 @@ Bitmap *SDLLoadImage(char *filename) // create native non-transparent surface for current image if ((new_bitmap->surface = SDLGetOpaqueSurface(sdl_image_tmp)) == NULL) - Error(ERR_EXIT, "SDLGetOpaqueSurface() failed"); + Fail("SDLGetOpaqueSurface() failed"); print_timestamp_time("SDLGetNativeSurface (opaque)"); @@ -2327,7 +2351,7 @@ Bitmap *SDLLoadImage(char *filename) // create native transparent surface for current image if ((new_bitmap->surface_masked = SDLGetNativeSurface(sdl_image_tmp)) == NULL) - Error(ERR_EXIT, "SDLGetNativeSurface() failed"); + Fail("SDLGetNativeSurface() failed"); print_timestamp_time("SDLGetNativeSurface (masked)"); @@ -2707,11 +2731,7 @@ void SDLInitJoysticks(void) SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, "0"); if (SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER) < 0) - { - Error(ERR_EXIT, "SDL_Init() failed: %s", SDL_GetError()); - - return; - } + Fail("SDL_Init() failed: %s", SDL_GetError()); num_mappings = SDL_GameControllerAddMappingsFromFile(mappings_file_base);