+ if (width_0 != width_1)
+ {
+ new_width += width_0;
+ new_height = MAX(new_height, height_0);
+ }
+
+ new_bitmap = CreateBitmap(new_width, new_height, DEFAULT_DEPTH);
+
+ 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);
+
+ UPDATE_BUSY_STATE();
+ }
+ else
+ {
+ new_width = width_1;
+ new_height = height_1;
+
+ new_bitmap = tmp_bitmap_1; /* directly use tmp_bitmap_1 as new bitmap */
+ }
+
+ if (create_small_bitmaps)
+ {
+ /* 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);
+ }
+
+ /* 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);
+ }
+
+ 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,
+ int tile_size)
+{
+ CreateScaledBitmaps(old_bitmap, zoom_factor, tile_size, TRUE);
+}
+
+void ScaleBitmap(Bitmap *old_bitmap, int zoom_factor)
+{
+ CreateScaledBitmaps(old_bitmap, zoom_factor, 0, FALSE);
+}
+
+
+/* ------------------------------------------------------------------------- */
+/* mouse pointer functions */
+/* ------------------------------------------------------------------------- */
+
+#define USE_ONE_PIXEL_PLAYFIELD_MOUSEPOINTER 0
+
+/* XPM image definitions */
+static const char *cursor_image_none[] =
+{
+ /* width height num_colors chars_per_pixel */
+ " 16 16 3 1",
+
+ /* colors */
+ "X c #000000",
+ ". c #ffffff",
+ " c None",
+
+ /* pixels */
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+
+ /* hot spot */
+ "0,0"
+};
+
+#if USE_ONE_PIXEL_PLAYFIELD_MOUSEPOINTER
+static const char *cursor_image_dot[] =
+{
+ /* width height num_colors chars_per_pixel */
+ " 16 16 3 1",
+
+ /* colors */
+ "X c #000000",
+ ". c #ffffff",
+ " c None",
+
+ /* pixels */
+ " X ",
+ "X.X ",
+ " X ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+
+ /* hot spot */
+ "1,1"
+};
+static const char **cursor_image_playfield = cursor_image_dot;