X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=990054de955f965cab82e6c66936b1aaf63ac17f;hp=7fb650f1b17e9d6070db72855db59cf9c5e34c61;hb=b641818c787e48bbf03ce2a0cd5b542c4c21e523;hpb=368d771258ee3aed9c0713a0998094651eca2504 diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index 7fb650f1..990054de 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -4,7 +4,7 @@ // (c) 1995-2014 by Artsoft Entertainment // Holger Schemel // info@artsoft.org -// http://www.artsoft.org/ +// https://www.artsoft.org/ // ---------------------------------------------------------------------------- // sdl.c // ============================================================================ @@ -330,6 +330,15 @@ static void SDLSetAlpha(SDL_Surface *surface, boolean set, int alpha) SDL_SetSurfaceAlphaMod(surface, alpha); } +const char *SDLGetRendererName(void) +{ + static SDL_RendererInfo renderer_info; + + SDL_GetRendererInfo(sdl_renderer, &renderer_info); + + return renderer_info.name; +} + SDL_Surface *SDLGetNativeSurface(SDL_Surface *surface) { SDL_PixelFormat format; @@ -353,6 +362,11 @@ SDL_Surface *SDLGetNativeSurface(SDL_Surface *surface) if (new_surface == NULL) Error(ERR_EXIT, "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)); + return new_surface; } @@ -492,7 +506,7 @@ static boolean SDLCreateScreen(boolean fullscreen) { SDL_Surface *new_surface = NULL; - int surface_flags_window = SURFACE_FLAGS | SDL_WINDOW_RESIZABLE; + int surface_flags_window = SURFACE_FLAGS; int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN_DESKTOP; #if 1 @@ -505,8 +519,6 @@ static boolean SDLCreateScreen(boolean fullscreen) int renderer_flags = SDL_RENDERER_SOFTWARE; #endif - SDLSetScreenSizeAndOffsets(video.width, video.height); - int width = video.width; int height = video.height; int screen_width = video.screen_width; @@ -568,7 +580,6 @@ static boolean SDLCreateScreen(boolean fullscreen) if (sdl_renderer != NULL) { - SDL_RenderSetLogicalSize(sdl_renderer, screen_width, screen_height); // SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, setup.window_scaling_quality); @@ -608,6 +619,8 @@ static boolean SDLCreateScreen(boolean fullscreen) Error(ERR_WARN, "SDL_CreateWindow() failed: %s", SDL_GetError()); } + SDLSetScreenProperties(); + // store fullscreen state ("video.fullscreen_enabled" may not reflect this!) if (new_surface != NULL) fullscreen_enabled = fullscreen; @@ -762,17 +775,34 @@ void SDLSetWindowFullscreen(boolean fullscreen) void SDLSetDisplaySize(void) { - SDL_Rect display_bounds; + if (sdl_renderer != NULL) + { + int w, h; + + SDL_GetRendererOutputSize(sdl_renderer, &w, &h); + + video.display_width = w; + video.display_height = h; - SDL_GetDisplayBounds(0, &display_bounds); +#if 0 + Error(ERR_DEBUG, "SDL renderer size: %d x %d", + video.display_width, video.display_height); +#endif + } + else + { + SDL_Rect display_bounds; + + SDL_GetDisplayBounds(0, &display_bounds); - video.display_width = display_bounds.w; - video.display_height = display_bounds.h; + video.display_width = display_bounds.w; + video.display_height = display_bounds.h; #if 0 - Error(ERR_DEBUG, "SDL real screen size: %d x %d", - video.display_width, video.display_height); + Error(ERR_DEBUG, "SDL display size: %d x %d", + video.display_width, video.display_height); #endif + } } void SDLSetScreenSizeAndOffsets(int width, int height) @@ -816,6 +846,7 @@ void SDLSetScreenSizeForRenderer(int width, int height) void SDLSetScreenProperties(void) { + SDLSetDisplaySize(); SDLSetScreenSizeAndOffsets(video.width, video.height); SDLSetScreenSizeForRenderer(video.screen_width, video.screen_height); } @@ -1028,6 +1059,17 @@ void SDLFadeRectangle(int x, int y, int width, int height, time_current = SDL_GetTicks(); + if (fade_delay <= 0) + { + // immediately draw final target frame without delay + fade_mode &= (FADE_MODE_FADE | FADE_MODE_TRANSFORM); + fade_delay = 1; + time_current -= 1; + + // when fading without delay, also skip post delay + post_delay = 0; + } + if (fade_mode == FADE_MODE_MELT) { boolean done = FALSE; @@ -2524,7 +2566,10 @@ static void setJoystickButton(int nr, int button_id_raw, int button_state) void HandleJoystickEvent(Event *event) { - switch(event->type) + // when using joystick, disable overlay touch buttons + runtime.uses_touch_device = FALSE; + + switch (event->type) { case SDL_CONTROLLERDEVICEADDED: #if DEBUG_JOYSTICKS