static int fullscreen_yoffset;
static int video_xoffset;
static int video_yoffset;
+static boolean limit_screen_updates = FALSE;
+
/* functions from SGE library */
void sge_Line(SDL_Surface *, Sint16, Sint16, Sint16, Sint16, Uint32);
-#if defined(TARGET_SDL2)
+void SDLLimitScreenUpdates(boolean enable)
+{
+ limit_screen_updates = enable;
+}
+
static void UpdateScreen(SDL_Rect *rect)
{
+ static unsigned int update_screen_delay = 0;
+ unsigned int update_screen_delay_value = 100; /* (milliseconds) */
+
+#if 1
+ if (limit_screen_updates &&
+ !DelayReached(&update_screen_delay, update_screen_delay_value))
+ return;
+
+ LimitScreenUpdates(FALSE);
+#endif
+
+#if defined(TARGET_SDL2)
#if USE_RENDERER
SDL_Surface *screen = backbuffer->surface;
else
SDL_UpdateWindowSurface(sdl_window);
#endif
-}
+
+#else // TARGET_SDL
+ if (rect)
+ SDL_UpdateRects(backbuffer->surface, 1, rect);
+ else
+ SDL_UpdateRect(backbuffer->surface, 0, 0, 0, 0);
#endif
+}
static void setFullscreenParameters(char *fullscreen_mode_string)
{
boolean fullscreen)
{
SDL_Surface *new_surface = NULL;
- static boolean fullscreen_enabled = FALSE;
#if defined(TARGET_SDL2)
+ static boolean fullscreen_enabled = FALSE;
int surface_flags_window = SURFACE_FLAGS | SDL_WINDOW_RESIZABLE;
#if USE_DESKTOP_FULLSCREEN
int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN_DESKTOP;
// store if initial screen mode on game start is fullscreen mode
if (sdl_window == NULL)
{
+#if 0
printf("::: GAME STARTS WITH FULLSCREEN %d\n", fullscreen);
+#endif
video.fullscreen_initial = fullscreen;
}
#if USE_RENDERER
float window_scaling_factor = (float)setup.window_scaling_percent / 100;
+#if !USE_DESKTOP_FULLSCREEN
float screen_scaling_factor = (fullscreen ? 1 : window_scaling_factor);
+#endif
video.window_width = window_scaling_factor * width;
video.window_height = window_scaling_factor * height;
-#if 1
+#if 0
printf("::: use window scaling factor %f\n", screen_scaling_factor);
#endif
new_surface = SDL_SetVideoMode(width, height, video.depth, surface_flags);
#endif
+#if defined(TARGET_SDL2)
// store fullscreen state ("video.fullscreen_enabled" may not reflect this!)
if (new_surface != NULL)
fullscreen_enabled = fullscreen;
+#endif
return new_surface;
}
int new_window_width = (int)(window_scaling_factor * video.width);
int new_window_height = (int)(window_scaling_factor * video.height);
+#if 0
Error(ERR_DEBUG, "::: SDLSetWindowScaling(%d) ...", window_scaling_percent);
+#endif
SDL_SetWindowSize(sdl_window, new_window_width, new_window_height);
int flags = (fullscreen ? SDL_WINDOW_FULLSCREEN : 0);
#endif
+#if 0
Error(ERR_DEBUG, "::: SDL_SetWindowFullscreen(%d) ...", fullscreen);
+#endif
if (SDL_SetWindowFullscreen(sdl_window, flags) == 0)
video.fullscreen_enabled = fullscreen;
+#if 0
printf("::: SDLSetWindowFullscreen: %d, %d\n",
fullscreen, video.fullscreen_initial);
+#endif
#if 1
// if game started in fullscreen mode, window will also get fullscreen size
}
#else
if (dst_bitmap == window)
- SDL_UpdateRect(backbuffer->surface, dst_x, dst_y, width, height);
+ {
+ // SDL_UpdateRect(backbuffer->surface, dst_x, dst_y, width, height);
+ UpdateScreen(&dst_rect);
+ }
#endif
}
}
#else
if (dst_bitmap == window)
- SDL_UpdateRect(backbuffer->surface, x, y, width, height);
+ {
+ // SDL_UpdateRect(backbuffer->surface, x, y, width, height);
+ UpdateScreen(&rect);
+ }
#endif
}
SDL_Surface *surface_screen = backbuffer->surface;
SDL_Surface *surface_cross = (bitmap_cross ? bitmap_cross->surface : NULL);
SDL_Rect src_rect, dst_rect;
-#if defined(TARGET_SDL2)
SDL_Rect dst_rect2;
-#endif
int src_x = x, src_y = y;
int dst_x = x, dst_y = y;
unsigned int time_last, time_current;
dst_rect.w = width; /* (ignored) */
dst_rect.h = height; /* (ignored) */
-#if defined(TARGET_SDL2)
dst_rect2 = dst_rect;
-#endif
if (initialization_needed)
{
// SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect2, 1);
UpdateScreen(&dst_rect2);
#else
- SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
+ // SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
+ UpdateScreen(&dst_rect2);
#endif
}
}
// SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect, 1);
UpdateScreen(&dst_rect);
#else
- SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
+ // SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
+ UpdateScreen(&dst_rect);
#endif
#else
SDL_Flip(surface_screen);