/***********************************************************
* Artsoft Retro-Game Library *
*----------------------------------------------------------*
-* (c) 1994-2002 Artsoft Entertainment *
+* (c) 1994-2006 Artsoft Entertainment *
* Holger Schemel *
* Detmolder Strasse 189 *
* 33604 Bielefeld *
static int video_xoffset;
static int video_yoffset;
-static void setFullscreenParameters()
+static void setFullscreenParameters(char *fullscreen_mode_string)
{
struct ScreenModeInfo *fullscreen_mode;
int i;
- fullscreen_mode = get_screen_mode_from_string(setup.fullscreen_mode);
+ fullscreen_mode = get_screen_mode_from_string(fullscreen_mode_string);
if (fullscreen_mode == NULL)
return;
static void SDLSetWindowIcon(char *basename)
{
+ /* (setting the window icon on Mac OS X would replace the high-quality
+ dock icon with the currently smaller (and uglier) icon from file) */
+
+#if !defined(PLATFORM_MACOSX)
char *filename = getCustomImageFilename(basename);
SDL_Surface *surface;
SDL_MapRGB(surface->format, 0x00, 0x00, 0x00));
SDL_WM_SetIcon(surface, NULL);
+#endif
}
void SDLInitVideoDisplay(void)
{
- putenv("SDL_VIDEO_CENTERED=1");
+ if (!strEqual(setup.system.sdl_videodriver, ARG_DEFAULT))
+ SDL_putenv(getStringCat2("SDL_VIDEODRIVER=", setup.system.sdl_videodriver));
+
+ SDL_putenv("SDL_VIDEO_CENTERED=1");
/* initialize SDL video */
if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
if (fullscreen && !video.fullscreen_enabled && video.fullscreen_available)
{
- setFullscreenParameters();
+ setFullscreenParameters(setup.fullscreen_mode);
video_xoffset = fullscreen_xoffset;
video_yoffset = fullscreen_yoffset;
/* do not try it again */
video.fullscreen_available = FALSE;
+
success = FALSE;
}
else
(*backbuffer)->surface = new_surface;
video.fullscreen_enabled = TRUE;
+ video.fullscreen_mode_current = setup.fullscreen_mode;
+
success = TRUE;
}
}
}
void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height,
- int fade_mode, int fade_delay, int post_delay)
+ int fade_mode, int fade_delay, int post_delay,
+ void (*draw_border_function)(void))
{
static boolean initialization_needed = TRUE;
- static SDL_Surface *surface_screen_copy = NULL;
+ static SDL_Surface *surface_source = NULL;
+ static SDL_Surface *surface_target = NULL;
static SDL_Surface *surface_black = NULL;
SDL_Surface *surface_screen = backbuffer->surface;
- SDL_Surface *surface_cross; /* initialized later */
+ SDL_Surface *surface_cross = (bitmap_cross ? bitmap_cross->surface : NULL);
SDL_Rect src_rect, dst_rect;
int src_x = x, src_y = y;
int dst_x = x, dst_y = y;
- boolean fade_reverse = (fade_mode == FADE_MODE_FADE_IN ? TRUE : FALSE);
unsigned int time_last, time_current;
float alpha;
int alpha_final;
dst_rect.x = dst_x;
dst_rect.y = dst_y;
- dst_rect.w = width;
- dst_rect.h = height;
-
-#if 0
- if (!initialization_needed)
- {
- /* check if screen size has changed (can happen when toggling fullscreen) */
- if (surface_screen_copy->w != surface_screen->w ||
- surface_screen_copy->h != surface_screen->h)
- {
- SDL_FreeSurface(surface_screen_copy);
- SDL_FreeSurface(surface_black);
-
- initialization_needed = TRUE;
- }
- }
-#endif
+ dst_rect.w = width; /* (ignored) */
+ dst_rect.h = height; /* (ignored) */
if (initialization_needed)
{
else
flags |= SDL_SWSURFACE;
- /* create surface for temporary copy of screen buffer */
- if ((surface_screen_copy =
+ /* create surface for temporary copy of screen buffer (source) */
+ if ((surface_source =
+ SDL_CreateRGBSurface(flags,
+ video.width,
+ video.height,
+ surface_screen->format->BitsPerPixel,
+ surface_screen->format->Rmask,
+ surface_screen->format->Gmask,
+ surface_screen->format->Bmask,
+ surface_screen->format->Amask)) == NULL)
+ Error(ERR_EXIT, "SDL_CreateRGBSurface() failed: %s", SDL_GetError());
+
+ /* create surface for cross-fading screen buffer (target) */
+ if ((surface_target =
SDL_CreateRGBSurface(flags,
-#if 1
video.width,
video.height,
-#else
- surface_screen->w,
- surface_screen->h,
-#endif
surface_screen->format->BitsPerPixel,
surface_screen->format->Rmask,
surface_screen->format->Gmask,
surface_screen->format->Bmask,
surface_screen->format->Amask)) == NULL)
- Error(ERR_EXIT, "SDL_CreateRGBSurface( ) failed: %s", SDL_GetError());
+ Error(ERR_EXIT, "SDL_CreateRGBSurface() failed: %s", SDL_GetError());
/* create black surface for fading from/to black */
if ((surface_black =
SDL_CreateRGBSurface(flags,
-#if 1
video.width,
video.height,
-#else
- surface_screen->w,
- surface_screen->h,
-#endif
surface_screen->format->BitsPerPixel,
surface_screen->format->Rmask,
surface_screen->format->Gmask,
surface_screen->format->Bmask,
surface_screen->format->Amask)) == NULL)
- Error(ERR_EXIT, "SDL_CreateRGBSurface( ) failed: %s", SDL_GetError());
+ Error(ERR_EXIT, "SDL_CreateRGBSurface() failed: %s", SDL_GetError());
/* completely fill the surface with black color pixels */
SDL_FillRect(surface_black, NULL,
initialization_needed = FALSE;
}
- /* copy the current screen backbuffer to the temporary screen copy buffer */
- SDL_BlitSurface(surface_screen, &dst_rect, surface_screen_copy, &src_rect);
-
- surface_cross = (fade_mode == FADE_MODE_CROSSFADE ? bitmap_cross->surface :
- surface_black);
+ /* copy source and target surfaces to temporary surfaces for fading */
+ if (fade_mode & FADE_TYPE_TRANSFORM)
+ {
+ SDL_BlitSurface(surface_cross, &src_rect, surface_source, &src_rect);
+ SDL_BlitSurface(surface_screen, &dst_rect, surface_target, &src_rect);
+ }
+ else if (fade_mode & FADE_TYPE_FADE_IN)
+ {
+ SDL_BlitSurface(surface_black, &src_rect, surface_source, &src_rect);
+ SDL_BlitSurface(surface_screen, &dst_rect, surface_target, &src_rect);
+ }
+ else /* FADE_TYPE_FADE_OUT */
+ {
+ SDL_BlitSurface(surface_screen, &dst_rect, surface_source, &src_rect);
+ SDL_BlitSurface(surface_black, &src_rect, surface_target, &src_rect);
+ }
time_current = SDL_GetTicks();
- for (alpha = 0.0; alpha < 255.0;)
+ if (fade_mode == FADE_MODE_MELT)
{
- time_last = time_current;
- time_current = SDL_GetTicks();
- alpha += 255 * ((float)(time_current - time_last) / fade_delay);
- alpha_final = (int)(fade_reverse ? 255.0 - alpha : alpha);
- alpha_final = MIN(MAX(0, alpha_final), 255);
+ boolean done = FALSE;
+ int melt_pixels = 2;
+ int melt_columns = width / melt_pixels;
+ int ypos[melt_columns];
+ int max_steps = height / 8 + 32;
+ int steps_done = 0;
+ int i;
+
+ SDL_BlitSurface(surface_source, &src_rect, surface_screen, &dst_rect);
+ SDL_SetAlpha(surface_target, 0, 0); /* disable alpha blending */
- /* draw existing image to screen buffer */
- SDL_BlitSurface(surface_screen_copy, &src_rect, surface_screen, &dst_rect);
+ ypos[0] = -GetSimpleRandom(16);
- /* draw new image to screen buffer using alpha blending */
- SDL_SetAlpha(surface_cross, SDL_SRCALPHA, alpha_final);
- SDL_BlitSurface(surface_cross, &src_rect, surface_screen, &dst_rect);
+ for (i = 1 ; i < melt_columns; i++)
+ {
+ int r = GetSimpleRandom(3) - 1; /* randomly choose from { -1, 0, -1 } */
+
+ ypos[i] = ypos[i - 1] + r;
+
+ if (ypos[i] > 0)
+ ypos[i] = 0;
+ else
+ if (ypos[i] == -16)
+ ypos[i] = -15;
+ }
+
+ while (!done)
+ {
+ float steps;
+ int steps_final;
+
+ time_last = time_current;
+ time_current = SDL_GetTicks();
+ steps += max_steps * ((float)(time_current - time_last) / fade_delay);
+ steps_final = MIN(MAX(0, steps), max_steps);
+
+ steps_done++;
+
+ done = (steps_done >= steps_final);
+
+ for (i = 0 ; i < melt_columns; i++)
+ {
+ if (ypos[i] < 0)
+ {
+ ypos[i]++;
+
+ done = FALSE;
+ }
+ else if (ypos[i] < height)
+ {
+ int y1 = 16;
+ int y2 = 8;
+ int y3 = 8;
+ int dy = (ypos[i] < y1) ? ypos[i] + 1 : y2 + GetSimpleRandom(y3);
+
+ if (ypos[i] + dy >= height)
+ dy = height - ypos[i];
+
+ /* copy part of (appearing) target surface to upper area */
+ src_rect.x = src_x + i * melt_pixels;
+ // src_rect.y = src_y + ypos[i];
+ src_rect.y = src_y;
+ src_rect.w = melt_pixels;
+ // src_rect.h = dy;
+ src_rect.h = ypos[i] + dy;
+
+ dst_rect.x = dst_x + i * melt_pixels;
+ // dst_rect.y = dst_y + ypos[i];
+ dst_rect.y = dst_y;
+
+ if (steps_done >= steps_final)
+ SDL_BlitSurface(surface_target, &src_rect,
+ surface_screen, &dst_rect);
+
+ ypos[i] += dy;
+
+ /* copy part of (disappearing) source surface to lower area */
+ src_rect.x = src_x + i * melt_pixels;
+ src_rect.y = src_y;
+ src_rect.w = melt_pixels;
+ src_rect.h = height - ypos[i];
+
+ dst_rect.x = dst_x + i * melt_pixels;
+ dst_rect.y = dst_y + ypos[i];
+
+ if (steps_done >= steps_final)
+ SDL_BlitSurface(surface_source, &src_rect,
+ surface_screen, &dst_rect);
+
+ done = FALSE;
+ }
+ else
+ {
+ src_rect.x = src_x + i * melt_pixels;
+ src_rect.y = src_y;
+ src_rect.w = melt_pixels;
+ src_rect.h = height;
+
+ dst_rect.x = dst_x + i * melt_pixels;
+ dst_rect.y = dst_y;
+
+ if (steps_done >= steps_final)
+ SDL_BlitSurface(surface_target, &src_rect,
+ surface_screen, &dst_rect);
+ }
+ }
+
+ if (steps_done >= steps_final)
+ {
+ if (draw_border_function != NULL)
+ draw_border_function();
+
+ SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
+ }
+ }
+ }
+ else
+ {
+ for (alpha = 0.0; alpha < 255.0;)
+ {
+ time_last = time_current;
+ time_current = SDL_GetTicks();
+ alpha += 255 * ((float)(time_current - time_last) / fade_delay);
+ alpha_final = MIN(MAX(0, alpha), 255);
+
+ /* draw existing (source) image to screen buffer */
+ SDL_BlitSurface(surface_source, &src_rect, surface_screen, &dst_rect);
+
+ /* draw new (target) image to screen buffer using alpha blending */
+ SDL_SetAlpha(surface_target, SDL_SRCALPHA, alpha_final);
+ SDL_BlitSurface(surface_target, &src_rect, surface_screen, &dst_rect);
+
+ if (draw_border_function != NULL)
+ draw_border_function();
- /* draw screen buffer to visible display */
#if 1
- SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
+ /* only update the region of the screen that is affected from fading */
+ SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
#else
- SDL_Flip(surface_screen);
+ SDL_Flip(surface_screen);
#endif
+ }
}
Delay(post_delay);
return NULL;
}
+ UPDATE_BUSY_STATE();
+
/* create native non-transparent surface for current image */
if ((new_bitmap->surface = SDL_DisplayFormat(sdl_image_tmp)) == NULL)
{
return NULL;
}
+ UPDATE_BUSY_STATE();
+
/* create native transparent surface for current image */
SDL_SetColorKey(sdl_image_tmp, SDL_SRCCOLORKEY,
SDL_MapRGB(sdl_image_tmp->format, 0x00, 0x00, 0x00));
return NULL;
}
+ UPDATE_BUSY_STATE();
+
/* free temporary surface */
SDL_FreeSurface(sdl_image_tmp);
void SDLOpenAudio(void)
{
if (!strEqual(setup.system.sdl_audiodriver, ARG_DEFAULT))
- putenv(getStringCat2("SDL_AUDIODRIVER=", setup.system.sdl_audiodriver));
+ SDL_putenv(getStringCat2("SDL_AUDIODRIVER=", setup.system.sdl_audiodriver));
if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0)
{