X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=882aa11cd2647031bd972c5390e0796b1bc15cd2;hp=46d9abac9ea7aef6cb5d048c3f3f94ce86a1812f;hb=115ce6f2da1914d68b0fe0e5f9082973190dacdd;hpb=d93d679ebb98f8466d0d0a8231356da1e6d2d62b diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index 46d9abac..882aa11c 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -245,6 +245,20 @@ static void UpdateScreen_WithoutFrameDelay(SDL_Rect *rect) UpdateScreenExt(rect, FALSE); } +void Delay_WithScreenUpdates(unsigned int delay) +{ + unsigned int time_current = SDL_GetTicks(); + unsigned int time_delayed = time_current + delay; + + while (time_current < time_delayed) + { + // updating the screen contains waiting for frame delay (non-busy) + UpdateScreen_WithFrameDelay(NULL); + + time_current = SDL_GetTicks(); + } +} + static void SDLSetWindowIcon(char *basename) { /* (setting the window icon on Mac OS X would replace the high-quality @@ -541,7 +555,7 @@ inline static void SDLInitVideoBuffer_VideoBuffer(boolean fullscreen) SDLSetWindowTitle(); } -inline static void SDLInitVideoBuffer_DrawBuffer() +inline static void SDLInitVideoBuffer_DrawBuffer(void) { /* SDL cannot directly draw to the visible video framebuffer like X11, but always uses a backbuffer, which is then blitted to the visible @@ -829,7 +843,7 @@ boolean SDLSetVideoMode(boolean fullscreen) return success; } -void SDLSetWindowTitle() +void SDLSetWindowTitle(void) { #if defined(TARGET_SDL2) if (sdl_window == NULL) @@ -922,7 +936,7 @@ void SDLSetWindowFullscreen(boolean fullscreen) } } -void SDLSetDisplaySize() +void SDLSetDisplaySize(void) { SDL_Rect display_bounds; @@ -976,7 +990,7 @@ void SDLSetScreenSizeForRenderer(int width, int height) SDL_RenderSetLogicalSize(sdl_renderer, width, height); } -void SDLSetScreenProperties() +void SDLSetScreenProperties(void) { SDLSetScreenSizeAndOffsets(video.width, video.height); SDLSetScreenSizeForRenderer(video.screen_width, video.screen_height); @@ -999,7 +1013,7 @@ void SDLSetScreenRenderingMode(char *screen_rendering_mode) #endif } -void SDLRedrawWindow() +void SDLRedrawWindow(void) { UpdateScreen_WithoutFrameDelay(NULL); } @@ -1389,20 +1403,7 @@ void SDLFadeRectangle(int x, int y, int width, int height, } if (post_delay > 0) - { - unsigned int time_post_delay; - - time_current = SDL_GetTicks(); - time_post_delay = time_current + post_delay; - - while (time_current < time_post_delay) - { - // updating the screen contains waiting for frame delay (non-busy) - UpdateScreen_WithFrameDelay(NULL); - - time_current = SDL_GetTicks(); - } - } + Delay_WithScreenUpdates(post_delay); // restore function for drawing global masked border gfx.draw_global_border_function = draw_global_border_function; @@ -2606,7 +2607,7 @@ static int sdl_js_axis[MAX_PLAYERS][2]; static int sdl_js_button[MAX_PLAYERS][2]; static boolean sdl_is_controller[MAX_PLAYERS]; -void SDLClearJoystickState() +void SDLClearJoystickState(void) { int i, j; @@ -2847,7 +2848,7 @@ void HandleJoystickEvent(Event *event) } } -void SDLInitJoysticks() +void SDLInitJoysticks(void) { static boolean sdl_joystick_subsystem_initialized = FALSE; boolean print_warning = !sdl_joystick_subsystem_initialized; @@ -3012,6 +3013,13 @@ static void DrawTouchInputOverlay_ShowGrid(int alpha) SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, 255); } +static void RenderFillRectangle(int x, int y, int width, int height) +{ + SDL_Rect rect = { x, y, width, height }; + + SDL_RenderFillRect(sdl_renderer, &rect); +} + static void DrawTouchInputOverlay_ShowGridButtons(int alpha) { static int alpha_direction = 0; @@ -3053,7 +3061,12 @@ static void DrawTouchInputOverlay_ShowGridButtons(int alpha) for (y = 0; y < grid_ysize; y++) { int grid_button = overlay.grid_button[x][y]; + int grid_button_action = GET_ACTION_FROM_GRID_BUTTON(grid_button); int alpha_draw = alpha; + int outline_border = MV_NONE; + int border_size = 2; + boolean draw_outlined = setup.touch.draw_outlined; + boolean draw_pressed = setup.touch.draw_pressed; if (grid_button == CHAR_GRID_BUTTON_NONE) continue; @@ -3061,6 +3074,14 @@ static void DrawTouchInputOverlay_ShowGridButtons(int alpha) if (grid_button == overlay.grid_button_highlight) alpha_draw = alpha_highlight; + if (draw_pressed && overlay.grid_button_action & grid_button_action) + { + if (draw_outlined) + draw_outlined = FALSE; + else + alpha_draw = MIN((float)alpha_draw * 1.5, SDL_ALPHA_OPAQUE); + } + SDL_SetRenderDrawColor(sdl_renderer, 255, 255, 255, alpha_draw); rect.x = (x + 0) * video.screen_width / grid_xsize; @@ -3070,34 +3091,67 @@ static void DrawTouchInputOverlay_ShowGridButtons(int alpha) if (x == 0 || overlay.grid_button[x - 1][y] != grid_button) { - rect.x += 2; - rect.w -= 2; + rect.x += border_size; + rect.w -= border_size; + + outline_border |= MV_LEFT; } if (x == grid_xsize - 1 || overlay.grid_button[x + 1][y] != grid_button) { - rect.w -= 2; + rect.w -= border_size; + + outline_border |= MV_RIGHT; } if (y == 0 || overlay.grid_button[x][y - 1] != grid_button) { - rect.y += 2; - rect.h -= 2; + rect.y += border_size; + rect.h -= border_size; + + outline_border |= MV_UP; } if (y == grid_ysize - 1 || overlay.grid_button[x][y + 1] != grid_button) { - rect.h -= 2; + rect.h -= border_size; + + outline_border |= MV_DOWN; } - SDL_RenderFillRect(sdl_renderer, &rect); + if (draw_outlined) + { + int rect_x = rect.x + + (outline_border & MV_LEFT ? border_size : 0); + int rect_w = rect.w - + (outline_border & MV_LEFT ? border_size : 0) - + (outline_border & MV_RIGHT ? border_size : 0); + + if (outline_border & MV_LEFT) + RenderFillRectangle(rect.x, rect.y, border_size, rect.h); + + if (outline_border & MV_RIGHT) + RenderFillRectangle(rect.x + rect.w - border_size, rect.y, + border_size, rect.h); + + if (outline_border & MV_UP) + RenderFillRectangle(rect_x, rect.y, rect_w, border_size); + + if (outline_border & MV_DOWN) + RenderFillRectangle(rect_x, rect.y + rect.h - border_size, + rect_w, border_size); + } + else + { + SDL_RenderFillRect(sdl_renderer, &rect); + } } } SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, 255); } -static void DrawTouchInputOverlay() +static void DrawTouchInputOverlay(void) { static SDL_Texture *texture = NULL; static boolean initialized = FALSE;