-/***********************************************************
-* Artsoft Retro-Game Library *
-*----------------------------------------------------------*
-* (c) 1994-2006 Artsoft Entertainment *
-* Holger Schemel *
-* Detmolder Strasse 189 *
-* 33604 Bielefeld *
-* Germany *
-* e-mail: info@artsoft.org *
-*----------------------------------------------------------*
-* sdl.c *
-***********************************************************/
+// ============================================================================
+// Artsoft Retro-Game Library
+// ----------------------------------------------------------------------------
+// (c) 1995-2014 by Artsoft Entertainment
+// Holger Schemel
+// info@artsoft.org
+// http://www.artsoft.org/
+// ----------------------------------------------------------------------------
+// sdl.c
+// ============================================================================
#include "system.h"
#include "sound.h"
#include "misc.h"
#include "setup.h"
+#define ENABLE_UNUSED_CODE 0 /* currently unused functions */
-#if defined(TARGET_SDL)
/* ========================================================================= */
/* video functions */
static unsigned int update_screen_delay = 0;
unsigned int update_screen_delay_value = 20; /* (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;
-#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
SDL_RenderClear(sdl_renderer);
SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL);
SDL_RenderPresent(sdl_renderer);
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);
- return SDL_ConvertSurface(surface, backbuffer->surface->format, 0);
+ if (new_surface == NULL)
+ Error(ERR_EXIT, "SDL_ConvertSurface() failed: %s", SDL_GetError());
+
+ 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;
}
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,
// 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;
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;
-#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 (!fullscreen && video.fullscreen_initial)
{
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)
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
}
}
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 */