removed artifact from removed X11 support
[rocksndiamonds.git] / src / libgame / system.c
index aa344da58d9af83e1f5f04e31d72f8364a3c99f8..f0d73e7311e9e102686a56319b8c4ce59e4f7df9 100644 (file)
@@ -44,11 +44,6 @@ int                  level_nr;
 
 struct LevelStats      level_stats[MAX_LEVELS];
 
-Display                       *display = NULL;
-Visual                *visual = NULL;
-int                    screen = 0;
-Colormap               cmap = None;
-
 DrawWindow            *window = NULL;
 DrawBuffer            *backbuffer = NULL;
 DrawBuffer            *drawto = NULL;
@@ -60,7 +55,6 @@ boolean                       keyrepeat_status = TRUE;
 #endif
 
 int                    redraw_mask = REDRAW_NONE;
-int                    redraw_tiles = 0;
 
 int                    FrameCounter = 0;
 
@@ -69,15 +63,17 @@ int                 FrameCounter = 0;
 /* init/close functions                                                      */
 /* ========================================================================= */
 
-void InitProgramInfo(char *argv0,
+void InitProgramInfo(char *argv0, char *config_filename,
                     char *userdata_subdir, char *userdata_subdir_unix,
                     char *program_title, char *icon_title,
-                    char *sdl_icon_filename, char *cookie_prefix,
+                    char *icon_filename, char *cookie_prefix,
                     int program_version)
 {
   program.command_basepath = getBasePath(argv0);
   program.command_basename = getBaseName(argv0);
 
+  program.config_filename = config_filename;
+
   program.userdata_subdir = userdata_subdir;
   program.userdata_subdir_unix = userdata_subdir_unix;
   program.userdata_path = getUserGameDataDir();
@@ -86,7 +82,7 @@ void InitProgramInfo(char *argv0,
   program.window_title = "(undefined)";
   program.icon_title = icon_title;
 
-  program.sdl_icon_filename = sdl_icon_filename;
+  program.icon_filename = icon_filename;
 
   program.cookie_prefix = cookie_prefix;
 
@@ -96,8 +92,10 @@ void InitProgramInfo(char *argv0,
   program.version_build = VERSION_BUILD(program_version);
   program.version_ident = program_version;
 
-  program.error_filename = getErrorFilename(ERROR_BASENAME);
-  program.error_file = stderr;
+  program.log_filename[LOG_OUT_ID] = getLogFilename(LOG_OUT_BASENAME);
+  program.log_filename[LOG_ERR_ID] = getLogFilename(LOG_ERR_BASENAME);
+  program.log_file[LOG_OUT_ID] = program.log_file_default[LOG_OUT_ID] = stdout;
+  program.log_file[LOG_ERR_ID] = program.log_file_default[LOG_ERR_ID] = stderr;
 }
 
 void SetWindowTitle()
@@ -138,7 +136,7 @@ void InitPlatformDependentStuff(void)
   updateUserGameDataDir();
 #endif
 
-  openErrorFile();
+  OpenLogFiles();
 
 #if defined(TARGET_SDL2)
   int sdl_init_flags = SDL_INIT_EVENTS      | SDL_INIT_NOPARACHUTE;
@@ -154,9 +152,7 @@ void InitPlatformDependentStuff(void)
 
 void ClosePlatformDependentStuff(void)
 {
-#if defined(PLATFORM_WIN32)
-  closeErrorFile();
-#endif
+  CloseLogFiles();
 }
 
 void InitGfxFieldInfo(int sx, int sy, int sxsize, int sysize,
@@ -175,6 +171,8 @@ void InitGfxFieldInfo(int sx, int sy, int sxsize, int sysize,
 
   gfx.field_save_buffer = field_save_buffer;
 
+  gfx.drawing_area_changed = FALSE;
+
   SetDrawDeactivationMask(REDRAW_NONE);                /* do not deactivate drawing */
   SetDrawBackgroundMask(REDRAW_NONE);          /* deactivate masked drawing */
 }
@@ -250,6 +248,11 @@ void InitGfxCustomArtworkInfo()
   gfx.draw_init_text = TRUE;
 }
 
+void InitGfxOtherSettings()
+{
+  gfx.cursor_mode = CURSOR_DEFAULT;
+}
+
 void SetDrawDeactivationMask(int draw_deactivation_mask)
 {
   gfx.draw_deactivation_mask = draw_deactivation_mask;
@@ -359,6 +362,8 @@ void InitVideoBuffer(int width, int height, int depth, boolean fullscreen)
 
   SDLInitVideoBuffer(&backbuffer, &window, fullscreen);
 
+  video.initialized = TRUE;
+
   drawto = backbuffer;
 }
 
@@ -468,6 +473,16 @@ boolean DrawingOnBackground(int x, int y)
          CheckDrawingArea(x, y, 1, 1, gfx.draw_background_mask));
 }
 
+boolean DrawingAreaChanged()
+{
+  int drawing_area_changed = gfx.drawing_area_changed;
+
+  // reset flag for change of drawing area after querying it
+  gfx.drawing_area_changed = FALSE;
+
+  return drawing_area_changed;
+}
+
 static boolean InClippedRectangle(Bitmap *bitmap, int *x, int *y,
                                  int *width, int *height, boolean is_dest)
 {
@@ -660,14 +675,6 @@ void ClearRectangleOnBackground(Bitmap *bitmap, int x, int y,
     ClearRectangle(bitmap, x, y, width, height);
 }
 
-void SetClipMask(Bitmap *bitmap, GC clip_gc, Pixmap clip_pixmap)
-{
-}
-
-void SetClipOrigin(Bitmap *bitmap, GC clip_gc, int clip_x, int clip_y)
-{
-}
-
 void BlitBitmapMasked(Bitmap *src_bitmap, Bitmap *dst_bitmap,
                      int src_x, int src_y, int width, int height,
                      int dst_x, int dst_y)
@@ -690,8 +697,6 @@ void BlitBitmapOnBackground(Bitmap *src_bitmap, Bitmap *dst_bitmap,
               dst_x, dst_y);
 
     /* draw foreground */
-    SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc,
-                 dst_x - src_x, dst_y - src_y);
     BlitBitmapMasked(src_bitmap, dst_bitmap, src_x, src_y, width, height,
                     dst_x, dst_y);
   }
