#include "misc.h"
#include "setup.h"
+#define ENABLE_UNUSED_CODE 0 /* currently unused functions */
-#if defined(TARGET_SDL)
/* ========================================================================= */
/* video functions */
static SDL_Window *sdl_window = NULL;
static SDL_Renderer *sdl_renderer = NULL;
static SDL_Texture *sdl_texture = NULL;
+static boolean fullscreen_enabled = FALSE;
#define USE_RENDERER TRUE
#endif
{
static unsigned int update_screen_delay = 0;
unsigned int update_screen_delay_value = 20; /* (milliseconds) */
+ SDL_Surface *screen = backbuffer->surface;
-#if 1
if (limit_screen_updates &&
!DelayReached(&update_screen_delay, update_screen_delay_value))
return;
LimitScreenUpdates(FALSE);
+
+#if 0
+ {
+ static int LastFrameCounter = 0;
+ boolean changed = (FrameCounter != LastFrameCounter);
+
+ printf("::: FrameCounter == %d [%s]\n", FrameCounter,
+ (changed ? "-" : "SAME FRAME UPDATED"));
+
+ LastFrameCounter = FrameCounter;
+
+ /*
+ if (FrameCounter % 2)
+ return;
+ */
+ }
+#endif
+
+#if USE_FINAL_SCREEN_BITMAP
+ if (gfx.final_screen_bitmap != NULL) // may not be initialized yet
+ {
+ // !!! TEST !!!
+ // draw global animations using bitmaps instead of using textures
+ // to prevent texture scaling artefacts (this is potentially slower)
+
+ BlitBitmap(backbuffer, gfx.final_screen_bitmap, 0, 0,
+ gfx.win_xsize, gfx.win_ysize, 0, 0);
+
+ // copy global animations to render target buffer, if defined (below border)
+ if (gfx.draw_global_anim_function != NULL)
+ gfx.draw_global_anim_function(DRAW_GLOBAL_ANIM_STAGE_1);
+
+ // copy global masked border to render target buffer, if defined
+ if (gfx.draw_global_border_function != NULL)
+ gfx.draw_global_border_function(REDRAW_ALL);
+
+ // copy global animations to render target buffer, if defined (above border)
+ if (gfx.draw_global_anim_function != NULL)
+ gfx.draw_global_anim_function(DRAW_GLOBAL_ANIM_STAGE_2);
+
+ screen = gfx.final_screen_bitmap->surface;
+
+ // force full window redraw
+ rect = NULL;
+ }
#endif
#if defined(TARGET_SDL2)
#if USE_RENDERER
- SDL_Surface *screen = backbuffer->surface;
-
-#if 1
if (rect)
{
int bytes_x = screen->pitch / video.width;
{
SDL_UpdateTexture(sdl_texture, NULL, screen->pixels, screen->pitch);
}
-#else
- SDL_UpdateTexture(sdl_texture, NULL, screen->pixels, screen->pitch);
-#endif
+
+ // clear render target buffer
SDL_RenderClear(sdl_renderer);
+
+ // copy backbuffer to render target buffer
SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL);
+
+#if !USE_FINAL_SCREEN_BITMAP
+ // copy global animations to render target buffer, if defined (below border)
+ if (gfx.draw_global_anim_function != NULL)
+ gfx.draw_global_anim_function(DRAW_GLOBAL_ANIM_STAGE_1);
+
+ // copy global masked border to render target buffer, if defined
+ if (gfx.draw_global_border_function != NULL)
+ gfx.draw_global_border_function(REDRAW_ALL);
+
+ // copy global animations to render target buffer, if defined (above border)
+ if (gfx.draw_global_anim_function != NULL)
+ gfx.draw_global_anim_function(DRAW_GLOBAL_ANIM_STAGE_2);
+#endif
+
+ // show render target buffer on screen
SDL_RenderPresent(sdl_renderer);
+
#else
+
if (rect)
SDL_UpdateWindowSurfaceRects(sdl_window, rect, 1);
else
#else // TARGET_SDL
if (rect)
- SDL_UpdateRects(backbuffer->surface, 1, rect);
+ SDL_UpdateRects(screen, 1, rect);
else
- SDL_UpdateRect(backbuffer->surface, 0, 0, 0, 0);
+ SDL_UpdateRect(screen, 0, 0, 0, 0);
#endif
}
new_surface = SDL_ConvertSurface(*surface, backbuffer->surface->format, 0);
+ if (new_surface == NULL)
+ Error(ERR_EXIT, "SDL_ConvertSurface() failed: %s", SDL_GetError());
+
SDL_FreeSurface(*surface);
*surface = new_surface;
SDL_Surface *SDLGetNativeSurface(SDL_Surface *surface)
{
- if (surface == NULL ||
- backbuffer == NULL ||
- backbuffer->surface == NULL)
- return NULL;
-
- return SDL_ConvertSurface(surface, backbuffer->surface->format, 0);
-}
+ SDL_Surface *new_surface;
-SDL_Surface *SDL_DisplayFormat(SDL_Surface *surface)
-{
- if (surface == NULL ||
- backbuffer == NULL ||
- backbuffer->surface == NULL)
+ if (surface == NULL)
return NULL;
-#if 0
- boolean same_pixel_format =
- equalSDLPixelFormat(surface->format, backbuffer->surface->format);
-
- printf("::: SDL_DisplayFormat: %08x -> %08x [%08x, %08x, %08x -> %08x, %08x, %08x] [%d, %d -> %d, %d] => %s\n",
- surface->format->format,
- backbuffer->surface->format->format,
- surface->format->Rmask,
- surface->format->Gmask,
- surface->format->Bmask,
- backbuffer->surface->format->Rmask,
- backbuffer->surface->format->Gmask,
- backbuffer->surface->format->Bmask,
- surface->format->BitsPerPixel,
- surface->format->BytesPerPixel,
- backbuffer->surface->format->BitsPerPixel,
- backbuffer->surface->format->BytesPerPixel,
- (same_pixel_format ? "SAME" : "DIFF"));
-#endif
+ if (backbuffer && backbuffer->surface)
+ new_surface = SDL_ConvertSurface(surface, backbuffer->surface->format, 0);
+ else
+ new_surface = SDL_ConvertSurface(surface, surface->format, 0);
+
+ if (new_surface == NULL)
+ Error(ERR_EXIT, "SDL_ConvertSurface() failed: %s", SDL_GetError());
- return SDL_ConvertSurface(surface, backbuffer->surface->format, 0);
+ return new_surface;
}
#else
{
SDL_Surface *new_surface;
- if (surface == NULL)
+ if (surface == NULL ||
+ *surface == NULL ||
+ !video.initialized)
return FALSE;
new_surface = SDL_DisplayFormat(*surface);
SDL_Surface *SDLGetNativeSurface(SDL_Surface *surface)
{
- SDL_Surface *new_surface = SDL_DisplayFormat(surface);
+ SDL_Surface *new_surface;
+
+ if (video.initialized)
+ new_surface = SDL_DisplayFormat(surface);
+ else
+ new_surface = SDL_ConvertSurface(surface, surface->format, SURFACE_FLAGS);
if (new_surface == NULL)
- Error(ERR_EXIT, "SDL_DisplayFormat() failed: %s", SDL_GetError());
+ Error(ERR_EXIT, "%s() failed: %s",
+ (video.initialized ? "SDL_DisplayFormat" : "SDL_ConvertSurface"),
+ SDL_GetError());
return new_surface;
}
#endif
+#if defined(TARGET_SDL2)
+static SDL_Texture *SDLCreateTextureFromSurface(SDL_Surface *surface)
+{
+ SDL_Texture *texture = SDL_CreateTextureFromSurface(sdl_renderer, surface);
+
+ if (texture == NULL)
+ Error(ERR_EXIT, "SDL_CreateTextureFromSurface() failed: %s",
+ SDL_GetError());
+
+ return texture;
+}
+#endif
+
+void SDLCreateBitmapTextures(Bitmap *bitmap)
+{
+#if defined(TARGET_SDL2)
+ if (bitmap == NULL)
+ return;
+
+ if (bitmap->texture)
+ SDL_DestroyTexture(bitmap->texture);
+ if (bitmap->texture_masked)
+ SDL_DestroyTexture(bitmap->texture_masked);
+
+ bitmap->texture = SDLCreateTextureFromSurface(bitmap->surface);
+ bitmap->texture_masked = SDLCreateTextureFromSurface(bitmap->surface_masked);
+#endif
+}
+
+void SDLFreeBitmapTextures(Bitmap *bitmap)
+{
+#if defined(TARGET_SDL2)
+ if (bitmap == NULL)
+ return;
+
+ if (bitmap->texture)
+ SDL_DestroyTexture(bitmap->texture);
+ if (bitmap->texture_masked)
+ SDL_DestroyTexture(bitmap->texture_masked);
+
+ bitmap->texture = NULL;
+ bitmap->texture_masked = NULL;
+#endif
+}
+
void SDLInitVideoDisplay(void)
{
#if !defined(TARGET_SDL2)
fullscreen_yoffset = (fullscreen_height - video.height) / 2;
#endif
-#if 1
checked_free(video.fullscreen_modes);
video.fullscreen_modes = NULL;
video.fullscreen_mode_current = NULL;
-#endif
video.window_scaling_percent = setup.window_scaling_percent;
video.window_scaling_quality = setup.window_scaling_quality;
}
#endif
-#if 0
- /* set window icon */
- SDLSetWindowIcon(program.sdl_icon_filename);
-#endif
-
/* open SDL video output device (window or fullscreen mode) */
if (!SDLSetVideoMode(backbuffer, fullscreen))
Error(ERR_EXIT, "setting video mode failed");
-#if 1
/* !!! SDL2 can only set the window icon if the window already exists !!! */
/* set window icon */
- SDLSetWindowIcon(program.sdl_icon_filename);
-#endif
+ SDLSetWindowIcon(program.icon_filename);
/* set window and icon title */
#if defined(TARGET_SDL2)
should never be drawn to directly, it would do no harm nevertheless. */
/* create additional (symbolic) buffer for double-buffering */
-#if 1
ReCreateBitmap(window, video.width, video.height, video.depth);
-#else
- *window = CreateBitmap(video.width, video.height, video.depth);
-#endif
}
static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer,
SDL_Surface *new_surface = NULL;
#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;
#if defined(TARGET_SDL2)
- // 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;
- }
+ // store if initial screen mode is fullscreen mode when changing screen size
+ video.fullscreen_initial = fullscreen;
#if USE_RENDERER
float window_scaling_factor = (float)setup.window_scaling_percent / 100;
video.window_width = window_scaling_factor * width;
video.window_height = window_scaling_factor * height;
-#if 0
- printf("::: use window scaling factor %f\n", screen_scaling_factor);
-#endif
-
if ((*backbuffer)->surface)
{
SDL_FreeSurface((*backbuffer)->surface);
}
}
-#if 0
- Error(ERR_INFO, "::: checking 'sdl_window' ...");
-
- if (sdl_window == NULL)
- Error(ERR_INFO, "::: calling SDL_CreateWindow() [%d, %d, %d] ...",
- setup.fullscreen, fullscreen, fullscreen_enabled);
-#endif
-
if (sdl_window == NULL)
sdl_window = SDL_CreateWindow(program.window_title,
SDL_WINDOWPOS_CENTERED,
if (sdl_texture != NULL)
{
-#if 1
// use SDL default values for RGB masks and no alpha channel
new_surface = SDL_CreateRGBSurface(0, width, height, 32, 0,0,0, 0);
-#else
-
-#if 1
- // (do not use alpha channel)
- new_surface = SDL_CreateRGBSurface(0, width, height, 32,
- 0x00FF0000,
- 0x0000FF00,
- 0x000000FF,
- 0x00000000);
-#else
- // (this uses an alpha channel, which we don't want here)
- new_surface = SDL_CreateRGBSurface(0, width, height, 32,
- 0x00FF0000,
- 0x0000FF00,
- 0x000000FF,
- 0xFF000000);
-#endif
-
-#endif
if (new_surface == NULL)
Error(ERR_WARN, "SDL_CreateRGBSurface() failed: %s",
boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen)
{
boolean success = TRUE;
-#if 1
-#else
-#if defined(TARGET_SDL2)
- // int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN;
- int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN_DESKTOP;
- int surface_flags_window = SURFACE_FLAGS;
-#else
- int surface_flags_fullscreen = SURFACE_FLAGS | SDL_FULLSCREEN;
- int surface_flags_window = SURFACE_FLAGS;
-#endif
-#endif
SDL_Surface *new_surface = NULL;
SetWindowTitle();
video_yoffset = fullscreen_yoffset;
/* switch display to fullscreen mode, if available */
-#if 1
new_surface = SDLCreateScreen(backbuffer, TRUE);
-#else
-
-#if defined(TARGET_SDL2)
- sdl_window = SDL_CreateWindow(program.window_title,
- SDL_WINDOWPOS_CENTERED,
- SDL_WINDOWPOS_CENTERED,
- fullscreen_width, fullscreen_height,
- surface_flags_fullscreen);
- if (sdl_window != NULL)
- {
- new_surface = SDL_GetWindowSurface(sdl_window);
-
- // SDL_UpdateWindowSurface(sdl_window); // immediately map window
- // UpdateScreen(NULL); // immediately map window
- }
-#else
- new_surface = SDL_SetVideoMode(fullscreen_width, fullscreen_height,
- video.depth, surface_flags_fullscreen);
-#endif
-#endif
if (new_surface == NULL)
{
video_yoffset = 0;
/* switch display to window mode */
-#if 1
new_surface = SDLCreateScreen(backbuffer, FALSE);
-#else
-
-#if defined(TARGET_SDL2)
-
-#if USE_RENDERER
- float screen_scaling_factor = 1.2;
- int test_fullscreen = 0;
- int surface_flags = (test_fullscreen ? surface_flags_fullscreen :
- surface_flags_window);
-
- if ((*backbuffer)->surface)
- SDL_FreeSurface((*backbuffer)->surface);
-
- if (sdl_texture)
- SDL_DestroyTexture(sdl_texture);
-
- if (sdl_renderer)
- SDL_DestroyRenderer(sdl_renderer);
-
- if (sdl_window)
- SDL_DestroyWindow(sdl_window);
-
- sdl_window = SDL_CreateWindow(program.window_title,
- SDL_WINDOWPOS_CENTERED,
- SDL_WINDOWPOS_CENTERED,
- (int)(screen_scaling_factor * video.width),
- (int)(screen_scaling_factor * video.height),
- surface_flags);
-
- if (sdl_window != NULL)
- {
- sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0);
-
- if (sdl_renderer != NULL)
- {
- SDL_RenderSetLogicalSize(sdl_renderer, video.width, video.height);
- SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");
-
- sdl_texture = SDL_CreateTexture(sdl_renderer,
- SDL_PIXELFORMAT_ARGB8888,
- SDL_TEXTUREACCESS_STREAMING,
- video.width, video.height);
-
- if (sdl_texture != NULL)
- {
-#if 1
- // (do not use alpha channel)
- new_surface = SDL_CreateRGBSurface(0, video.width, video.height, 32,
- 0x00FF0000,
- 0x0000FF00,
- 0x000000FF,
- 0x00000000);
-#else
- // (this uses an alpha channel, which we don't want here)
- new_surface = SDL_CreateRGBSurface(0, video.width, video.height, 32,
- 0x00FF0000,
- 0x0000FF00,
- 0x000000FF,
- 0xFF000000);
-#endif
-
- if (new_surface == NULL)
- Error(ERR_WARN, "SDL_CreateRGBSurface() failed: %s",
- SDL_GetError());
- }
- else
- {
- Error(ERR_WARN, "SDL_CreateTexture() failed: %s", SDL_GetError());
- }
- }
- else
- {
- Error(ERR_WARN, "SDL_CreateRenderer() failed: %s", SDL_GetError());
- }
- }
- else
- {
- Error(ERR_WARN, "SDL_CreateWindow() failed: %s", SDL_GetError());
- }
-
-#else
-
- if (sdl_window)
- SDL_DestroyWindow(sdl_window);
-
- sdl_window = SDL_CreateWindow(program.window_title,
- SDL_WINDOWPOS_CENTERED,
- SDL_WINDOWPOS_CENTERED,
- video.width, video.height,
- surface_flags_window);
-
- if (sdl_window != NULL)
- {
- new_surface = SDL_GetWindowSurface(sdl_window);
-
- // SDL_UpdateWindowSurface(sdl_window); // immediately map window
- // UpdateScreen(NULL); // immediately map window
- }
-#endif
-
-#else
- new_surface = SDL_SetVideoMode(video.width, video.height,
- video.depth, surface_flags_window);
-#endif
-#endif
if (new_surface == NULL)
{
#if defined(TARGET_SDL2)
SDLRedrawWindow(); // map window
- // UpdateScreen(NULL); // map window
#endif
-#if 1
+#ifdef DEBUG
+#if defined(PLATFORM_WIN32)
+ // experimental drag and drop code
+
SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);
-#if defined(PLATFORM_WIN32)
{
SDL_SysWMinfo wminfo;
HWND hwnd;
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);
video.window_scaling_percent = window_scaling_percent;
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;
+ video.fullscreen_enabled = 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
+ // if screen size was changed in fullscreen mode, correct desktop window size
if (!fullscreen && video.fullscreen_initial)
{
SDLSetWindowScaling(setup.window_scaling_percent);
video.fullscreen_initial = FALSE;
}
-#endif
}
void SDLRedrawWindow()
void SDLCreateBitmapContent(Bitmap *bitmap, int width, int height,
int depth)
{
-#if 1
SDL_Surface *surface =
SDL_CreateRGBSurface(SURFACE_FLAGS, width, height, depth, 0,0,0, 0);
SDLSetNativeSurface(&surface);
bitmap->surface = surface;
-
-#else
-
- SDL_Surface *surface_tmp, *surface_native;
-
- if ((surface_tmp = SDL_CreateRGBSurface(SURFACE_FLAGS, width, height, depth,
- 0, 0, 0, 0))
- == NULL)
- Error(ERR_EXIT, "SDL_CreateRGBSurface() failed: %s", SDL_GetError());
-
- if ((surface_native = SDL_DisplayFormat(surface_tmp)) == NULL)
- Error(ERR_EXIT, "SDL_DisplayFormat() failed: %s", SDL_GetError());
-
- SDL_FreeSurface(surface_tmp);
-
- new_bitmap->surface = surface_native;
-#endif
}
void SDLFreeBitmapPointers(Bitmap *bitmap)
SDL_FreeSurface(bitmap->surface);
if (bitmap->surface_masked)
SDL_FreeSurface(bitmap->surface_masked);
+
bitmap->surface = NULL;
bitmap->surface_masked = NULL;
+
+#if defined(TARGET_SDL2)
+ if (bitmap->texture)
+ SDL_DestroyTexture(bitmap->texture);
+ if (bitmap->texture_masked)
+ SDL_DestroyTexture(bitmap->texture_masked);
+
+ bitmap->texture = NULL;
+ bitmap->texture_masked = NULL;
+#endif
}
void SDLCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap,
#endif
}
+void SDLBlitTexture(Bitmap *bitmap,
+ int src_x, int src_y, int width, int height,
+ int dst_x, int dst_y, int mask_mode)
+{
+#if defined(TARGET_SDL2)
+#if USE_RENDERER
+ SDL_Texture *texture;
+ SDL_Rect src_rect;
+ SDL_Rect dst_rect;
+
+ texture =
+ (mask_mode == BLIT_MASKED ? bitmap->texture_masked : bitmap->texture);
+
+ if (texture == NULL)
+ return;
+
+ src_rect.x = src_x;
+ src_rect.y = src_y;
+ src_rect.w = width;
+ src_rect.h = height;
+
+ dst_rect.x = dst_x;
+ dst_rect.y = dst_y;
+ dst_rect.w = width;
+ dst_rect.h = height;
+
+ SDL_RenderCopy(sdl_renderer, texture, &src_rect, &dst_rect);
+#endif
+#endif
+}
+
void SDLFillRectangle(Bitmap *dst_bitmap, int x, int y, int width, int height,
Uint32 color)
{
int dst_x = x, dst_y = y;
unsigned int time_last, time_current;
+ // store function for drawing global masked border
+ void (*draw_global_border_function)(int) = gfx.draw_global_border_function;
+
+ // deactivate drawing of global border while fading, if needed
+ if (draw_border_function == NULL)
+ gfx.draw_global_border_function = NULL;
+
/* check if screen size has changed */
if (surface_source != NULL && (video.width != surface_source->w ||
video.height != surface_source->h))
if (draw_border_function != NULL)
draw_border_function();
-#if defined(TARGET_SDL2)
- // SDL_UpdateWindowSurface(sdl_window);
- // SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect2, 1);
UpdateScreen(&dst_rect2);
+ }
+ }
+ }
+ else if (fade_mode == FADE_MODE_CURTAIN)
+ {
+ float xx;
+ int xx_final;
+ int xx_size = width / 2;
+
+ SDL_BlitSurface(surface_target, &src_rect, surface_screen, &dst_rect);
+#if defined(TARGET_SDL2)
+ SDL_SetSurfaceBlendMode(surface_source, SDL_BLENDMODE_NONE);
#else
- // SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
- UpdateScreen(&dst_rect2);
+ SDL_SetAlpha(surface_source, 0, 0); /* disable alpha blending */
#endif
+
+ for (xx = 0; xx < xx_size;)
+ {
+ time_last = time_current;
+ time_current = SDL_GetTicks();
+ xx += xx_size * ((float)(time_current - time_last) / fade_delay);
+ xx_final = MIN(MAX(0, xx), xx_size);
+
+ src_rect.x = src_x;
+ src_rect.y = src_y;
+ src_rect.w = width;
+ src_rect.h = height;
+
+ dst_rect.x = dst_x;
+ dst_rect.y = dst_y;
+
+ /* draw new (target) image to screen buffer */
+ SDL_BlitSurface(surface_target, &src_rect, surface_screen, &dst_rect);
+
+ if (xx_final < xx_size)
+ {
+ src_rect.w = xx_size - xx_final;
+ src_rect.h = height;
+
+ /* draw old (source) image to screen buffer (left side) */
+
+ src_rect.x = src_x + xx_final;
+ dst_rect.x = dst_x;
+
+ SDL_BlitSurface(surface_source, &src_rect, surface_screen, &dst_rect);
+
+ /* draw old (source) image to screen buffer (right side) */
+
+ src_rect.x = src_x + xx_size;
+ dst_rect.x = dst_x + xx_size + xx_final;
+
+ SDL_BlitSurface(surface_source, &src_rect, surface_screen, &dst_rect);
}
+
+ if (draw_border_function != NULL)
+ draw_border_function();
+
+ /* only update the region of the screen that is affected from fading */
+ UpdateScreen(&dst_rect2);
}
}
- else
+ else /* fading in, fading out or cross-fading */
{
float alpha;
int alpha_final;
if (draw_border_function != NULL)
draw_border_function();
-#if 1
/* only update the region of the screen that is affected from fading */
-#if defined(TARGET_SDL2)
- // SDL_UpdateWindowSurface(sdl_window);
- // SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect, 1);
- UpdateScreen(&dst_rect);
-#else
- // SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
UpdateScreen(&dst_rect);
-#endif
-#else
- SDL_Flip(surface_screen);
-#endif
}
}
- Delay(post_delay);
+ 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)
+ {
+ // do not wait longer than 10 ms at a time to be able to ...
+ Delay(MIN(10, time_post_delay - time_current));
+
+ // ... continue drawing global animations during post delay
+ UpdateScreen(NULL);
+
+ time_current = SDL_GetTicks();
+ }
+ }
+
+ // restore function for drawing global masked border
+ gfx.draw_global_border_function = draw_global_border_function;
}
void SDLDrawSimpleLine(Bitmap *dst_bitmap, int from_x, int from_y,
sge_Line(dst_bitmap->surface, from_x, from_y, to_x, to_y, color);
}
-#if 0
+#if ENABLE_UNUSED_CODE
void SDLDrawLines(SDL_Surface *surface, struct XY *points,
int num_points, Uint32 color)
{
/* ========================================================================= */
/* The following functions were taken from the SGE library */
-/* (SDL Graphics Extension Library) by Anders Lindström */
+/* (SDL Graphics Extension Library) by Anders Lindström */
/* http://www.etek.chalmers.se/~e8cal1/sge/index.html */
/* ========================================================================= */
{
int x, y;
tColorRGBA *sp, *csp, *dp;
-#if 0
- int sgap;
-#endif
int dgap;
/* pointer setup */
sp = csp = (tColorRGBA *) src->pixels;
dp = (tColorRGBA *) dst->pixels;
-#if 0
- sgap = src->pitch - src->w * 4;
-#endif
dgap = dst->pitch - dst->w * 4;
for (y = 0; y < dst->h; y++)
return 0;
}
-#if 1
-
int zoomSurfaceRGBA(SDL_Surface *src, SDL_Surface *dst)
{
int x, y, *sax, *say, *csax, *csay;
src->h == 2 * dst->h)
return zoomSurfaceRGBA_scaleDownBy2(src, dst);
-#if 0
- printf("::: zoomSurfaceRGBA: %d, %d -> %d, %d\n",
- src->w, src->h, dst->w, dst->h);
-#endif
-
/* variable setup */
sx = (float) src->w / (float) dst->w;
sy = (float) src->h / (float) dst->h;
return 0;
}
-#else
-
-int zoomSurfaceRGBA(SDL_Surface *src, SDL_Surface *dst)
-{
- int x, y, sx, sy, *sax, *say, *csax, *csay, csx, csy;
- tColorRGBA *sp, *csp, *dp;
-#if 0
- int sgap;
-#endif
- int dgap;
-
- /* use specialized zoom function when scaling down to exactly half size */
- if (src->w == 2 * dst->w &&
- src->h == 2 * dst->h)
- return zoomSurfaceRGBA_scaleDownBy2(src, dst);
-
- /* variable setup */
- sx = (int) (65536.0 * (float) src->w / (float) dst->w);
- sy = (int) (65536.0 * (float) src->h / (float) dst->h);
-
- /* allocate memory for row increments */
- sax = (int *)checked_malloc((dst->w + 1) * sizeof(Uint32));
- say = (int *)checked_malloc((dst->h + 1) * sizeof(Uint32));
-
- /* precalculate row increments */
- csx = 0;
- csax = sax;
- for (x = 0; x <= dst->w; x++)
- {
- *csax = csx;
- csax++;
- csx &= 0xffff;
- csx += sx;
- }
-
- csy = 0;
- csay = say;
- for (y = 0; y <= dst->h; y++)
- {
- *csay = csy;
- csay++;
- csy &= 0xffff;
- csy += sy;
- }
-
- /* pointer setup */
- sp = csp = (tColorRGBA *) src->pixels;
- dp = (tColorRGBA *) dst->pixels;
-#if 0
- sgap = src->pitch - src->w * 4;
-#endif
- dgap = dst->pitch - dst->w * 4;
-
- csay = say;
- for (y = 0; y < dst->h; y++)
- {
- sp = csp;
- csax = sax;
-
- for (x = 0; x < dst->w; x++)
- {
- /* draw */
- *dp = *sp;
-
- /* advance source pointers */
- csax++;
- sp += (*csax >> 16);
-
- /* advance destination pointer */
- dp++;
- }
-
- /* advance source pointer */
- csay++;
- csp = (tColorRGBA *) ((Uint8 *) csp + (*csay >> 16) * src->pitch);
-
- /* advance destination pointers */
- dp = (tColorRGBA *) ((Uint8 *) dp + dgap);
- }
-
- free(sax);
- free(say);
-
- return 0;
-}
-
-#endif
-
/*
-----------------------------------------------------------------------------
8 bit zoomer
return zoom_dst;
}
-#if 1
-
Bitmap *SDLZoomBitmap(Bitmap *src_bitmap, int dst_width, int dst_height)
{
-#if 1
-
Bitmap *dst_bitmap = CreateBitmapStruct();
SDL_Surface **dst_surface = &dst_bitmap->surface;
SDLSetNativeSurface(dst_surface);
return dst_bitmap;
-
-#else
-
- Bitmap *dst_bitmap = CreateBitmapStruct();
- SDL_Surface *sdl_surface_tmp;
-
- dst_width = MAX(1, dst_width); /* prevent zero bitmap width */
- dst_height = MAX(1, dst_height); /* prevent zero bitmap height */
-
- dst_bitmap->width = dst_width;
- dst_bitmap->height = dst_height;
-
- print_timestamp_init("SDLZoomBitmap");
-
- /* create zoomed temporary surface from source surface */
- sdl_surface_tmp = zoomSurface(src_bitmap->surface, dst_width, dst_height);
- print_timestamp_time("zoomSurface");
-
- /* create native format destination surface from zoomed temporary surface */
- dst_bitmap->surface = SDL_DisplayFormat(sdl_surface_tmp);
- print_timestamp_time("SDL_DisplayFormat");
-
- /* free temporary surface */
- SDL_FreeSurface(sdl_surface_tmp);
- print_timestamp_time("SDL_FreeSurface");
-
- print_timestamp_done("SDLZoomBitmap");
-
- return dst_bitmap;
-
-#endif
}
-#else
-
-void SDLZoomBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap)
-{
- SDL_Surface *sdl_surface_tmp;
- int dst_width = dst_bitmap->width;
- int dst_height = dst_bitmap->height;
-
- print_timestamp_init("SDLZoomBitmap");
-
- /* throw away old destination surface */
- SDL_FreeSurface(dst_bitmap->surface);
- print_timestamp_time("SDL_FreeSurface");
-
- /* create zoomed temporary surface from source surface */
- sdl_surface_tmp = zoomSurface(src_bitmap->surface, dst_width, dst_height);
- print_timestamp_time("zoomSurface");
-
- /* create native format destination surface from zoomed temporary surface */
- dst_bitmap->surface = SDL_DisplayFormat(sdl_surface_tmp);
- print_timestamp_time("SDL_DisplayFormat");
-
- /* free temporary surface */
- SDL_FreeSurface(sdl_surface_tmp);
- print_timestamp_time("SDL_FreeSurface");
-
- print_timestamp_done("SDLZoomBitmap");
-}
-
-#endif
-
/* ========================================================================= */
/* load image to bitmap */
UPDATE_BUSY_STATE();
/* create native non-transparent surface for current image */
-#if 1
if ((new_bitmap->surface = SDLGetNativeSurface(sdl_image_tmp)) == NULL)
{
SetError("SDL_DisplayFormat(): %s", SDL_GetError());
return NULL;
}
-#else
- if ((new_bitmap->surface = SDL_DisplayFormat(sdl_image_tmp)) == NULL)
- {
- SetError("SDL_DisplayFormat(): %s", SDL_GetError());
-
- return NULL;
- }
-#endif
print_timestamp_time("SDL_DisplayFormat (opaque)");
/* create native transparent surface for current image */
SDL_SetColorKey(sdl_image_tmp, SET_TRANSPARENT_PIXEL,
SDL_MapRGB(sdl_image_tmp->format, 0x00, 0x00, 0x00));
-#if 1
- if ((new_bitmap->surface_masked = SDLGetNativeSurface(sdl_image_tmp)) == NULL)
- {
- SetError("SDL_DisplayFormat(): %s", SDL_GetError());
- return NULL;
- }
-#else
- if ((new_bitmap->surface_masked = SDL_DisplayFormat(sdl_image_tmp)) == NULL)
+ if ((new_bitmap->surface_masked = SDLGetNativeSurface(sdl_image_tmp)) == NULL)
{
SetError("SDL_DisplayFormat(): %s", SDL_GetError());
return NULL;
}
-#endif
print_timestamp_time("SDL_DisplayFormat (masked)");
void SDLHandleWindowManagerEvent(Event *event)
{
+#ifdef DEBUG
#if defined(PLATFORM_WIN32)
+ // experimental drag and drop code
+
SDL_SysWMEvent *syswmevent = (SDL_SysWMEvent *)event;
SDL_SysWMmsg *syswmmsg = (SDL_SysWMmsg *)(syswmevent->msg);
#endif
}
#endif
+#endif
}
return TRUE;
}
-
-#endif /* TARGET_SDL */