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
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
// 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,
return success;
}
-void SDLSetWindowTitle()
+void SDLSetWindowTitle(void)
{
#if defined(TARGET_SDL2)
if (sdl_window == NULL)
}
}
-void SDLSetDisplaySize()
+void SDLSetDisplaySize(void)
{
SDL_Rect display_bounds;
SDL_RenderSetLogicalSize(sdl_renderer, width, height);
}
-void SDLSetScreenProperties()
+void SDLSetScreenProperties(void)
{
SDLSetScreenSizeAndOffsets(video.width, video.height);
SDLSetScreenSizeForRenderer(video.screen_width, video.screen_height);
#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);
}
}
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;
/* 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)
{
}
}
-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;
*(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)
{
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))
{
}
}
-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)
{
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)
{
}
}
-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;
}
}
-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;
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;
}
}
-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;
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;
}
}
-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)
}
}
-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)
{
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;
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;
-----------------------------------------------------------------------------
*/
-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;
-----------------------------------------------------------------------------
*/
-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;
static int sdl_js_button[MAX_PLAYERS][2];
static boolean sdl_is_controller[MAX_PLAYERS];
-void SDLClearJoystickState()
+void SDLClearJoystickState(void)
{
int i, j;
}
}
-void SDLInitJoysticks()
+void SDLInitJoysticks(void)
{
static boolean sdl_joystick_subsystem_initialized = FALSE;
boolean print_warning = !sdl_joystick_subsystem_initialized;
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_max = SDL_ALPHA_OPAQUE / 2;
- static int alpha_step = 5;
static int alpha_direction = 0;
static int alpha_highlight = 0;
+ int alpha_max = ALPHA_FROM_TRANSPARENCY(setup.touch.transparency);
+ int alpha_step = ALPHA_FADING_STEPSIZE(alpha_max);
SDL_Rect rect;
int grid_xsize = overlay.grid_xsize;
int grid_ysize = overlay.grid_ysize;
{
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;
static boolean deactivated = TRUE;
static boolean show_grid = FALSE;
static int width = 0, height = 0;
- static int alpha_max = SDL_ALPHA_OPAQUE / 2;
- static int alpha_step = 5;
static int alpha_last = -1;
static int alpha = 0;
+ int alpha_max = ALPHA_FROM_TRANSPARENCY(setup.touch.transparency);
+ int alpha_step = ALPHA_FADING_STEPSIZE(alpha_max);
boolean active = (overlay.enabled && overlay.active);
if (!active && deactivated)