X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=d271951eb5dc84cdab120c47ce9d30510012f7c9;hb=b844b9ff4b1c79c5789cdae0a90deacb88d0887a;hp=4bd1987331b2a0d342f85c35ed666c2b5468fa33;hpb=75cfa2cbbb354fdd2bb3118c9cc9d130c7485ddb;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index 4bd19873..d271951e 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -14,6 +14,7 @@ #include "joystick.h" #include "misc.h" #include "setup.h" +#include "gadgets.h" #define ENABLE_UNUSED_CODE 0 // currently unused functions @@ -39,6 +40,7 @@ void sge_Line(SDL_Surface *, Sint16, Sint16, Sint16, Sint16, Uint32); #if defined(USE_TOUCH_INPUT_OVERLAY) // functions to draw overlay graphics for touch device input static void DrawTouchInputOverlay(void); +static void DrawTouchGadgetsOverlay(void); #endif void SDLLimitScreenUpdates(boolean enable) @@ -212,18 +214,25 @@ static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay) #if defined(USE_TOUCH_INPUT_OVERLAY) // draw overlay graphics for touch device input, if needed DrawTouchInputOverlay(); + + // draw overlay gadgets for touch device input, if needed + DrawTouchGadgetsOverlay(); #endif // global synchronization point of the game to align video frame delay if (with_frame_delay) WaitUntilDelayReached(&video.frame_delay, video.frame_delay_value); + video.frame_counter++; + // show render target buffer on screen SDL_RenderPresent(sdl_renderer); } static void UpdateScreen_WithFrameDelay(SDL_Rect *rect) { + PumpEvents(); // execute event filter actions while waiting + UpdateScreenExt(rect, TRUE); } @@ -264,7 +273,7 @@ static void SDLSetWindowIcon(char *basename) if ((surface = IMG_Load(filename)) == NULL) { - Error(ERR_WARN, "IMG_Load() failed: %s", SDL_GetError()); + Error(ERR_WARN, "IMG_Load('%s') failed: %s", basename, SDL_GetError()); return; } @@ -344,6 +353,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; } @@ -1019,6 +1033,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; @@ -2230,7 +2255,8 @@ Bitmap *SDLLoadImage(char *filename) // load image to temporary surface if ((sdl_image_tmp = IMG_Load(filename)) == NULL) - Error(ERR_EXIT, "IMG_Load() failed: %s", SDL_GetError()); + Error(ERR_EXIT, "IMG_Load('%s') failed: %s", getBaseNamePtr(filename), + SDL_GetError()); print_timestamp_time("IMG_Load"); @@ -2362,6 +2388,27 @@ void SDLWaitEvent(Event *event) SDL_WaitEvent(event); } +void SDLCorrectRawMousePosition(int *x, int *y) +{ + if (sdl_renderer == NULL) + return; + + // this corrects the raw mouse position for logical screen size within event + // filters (correction done later by SDL library when handling mouse events) + + SDL_Rect viewport; + float scale_x, scale_y; + + SDL_RenderGetViewport(sdl_renderer, &viewport); + SDL_RenderGetScale(sdl_renderer, &scale_x, &scale_y); + + *x = (int)(*x / scale_x); + *y = (int)(*y / scale_y); + + *x -= viewport.x; + *y -= viewport.y; +} + // ============================================================================ // joystick functions @@ -2493,7 +2540,7 @@ static void setJoystickButton(int nr, int button_id_raw, int button_state) void HandleJoystickEvent(Event *event) { - switch(event->type) + switch (event->type) { case SDL_CONTROLLERDEVICEADDED: #if DEBUG_JOYSTICKS @@ -2804,7 +2851,10 @@ static void DrawTouchInputOverlay_ShowGridButtons(int alpha) continue; if (grid_button == overlay.grid_button_highlight) - alpha_draw = alpha_highlight; + { + draw_outlined = FALSE; + alpha_draw = MIN((float)alpha_highlight * 1.5, SDL_ALPHA_OPAQUE); + } if (draw_pressed && overlay.grid_button_action & grid_button_action) { @@ -2920,4 +2970,9 @@ static void DrawTouchInputOverlay(void) DrawTouchInputOverlay_ShowGridButtons(alpha); } + +static void DrawTouchGadgetsOverlay(void) +{ + DrawGadgets_OverlayTouchButtons(); +} #endif