From 6e14e0f1251b17881f44fdddc489c19d7ad7a373 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Tue, 22 Mar 2016 09:36:02 +0100 Subject: [PATCH] cleanup of fade bitmap handling (after screen size changes) --- src/libgame/sdl.c | 75 ++------------------------------------------ src/libgame/system.c | 7 +++++ src/libgame/system.h | 4 +++ 3 files changed, 14 insertions(+), 72 deletions(-) diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index d1163664..2fd019ce 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -1110,10 +1110,9 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, int fade_mode, int fade_delay, int post_delay, void (*draw_border_function)(void)) { - static boolean initialization_needed = TRUE; - static SDL_Surface *surface_source = NULL; - static SDL_Surface *surface_target = NULL; - static SDL_Surface *surface_black = NULL; + SDL_Surface *surface_source = gfx.fade_bitmap_source->surface; + SDL_Surface *surface_target = gfx.fade_bitmap_target->surface; + SDL_Surface *surface_black = gfx.fade_bitmap_black->surface; SDL_Surface *surface_screen = backbuffer->surface; SDL_Surface *surface_cross = (bitmap_cross ? bitmap_cross->surface : NULL); SDL_Rect src_rect, dst_rect; @@ -1129,17 +1128,6 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, 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)) - { - SDL_FreeSurface(surface_source); - SDL_FreeSurface(surface_target); - SDL_FreeSurface(surface_black); - - initialization_needed = TRUE; - } - src_rect.x = src_x; src_rect.y = src_y; src_rect.w = width; @@ -1155,63 +1143,6 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, dst_rect2 = dst_rect; - if (initialization_needed) - { -#if defined(TARGET_SDL2) - unsigned int flags = 0; -#else - unsigned int flags = SDL_SRCALPHA; - - /* use same surface type as screen surface */ - if ((surface_screen->flags & SDL_HWSURFACE)) - flags |= SDL_HWSURFACE; - else - flags |= SDL_SWSURFACE; -#endif - - /* 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, - 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, - 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()); - - /* completely fill the surface with black color pixels */ - SDL_FillRect(surface_black, NULL, - SDL_MapRGB(surface_screen->format, 0, 0, 0)); - - initialization_needed = FALSE; - } - /* copy source and target surfaces to temporary surfaces for fading */ if (fade_mode & FADE_TYPE_TRANSFORM) { diff --git a/src/libgame/system.c b/src/libgame/system.c index 38ec0b5b..26691223 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -207,9 +207,16 @@ void InitGfxWindowInfo(int win_xsize, int win_ysize) gfx.background_bitmap_mask = REDRAW_NONE; ReCreateBitmap(&gfx.background_bitmap, win_xsize, win_ysize, DEFAULT_DEPTH); + #if USE_FINAL_SCREEN_BITMAP ReCreateBitmap(&gfx.final_screen_bitmap, win_xsize, win_ysize, DEFAULT_DEPTH); #endif + + ReCreateBitmap(&gfx.fade_bitmap_source, win_xsize, win_ysize, DEFAULT_DEPTH); + ReCreateBitmap(&gfx.fade_bitmap_target, win_xsize, win_ysize, DEFAULT_DEPTH); + ReCreateBitmap(&gfx.fade_bitmap_black, win_xsize, win_ysize, DEFAULT_DEPTH); + + ClearRectangle(gfx.fade_bitmap_black, 0, 0, win_xsize, win_ysize); } void InitGfxScrollbufferInfo(int scrollbuffer_width, int scrollbuffer_height) diff --git a/src/libgame/system.h b/src/libgame/system.h index 97acf934..dd5b1bf1 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -811,6 +811,10 @@ struct GfxInfo Bitmap *background_bitmap; int background_bitmap_mask; + Bitmap *fade_bitmap_source; + Bitmap *fade_bitmap_target; + Bitmap *fade_bitmap_black; + #if USE_FINAL_SCREEN_BITMAP Bitmap *final_screen_bitmap; #endif -- 2.34.1