rnd-20060816-3-src
authorHolger Schemel <info@artsoft.org>
Wed, 16 Aug 2006 20:30:29 +0000 (22:30 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:52:52 +0000 (10:52 +0200)
src/conftime.h
src/libgame/sdl.c
src/libgame/x11.c
src/screens.c
src/tools.c
src/tools.h

index a4d3e98d352854cc6957d5e7f0169fa2ecd1a18e..b6d2e6d09aa1431c1f24df7c5cb4d642149dec78 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2006-08-16 21:23]"
+#define COMPILE_DATE_STRING "[2006-08-16 22:29]"
index b85a8075114bd732ba0fac936786fa8b10f8d153..0b49269361786c66a276d69c78be4d887c238d6a 100644 (file)
@@ -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);
index 4626324fe82bb526c2507b04d2f2b19c9d1a08b5..88deb3f586d64092c772dc186e1a1cec4e0a2b38 100644 (file)
@@ -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 */
 }
index 05956c4c369b741eeed51faf4ae8138b61d0b6c7..cd38087393720868036bdad18708138f65a04ae1 100644 (file)
@@ -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);
 
index 72b5a2902aa290a0dc57f47b64a98cefaf1d2826..7f5d5db6ee1c651c874722443909225f37feffca 100644 (file)
@@ -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)
index 21288a94475c080bd740b675a546bdc835ecbd4a..676f083d5334d388b6a907ea1c56d8f48dbfd6f9 100644 (file)
@@ -70,6 +70,7 @@ void FadeToFront();
 void FadeIn(int);
 void FadeOut(int);
 void FadeCross(int);
+void FadeCrossSaveBackbuffer();
 
 void ClearWindow();
 void SetMainBackgroundImageIfDefined(int);