X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=b03f01adab1a1bd3026f53ef1e8e8a234cd35905;hp=df5b32425fe870d6c0d9547b19bafdc5b5e1bdcd;hb=94b9816442fd27ab02bcef6f5d4aaf6740009fc5;hpb=22c1545e660b56b81728829aec43de128934ae04 diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index df5b3242..b03f01ad 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 @@ -663,6 +677,8 @@ static boolean SDLCreateScreen(boolean fullscreen) // SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, setup.window_scaling_quality); + SDLSetScreenVsyncMode(setup.vsync_mode); + sdl_texture_stream = SDL_CreateTexture(sdl_renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, @@ -829,7 +845,7 @@ boolean SDLSetVideoMode(boolean fullscreen) return success; } -void SDLSetWindowTitle() +void SDLSetWindowTitle(void) { #if defined(TARGET_SDL2) if (sdl_window == NULL) @@ -922,7 +938,7 @@ void SDLSetWindowFullscreen(boolean fullscreen) } } -void SDLSetDisplaySize() +void SDLSetDisplaySize(void) { SDL_Rect display_bounds; @@ -976,7 +992,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 +1015,22 @@ void SDLSetScreenRenderingMode(char *screen_rendering_mode) #endif } -void SDLRedrawWindow() +void SDLSetScreenVsyncMode(char *vsync_mode) +{ +#if defined(TARGET_SDL2) + int interval = + (strEqual(vsync_mode, STR_VSYNC_MODE_NORMAL) ? VSYNC_MODE_NORMAL : + strEqual(vsync_mode, STR_VSYNC_MODE_ADAPTIVE) ? VSYNC_MODE_ADAPTIVE : + VSYNC_MODE_OFF); + int result = SDL_GL_SetSwapInterval(interval); + + // if adaptive vsync requested, but not supported, retry with normal vsync + if (result == -1 && interval == VSYNC_MODE_ADAPTIVE) + SDL_GL_SetSwapInterval(VSYNC_MODE_NORMAL); +#endif +} + +void SDLRedrawWindow(void) { UpdateScreen_WithoutFrameDelay(NULL); } @@ -1389,20 +1420,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; @@ -1521,7 +1539,7 @@ Pixel SDLGetPixel(Bitmap *src_bitmap, int x, int y) /* http://www.etek.chalmers.se/~e8cal1/sge/index.html */ /* ========================================================================= */ -void _PutPixel(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) +static void _PutPixel(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) { if (x >= 0 && x <= surface->w - 1 && y >= 0 && y <= surface->h - 1) { @@ -1568,23 +1586,24 @@ void _PutPixel(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) } } -void _PutPixelRGB(SDL_Surface *surface, Sint16 x, Sint16 y, - Uint8 R, Uint8 G, Uint8 B) +#if 0 +static void _PutPixelRGB(SDL_Surface *surface, Sint16 x, Sint16 y, + Uint8 R, Uint8 G, Uint8 B) { _PutPixel(surface, x, y, SDL_MapRGB(surface->format, R, G, B)); } -void _PutPixel8(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) +static void _PutPixel8(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) { *((Uint8 *)surface->pixels + y*surface->pitch + x) = color; } -void _PutPixel16(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) +static void _PutPixel16(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) { *((Uint16 *)surface->pixels + y*surface->pitch/2 + x) = color; } -void _PutPixel24(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) +static void _PutPixel24(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) { Uint8 *pix; int shift; @@ -1599,12 +1618,12 @@ void _PutPixel24(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) *(pix+shift/8) = color>>shift; } -void _PutPixel32(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) +static void _PutPixel32(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) { *((Uint32 *)surface->pixels + y*surface->pitch/4 + x) = color; } -void _PutPixelX(SDL_Surface *dest,Sint16 x,Sint16 y,Uint32 color) +static void _PutPixelX(SDL_Surface *dest,Sint16 x,Sint16 y,Uint32 color) { switch (dest->format->BytesPerPixel) { @@ -1625,8 +1644,9 @@ void _PutPixelX(SDL_Surface *dest,Sint16 x,Sint16 y,Uint32 color) break; } } +#endif -void sge_PutPixel(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) +static void sge_PutPixel(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) { if (SDL_MUSTLOCK(surface)) { @@ -1644,13 +1664,14 @@ void sge_PutPixel(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) } } -void sge_PutPixelRGB(SDL_Surface *surface, Sint16 x, Sint16 y, - Uint8 r, Uint8 g, Uint8 b) +#if 0 +static void sge_PutPixelRGB(SDL_Surface *surface, Sint16 x, Sint16 y, + Uint8 r, Uint8 g, Uint8 b) { sge_PutPixel(surface, x, y, SDL_MapRGB(surface->format, r, g, b)); } -Sint32 sge_CalcYPitch(SDL_Surface *dest, Sint16 y) +static Sint32 sge_CalcYPitch(SDL_Surface *dest, Sint16 y) { if (y >= 0 && y <= dest->h - 1) { @@ -1677,7 +1698,8 @@ Sint32 sge_CalcYPitch(SDL_Surface *dest, Sint16 y) return -1; } -void sge_pPutPixel(SDL_Surface *surface, Sint16 x, Sint32 ypitch, Uint32 color) +static void sge_pPutPixel(SDL_Surface *surface, Sint16 x, Sint32 ypitch, + Uint32 color) { if (x >= 0 && x <= surface->w - 1 && ypitch >= 0) { @@ -1724,8 +1746,8 @@ void sge_pPutPixel(SDL_Surface *surface, Sint16 x, Sint32 ypitch, Uint32 color) } } -void sge_HLine(SDL_Surface *Surface, Sint16 x1, Sint16 x2, Sint16 y, - Uint32 Color) +static void sge_HLine(SDL_Surface *Surface, Sint16 x1, Sint16 x2, Sint16 y, + Uint32 Color) { SDL_Rect l; @@ -1765,13 +1787,14 @@ void sge_HLine(SDL_Surface *Surface, Sint16 x1, Sint16 x2, Sint16 y, } } -void sge_HLineRGB(SDL_Surface *Surface, Sint16 x1, Sint16 x2, Sint16 y, - Uint8 R, Uint8 G, Uint8 B) +static void sge_HLineRGB(SDL_Surface *Surface, Sint16 x1, Sint16 x2, Sint16 y, + Uint8 R, Uint8 G, Uint8 B) { sge_HLine(Surface, x1, x2, y, SDL_MapRGB(Surface->format, R, G, B)); } -void _HLine(SDL_Surface *Surface, Sint16 x1, Sint16 x2, Sint16 y, Uint32 Color) +static void _HLine(SDL_Surface *Surface, Sint16 x1, Sint16 x2, Sint16 y, + Uint32 Color) { SDL_Rect l; @@ -1798,8 +1821,8 @@ void _HLine(SDL_Surface *Surface, Sint16 x1, Sint16 x2, Sint16 y, Uint32 Color) SDL_FillRect(Surface, &l, Color); } -void sge_VLine(SDL_Surface *Surface, Sint16 x, Sint16 y1, Sint16 y2, - Uint32 Color) +static void sge_VLine(SDL_Surface *Surface, Sint16 x, Sint16 y1, Sint16 y2, + Uint32 Color) { SDL_Rect l; @@ -1839,13 +1862,14 @@ void sge_VLine(SDL_Surface *Surface, Sint16 x, Sint16 y1, Sint16 y2, } } -void sge_VLineRGB(SDL_Surface *Surface, Sint16 x, Sint16 y1, Sint16 y2, - Uint8 R, Uint8 G, Uint8 B) +static void sge_VLineRGB(SDL_Surface *Surface, Sint16 x, Sint16 y1, Sint16 y2, + Uint8 R, Uint8 G, Uint8 B) { sge_VLine(Surface, x, y1, y2, SDL_MapRGB(Surface->format, R, G, B)); } -void _VLine(SDL_Surface *Surface, Sint16 x, Sint16 y1, Sint16 y2, Uint32 Color) +static void _VLine(SDL_Surface *Surface, Sint16 x, Sint16 y1, Sint16 y2, + Uint32 Color) { SDL_Rect l; @@ -1871,11 +1895,12 @@ void _VLine(SDL_Surface *Surface, Sint16 x, Sint16 y1, Sint16 y2, Uint32 Color) SDL_FillRect(Surface, &l, Color); } +#endif -void sge_DoLine(SDL_Surface *Surface, Sint16 x1, Sint16 y1, - Sint16 x2, Sint16 y2, Uint32 Color, - void Callback(SDL_Surface *Surf, Sint16 X, Sint16 Y, - Uint32 Color)) +static void sge_DoLine(SDL_Surface *Surface, Sint16 x1, Sint16 y1, + Sint16 x2, Sint16 y2, Uint32 Color, + void Callback(SDL_Surface *Surf, Sint16 X, Sint16 Y, + Uint32 Color)) { Sint16 dx, dy, sdx, sdy, x, y, px, py; @@ -1927,14 +1952,16 @@ void sge_DoLine(SDL_Surface *Surface, Sint16 x1, Sint16 y1, } } -void sge_DoLineRGB(SDL_Surface *Surface, Sint16 X1, Sint16 Y1, - Sint16 X2, Sint16 Y2, Uint8 R, Uint8 G, Uint8 B, - void Callback(SDL_Surface *Surf, Sint16 X, Sint16 Y, - Uint32 Color)) +#if 0 +static void sge_DoLineRGB(SDL_Surface *Surface, Sint16 X1, Sint16 Y1, + Sint16 X2, Sint16 Y2, Uint8 R, Uint8 G, Uint8 B, + void Callback(SDL_Surface *Surf, Sint16 X, Sint16 Y, + Uint32 Color)) { sge_DoLine(Surface, X1, Y1, X2, Y2, SDL_MapRGB(Surface->format, R, G, B), Callback); } +#endif void sge_Line(SDL_Surface *Surface, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 Color) @@ -1955,11 +1982,13 @@ void sge_Line(SDL_Surface *Surface, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, } } -void sge_LineRGB(SDL_Surface *Surface, Sint16 x1, Sint16 y1, Sint16 x2, - Sint16 y2, Uint8 R, Uint8 G, Uint8 B) +#if 0 +static void sge_LineRGB(SDL_Surface *Surface, Sint16 x1, Sint16 y1, Sint16 x2, + Sint16 y2, Uint8 R, Uint8 G, Uint8 B) { sge_Line(Surface, x1, y1, x2, y2, SDL_MapRGB(Surface->format, R, G, B)); } +#endif void SDLPutPixel(Bitmap *dst_bitmap, int x, int y, Pixel pixel) { @@ -2030,7 +2059,7 @@ typedef struct Uint8 a; } tColorRGBA; -int zoomSurfaceRGBA_scaleDownBy2(SDL_Surface *src, SDL_Surface *dst) +static int zoomSurfaceRGBA_scaleDownBy2(SDL_Surface *src, SDL_Surface *dst) { int x, y; tColorRGBA *sp, *csp, *dp; @@ -2081,7 +2110,7 @@ int zoomSurfaceRGBA_scaleDownBy2(SDL_Surface *src, SDL_Surface *dst) return 0; } -int zoomSurfaceRGBA(SDL_Surface *src, SDL_Surface *dst) +static int zoomSurfaceRGBA(SDL_Surface *src, SDL_Surface *dst) { int x, y, *sax, *say, *csax, *csay; float sx, sy; @@ -2154,7 +2183,7 @@ int zoomSurfaceRGBA(SDL_Surface *src, SDL_Surface *dst) ----------------------------------------------------------------------------- */ -int zoomSurfaceY(SDL_Surface * src, SDL_Surface * dst) +static int zoomSurfaceY(SDL_Surface * src, SDL_Surface * dst) { Uint32 x, y, sx, sy, *sax, *say, *csax, *csay, csx, csy; Uint8 *sp, *dp, *csp; @@ -2254,7 +2283,7 @@ int zoomSurfaceY(SDL_Surface * src, SDL_Surface * dst) ----------------------------------------------------------------------------- */ -SDL_Surface *zoomSurface(SDL_Surface *src, int dst_width, int dst_height) +static SDL_Surface *zoomSurface(SDL_Surface *src, int dst_width, int dst_height) { SDL_Surface *zoom_src = NULL; SDL_Surface *zoom_dst = NULL; @@ -2606,7 +2635,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 +2876,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 +3041,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; @@ -3052,51 +3088,98 @@ 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; + + 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; rect.y = (y + 0) * video.screen_height / grid_ysize; rect.w = (x + 1) * video.screen_width / grid_xsize - rect.x; rect.h = (y + 1) * video.screen_height / grid_ysize - rect.y; - if (x == 0 || - overlay.grid_button[x - 1][y] != overlay.grid_button[x][y]) + 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] != overlay.grid_button[x][y]) + 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] != overlay.grid_button[x][y]) + 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] != overlay.grid_button[x][y]) + if (y == grid_ysize - 1 || overlay.grid_button[x][y + 1] != grid_button) { - rect.h -= 2; + rect.h -= border_size; + + outline_border |= MV_DOWN; } - if (overlay.grid_button[x][y] == overlay.grid_button_highlight) - SDL_SetRenderDrawColor(sdl_renderer, 255, 255, 255, alpha_highlight); - else - SDL_SetRenderDrawColor(sdl_renderer, 255, 255, 255, alpha); + 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 (overlay.grid_button[x][y] != CHAR_GRID_BUTTON_NONE) + 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;