@@ -774,16 +779,6 @@ Pixel GetPixelFromRGBcompact(Bitmap *bitmap, unsigned int color)
   return GetPixelFromRGB(bitmap, color_r, color_g, color_b);
 }
 
-/* execute all pending screen drawing operations */
-void FlushDisplay(void)
-{
-}
-
-/* execute and wait for all pending screen drawing operations */
-void SyncDisplay(void)
-{
-}
-
 void KeyboardAutoRepeatOn(void)
 {
 #if defined(TARGET_SDL2)
@@ -805,11 +800,6 @@ void KeyboardAutoRepeatOff(void)
 #endif
 }
 
-boolean PointerInWindow(DrawWindow *window)
-{
-  return TRUE;
-}
-
 boolean SetVideoMode(boolean fullscreen)
 {
   return SDLSetVideoMode(&backbuffer, fullscreen);
@@ -896,11 +886,57 @@ Bitmap *ZoomBitmap(Bitmap *src_bitmap, int zoom_width, int zoom_height)
   return dst_bitmap;
 }
 
-static void CreateScaledBitmaps(Bitmap *old_bitmap, int zoom_factor,
+static void SetMaskedBitmapSurface(Bitmap *bitmap)
+{
+  if (bitmap == NULL)
+    return;
+
+  SDL_Surface *surface = bitmap->surface;
+
+  if (bitmap->surface_masked)
+    SDL_FreeSurface(bitmap->surface_masked);
+
+  SDL_SetColorKey(surface, SET_TRANSPARENT_PIXEL,
+                 SDL_MapRGB(surface->format, 0x00, 0x00, 0x00));
+
+  if ((bitmap->surface_masked = SDLGetNativeSurface(surface)) == NULL)
+    Error(ERR_EXIT, "SDL_DisplayFormat() failed");
+
+  SDL_SetColorKey(surface, UNSET_TRANSPARENT_PIXEL, 0);
+}
+
+void ReCreateGameTileSizeBitmap(Bitmap **bitmaps)
+{
+  if (bitmaps[IMG_BITMAP_CUSTOM])
+  {
+    FreeBitmap(bitmaps[IMG_BITMAP_CUSTOM]);
+
+    bitmaps[IMG_BITMAP_CUSTOM] = NULL;
+  }
+
+  if (gfx.game_tile_size == gfx.standard_tile_size)
+  {
+    bitmaps[IMG_BITMAP_GAME] = bitmaps[IMG_BITMAP_STANDARD];
+
+    return;
+  }
+
+  Bitmap *bitmap = bitmaps[IMG_BITMAP_STANDARD];
+  int width  = bitmap->width  * gfx.game_tile_size / gfx.standard_tile_size;;
+  int height = bitmap->height * gfx.game_tile_size / gfx.standard_tile_size;;
+
+  Bitmap *bitmap_new = ZoomBitmap(bitmap, width, height);
+
+  bitmaps[IMG_BITMAP_CUSTOM] = bitmap_new;
+  bitmaps[IMG_BITMAP_GAME]   = bitmap_new;
+
+  SetMaskedBitmapSurface(bitmap_new);
+}
+
+static void CreateScaledBitmaps(Bitmap **bitmaps, int zoom_factor,
                                int tile_size, boolean create_small_bitmaps)
 {
-  Bitmap swap_bitmap;
-  Bitmap *new_bitmap;
+  Bitmap *old_bitmap = bitmaps[IMG_BITMAP_STANDARD];
   Bitmap *tmp_bitmap_final = NULL;
   Bitmap *tmp_bitmap_0 = NULL;
   Bitmap *tmp_bitmap_1 = NULL;
@@ -918,7 +954,7 @@ static void CreateScaledBitmaps(Bitmap *old_bitmap, int zoom_factor,
   int width_16, height_16;
   int width_32, height_32;
   int old_width, old_height;
-  int new_width, new_height;
+  int i;
 
   print_timestamp_init("CreateScaledBitmaps");
 
@@ -980,10 +1016,7 @@ static void CreateScaledBitmaps(Bitmap *old_bitmap, int zoom_factor,
 
       UPDATE_BUSY_STATE();
     }
-  }
 
-  if (create_small_bitmaps)
-  {
     /* calculate new image dimensions for small images */
     width_2  = width_1  / 2;
     height_2 = height_1 / 2;
@@ -1035,118 +1068,56 @@ static void CreateScaledBitmaps(Bitmap *old_bitmap, int zoom_factor,
       tmp_bitmap_32 = ZoomBitmap(tmp_bitmap_16, width_32, height_32);
 
     UPDATE_BUSY_STATE();
-  }
 
-  if (create_small_bitmaps)
-  {
-    new_width  = width_1;
-    new_height = height_1 + (height_1 + 1) / 2;     /* prevent odd height */
+    bitmaps[IMG_BITMAP_32x32] = tmp_bitmap_1;
+    bitmaps[IMG_BITMAP_16x16] = tmp_bitmap_2;
+    bitmaps[IMG_BITMAP_8x8]   = tmp_bitmap_4;
+    bitmaps[IMG_BITMAP_4x4]   = tmp_bitmap_8;
+    bitmaps[IMG_BITMAP_2x2]   = tmp_bitmap_16;
+    bitmaps[IMG_BITMAP_1x1]   = tmp_bitmap_32;
 
     if (width_0 != width_1)
-    {
-      new_width += width_0;
-      new_height = MAX(new_height, height_0);
-    }
+      bitmaps[IMG_BITMAP_CUSTOM] = tmp_bitmap_0;
 
-    new_bitmap = CreateBitmap(new_width, new_height, DEFAULT_DEPTH);
+    if (bitmaps[IMG_BITMAP_CUSTOM])
+      bitmaps[IMG_BITMAP_GAME] = bitmaps[IMG_BITMAP_CUSTOM];
+    else
+      bitmaps[IMG_BITMAP_GAME] = bitmaps[IMG_BITMAP_STANDARD];
 
-    if (width_0 != width_1)
-      BlitBitmap(tmp_bitmap_0, new_bitmap, 0, 0, width_0, height_0, width_1, 0);
-
-    BlitBitmap(tmp_bitmap_1, new_bitmap, 0, 0, width_1, height_1, 0, 0);
-    BlitBitmap(tmp_bitmap_2, new_bitmap, 0, 0, width_1 / 2, height_1 / 2,
-              0, height_1);
-    BlitBitmap(tmp_bitmap_4, new_bitmap, 0, 0, width_1 / 4, height_1 / 4,
-              width_1 / 2, height_1);
-    BlitBitmap(tmp_bitmap_8, new_bitmap, 0, 0, width_1 / 8, height_1 / 8,
-              3 * width_1 / 4, height_1);
-    BlitBitmap(tmp_bitmap_16, new_bitmap, 0, 0, width_1 / 16, height_1 / 16,
-              7 * width_1 / 8, height_1);
-    BlitBitmap(tmp_bitmap_32, new_bitmap, 0, 0, width_1 / 32, height_1 / 32,
-              15 * width_1 / 16, height_1);
+    boolean free_old_bitmap = TRUE;
 
-    UPDATE_BUSY_STATE();
-  }
-  else
-  {
-    new_width  = width_1;
-    new_height = height_1;
+    for (i = 0; i < NUM_IMG_BITMAPS; i++)
+      if (bitmaps[i] == old_bitmap)
+       free_old_bitmap = FALSE;
 
-    new_bitmap = tmp_bitmap_1; /* directly use tmp_bitmap_1 as new bitmap */
+    if (free_old_bitmap)
+      FreeBitmap(old_bitmap);
   }
-
-  if (create_small_bitmaps)
+  else
   {
-    /* if no small bitmaps created, tmp_bitmap_1 is used as new bitmap now */
-
-    if (tmp_bitmap_final != old_bitmap)
-      FreeBitmap(tmp_bitmap_final);
-
-    if (tmp_bitmap_0 != old_bitmap &&
-       tmp_bitmap_0 != tmp_bitmap_final)
-      FreeBitmap(tmp_bitmap_0);
-
-    if (tmp_bitmap_1 != old_bitmap &&
-       tmp_bitmap_1 != tmp_bitmap_final &&
-       tmp_bitmap_1 != tmp_bitmap_0)
-      FreeBitmap(tmp_bitmap_1);
-
-    if (tmp_bitmap_2 != old_bitmap)
-      FreeBitmap(tmp_bitmap_2);
-
-    if (tmp_bitmap_4 != old_bitmap)
-      FreeBitmap(tmp_bitmap_4);
-
-    if (tmp_bitmap_8 != old_bitmap)
-      FreeBitmap(tmp_bitmap_8);
-
-    if (tmp_bitmap_16 != old_bitmap)
-      FreeBitmap(tmp_bitmap_16);
-
-    if (tmp_bitmap_32 != old_bitmap)
-      FreeBitmap(tmp_bitmap_32);
+    bitmaps[IMG_BITMAP_32x32] = tmp_bitmap_1;
   }
 
-  /* replace image with extended image (containing 1/1, 1/2, 1/4, 1/8 size) */
-  swap_bitmap.surface = old_bitmap->surface;
-  old_bitmap->surface = new_bitmap->surface;
-  new_bitmap->surface = swap_bitmap.surface;
-
-  old_bitmap->width  = new_bitmap->width;
-  old_bitmap->height = new_bitmap->height;
-
-  /* this replaces all blit masks created when loading -- maybe optimize this */
-  {
-    SDL_Surface *old_surface = old_bitmap->surface;
-
-    if (old_bitmap->surface_masked)
-      SDL_FreeSurface(old_bitmap->surface_masked);
-
-    SDL_SetColorKey(old_surface, SET_TRANSPARENT_PIXEL,
-                   SDL_MapRGB(old_surface->format, 0x00, 0x00, 0x00));
-
-    if ((old_bitmap->surface_masked = SDLGetNativeSurface(old_surface)) == NULL)
-      Error(ERR_EXIT, "SDL_DisplayFormat() failed");
-
-    SDL_SetColorKey(old_surface, UNSET_TRANSPARENT_PIXEL, 0);
-  }
+  // create corresponding bitmaps for masked blitting
+  for (i = 0; i < NUM_IMG_BITMAPS; i++)
+    if (bitmaps[i] != NULL &&
+       bitmaps[i] != old_bitmap)
+      SetMaskedBitmapSurface(bitmaps[i]);
 
   UPDATE_BUSY_STATE();
 
-  FreeBitmap(new_bitmap);      /* this actually frees the _old_ bitmap now */
-
   print_timestamp_done("CreateScaledBitmaps");
 }
 
-void CreateBitmapWithSmallBitmaps(Bitmap *old_bitmap, int zoom_factor,
+void CreateBitmapWithSmallBitmaps(Bitmap **bitmaps, int zoom_factor,
                                  int tile_size)
 {
-  CreateScaledBitmaps(old_bitmap, zoom_factor, tile_size, TRUE);
+  CreateScaledBitmaps(bitmaps, zoom_factor, tile_size, TRUE);
 }
 
-void ScaleBitmap(Bitmap *old_bitmap, int zoom_factor)
+void ScaleBitmap(Bitmap **bitmaps, int zoom_factor)
 {
-  CreateScaledBitmaps(old_bitmap, zoom_factor, 0, FALSE);
+  CreateScaledBitmaps(bitmaps, zoom_factor, 0, FALSE);
 }
 
 
@@ -1294,6 +1265,8 @@ void SetMouseCursor(int mode)
                mode == CURSOR_PLAYFIELD ? cursor_playfield : NULL);
 
   SDLSetMouseCursor(cursor_new);
+
+  gfx.cursor_mode = mode;
 }