// (c) 1995-2014 by Artsoft Entertainment
// Holger Schemel
// info@artsoft.org
-// http://www.artsoft.org/
+// https://www.artsoft.org/
// ----------------------------------------------------------------------------
// sdl.c
// ============================================================================
#include "joystick.h"
#include "misc.h"
#include "setup.h"
+#include "gadgets.h"
#define ENABLE_UNUSED_CODE 0 // currently unused functions
#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)
#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 ((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;
}
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;
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;
}
{
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
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;
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);
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;
void SDLSetDisplaySize(void)
{
- SDL_Rect display_bounds;
+ if (sdl_renderer != NULL)
+ {
+ int w, h;
- SDL_GetDisplayBounds(0, &display_bounds);
+ SDL_GetRendererOutputSize(sdl_renderer, &w, &h);
- video.display_width = display_bounds.w;
- video.display_height = display_bounds.h;
+ video.display_width = w;
+ video.display_height = h;
#if 0
- Error(ERR_DEBUG, "SDL real screen size: %d x %d",
- video.display_width, video.display_height);
+ 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;
+
+#if 0
+ Error(ERR_DEBUG, "SDL display size: %d x %d",
+ video.display_width, video.display_height);
+#endif
+ }
}
void SDLSetScreenSizeAndOffsets(int width, int height)
void SDLSetScreenProperties(void)
{
+ SDLSetDisplaySize();
SDLSetScreenSizeAndOffsets(video.width, video.height);
SDLSetScreenSizeForRenderer(video.screen_width, video.screen_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;
// 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");
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
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)
{
DrawTouchInputOverlay_ShowGridButtons(alpha);
}
+
+static void DrawTouchGadgetsOverlay(void)
+{
+ DrawGadgets_OverlayTouchButtons();
+}
#endif