X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=5be4c0dc173c9ea57455fcba7a3046eb8b88af36;hb=c8689f0335cd584d24570046c6eb5a3b75701305;hp=a66049e97e0175cf9fef962ff2518d0d7a658ee2;hpb=7bcc6aa833d64b21f78793dd00ed4c1356b98d05;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index a66049e9..5be4c0dc 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -151,6 +151,9 @@ static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay) dst_rect1 = &dst_rect_screen; #if defined(HAS_SCREEN_KEYBOARD) + SDL_Rect src_rect_up = { 0, 0, video.width, video.height }; + SDL_Rect dst_rect_up = dst_rect_screen; + if (video.shifted_up || video.shifted_up_delay) { int time_current = SDL_GetTicks(); @@ -171,8 +174,9 @@ static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay) video.shifted_up_delay = 0; } - SDL_Rect src_rect_up = { 0, pos, video.width, video.height - pos }; - SDL_Rect dst_rect_up = { xoff, yoff, video.width, video.height - pos }; + src_rect_up.y = pos; + src_rect_up.h = video.height - pos; + dst_rect_up.h = video.height - pos; if (video.screen_rendering_mode == SPECIAL_RENDERING_TARGET || video.screen_rendering_mode == SPECIAL_RENDERING_DOUBLE) @@ -260,7 +264,7 @@ static void SDLSetWindowIcon(char *basename) // (setting the window icon on Mac OS X would replace the high-quality // dock icon with the currently smaller (and uglier) icon from file) -#if !defined(PLATFORM_MACOSX) +#if !defined(PLATFORM_MAC) char *filename = getCustomImageFilename(basename); SDL_Surface *surface; @@ -297,19 +301,35 @@ static boolean equalSDLPixelFormat(SDL_PixelFormat *format1, format1->Bmask == format2->Bmask); } -static Pixel SDLGetColorKey(SDL_Surface *surface) +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); - if (SDL_GetColorKey(surface, &color_key) != 0) - return -1; + // get color key from RGB values in destination surface format + color_key = SDL_MapRGB(dst_surface->format, r, g, b); - return color_key; + // 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) @@ -322,7 +342,7 @@ static boolean SDLHasAlpha(SDL_Surface *surface) return (blend_mode == SDL_BLENDMODE_BLEND); } -static void SDLSetAlpha(SDL_Surface *surface, boolean set, int alpha) +void SDLSetAlpha(SDL_Surface *surface, boolean set, int alpha) { SDL_BlendMode blend_mode = (set ? SDL_BLENDMODE_BLEND : SDL_BLENDMODE_NONE); @@ -364,8 +384,7 @@ SDL_Surface *SDLGetNativeSurface(SDL_Surface *surface) // 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; } @@ -861,6 +880,8 @@ void SDLSetScreenProperties(void) SDLSetDisplaySize(); SDLSetScreenSizeAndOffsets(video.width, video.height); SDLSetScreenSizeForRenderer(video.screen_width, video.screen_height); + + SetOverlayGridSizeAndButtons(); } void SDLSetScreenRenderingMode(char *screen_rendering_mode) @@ -1208,6 +1229,9 @@ void SDLFadeRectangle(int x, int y, int width, int height, draw_border_function(); UpdateScreen_WithFrameDelay(&dst_rect2); + + if (PendingEscapeKeyEvent()) + break; } } } @@ -1264,6 +1288,9 @@ void SDLFadeRectangle(int x, int y, int width, int height, // only update the region of the screen that is affected from fading UpdateScreen_WithFrameDelay(&dst_rect2); + + if (PendingEscapeKeyEvent()) + break; } } else // fading in, fading out or cross-fading @@ -1290,6 +1317,9 @@ void SDLFadeRectangle(int x, int y, int width, int height, // only update the region of the screen that is affected from fading UpdateScreen_WithFrameDelay(&dst_rect); + + if (PendingEscapeKeyEvent()) + break; } } @@ -2267,8 +2297,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); @@ -2693,7 +2722,7 @@ void SDLInitJoysticks(void) boolean print_warning = !sdl_joystick_subsystem_initialized; char *mappings_file_base = getPath2(options.conf_directory, GAMECONTROLLER_BASENAME); - char *mappings_file_user = getPath2(getUserGameDataDir(), + char *mappings_file_user = getPath2(getMainUserGameDataDir(), GAMECONTROLLER_BASENAME); int num_mappings; int i;