From: Holger Schemel Date: Wed, 16 Aug 2006 20:30:29 +0000 (+0200) Subject: rnd-20060816-3-src X-Git-Tag: 3.2.1^2~10 X-Git-Url: https://git.artsoft.org/?a=commitdiff_plain;h=342de2ef2eff4f6936541b70d1eabf01f315fa47;p=rocksndiamonds.git rnd-20060816-3-src --- diff --git a/src/conftime.h b/src/conftime.h index a4d3e98d..b6d2e6d0 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "[2006-08-16 21:23]" +#define COMPILE_DATE_STRING "[2006-08-16 22:29]" diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index b85a8075..0b492693 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -381,10 +381,11 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, int fade_mode, int fade_delay, int post_delay) { 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; @@ -406,21 +407,6 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, 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 - if (initialization_needed) { unsigned int flags = SDL_SRCALPHA; @@ -431,39 +417,41 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, 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, -#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 surface for cross-fading screen buffer (target) */ + if ((surface_target = + 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 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, @@ -472,11 +460,17 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, 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_MODE_CROSSFADE) + { + SDL_BlitSurface(surface_cross, &src_rect, surface_source, &src_rect); + SDL_BlitSurface(surface_screen, &dst_rect, surface_target, &src_rect); + } + else + { + SDL_BlitSurface(surface_screen, &dst_rect, surface_source, &src_rect); + SDL_BlitSurface(surface_black, &src_rect, surface_target, &src_rect); + } time_current = SDL_GetTicks(); @@ -488,15 +482,15 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, alpha_final = (int)(fade_reverse ? 255.0 - alpha : alpha); alpha_final = MIN(MAX(0, alpha_final), 255); - /* draw existing image to screen buffer */ - SDL_BlitSurface(surface_screen_copy, &src_rect, surface_screen, &dst_rect); + /* draw existing (source) image to screen buffer */ + SDL_BlitSurface(surface_source, &src_rect, surface_screen, &dst_rect); - /* 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); + /* 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); - /* draw screen buffer to visible display */ #if 1 + /* 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); diff --git a/src/libgame/x11.c b/src/libgame/x11.c index 4626324f..88deb3f5 100644 --- a/src/libgame/x11.c +++ b/src/libgame/x11.c @@ -365,13 +365,12 @@ void X11FillRectangle(Bitmap *bitmap, int x, int y, void X11FadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, int fade_mode, int fade_delay, int post_delay) { - /* fading currently not supported -- simply copy target image to screen */ + /* fading currently not supported -- simply copy backbuffer to screen */ if (fade_mode == FADE_MODE_FADE_OUT) X11FillRectangle(window, x, y, width, height, BLACK_PIXEL); else - X11CopyArea(bitmap_cross != NULL ? bitmap_cross : backbuffer, window, - x, y, width, height, 0, 0, BLIT_OPAQUE); + X11CopyArea(backbuffer, window, x, y, width, height, 0, 0, BLIT_OPAQUE); /* as we currently cannot use the fade delay, also do not use post delay */ } diff --git a/src/screens.c b/src/screens.c index 05956c4c..cd380873 100644 --- a/src/screens.c +++ b/src/screens.c @@ -658,9 +658,13 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) { Bitmap *drawto_last = drawto; +#if 1 + if (use_cross_fading) + FadeCrossSaveBackbuffer(); +#else if (use_cross_fading) drawto = bitmap_db_cross; - +#endif DrawTitleScreenImage(title_nr); drawto = drawto_last; @@ -1468,8 +1472,13 @@ void HandleInfoScreen_Music(int button) FadeSoundsAndMusic(); +#if 1 + if (button != MB_MENU_INITIALIZE) + FadeCrossSaveBackbuffer(); +#else if (button != MB_MENU_INITIALIZE) drawto = bitmap_db_cross; +#endif ClearWindow(); DrawHeadline(); @@ -1746,7 +1755,11 @@ void HandleInfoScreen_Credits(int button) screen_nr++; +#if 1 + FadeCrossSaveBackbuffer(); +#else drawto = bitmap_db_cross; +#endif show_screen = DrawInfoScreen_CreditsScreen(screen_nr); diff --git a/src/tools.c b/src/tools.c index 72b5a290..7f5d5db6 100644 --- a/src/tools.c +++ b/src/tools.c @@ -440,9 +440,7 @@ void FadeExt(int fade_mask, int fade_mode) if (fade_delay == 0) { - if (fade_mode == FADE_MODE_CROSSFADE) - BlitBitmap(bitmap, backbuffer, x, y, width, height, x, y); - else if (fade_mode == FADE_MODE_FADE_OUT) + if (fade_mode == FADE_MODE_FADE_OUT) ClearRectangle(backbuffer, x, y, width, height); BackToFront(); @@ -470,6 +468,11 @@ void FadeCross(int fade_mask) FadeExt(fade_mask, FADE_MODE_CROSSFADE); } +void FadeCrossSaveBackbuffer() +{ + BlitBitmap(backbuffer, bitmap_db_cross, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); +} + void SetMainBackgroundImageIfDefined(int graphic) { if (graphic_info[graphic].bitmap) diff --git a/src/tools.h b/src/tools.h index 21288a94..676f083d 100644 --- a/src/tools.h +++ b/src/tools.h @@ -70,6 +70,7 @@ void FadeToFront(); void FadeIn(int); void FadeOut(int); void FadeCross(int); +void FadeCrossSaveBackbuffer(); void ClearWindow(); void SetMainBackgroundImageIfDefined(int);