+ if (create_small_bitmaps)
+ {
+ new_width = width_1;
+ new_height = height_1 + (height_1 + 1) / 2; /* prevent odd height */
+
+ new_bitmap = CreateBitmap(new_width, new_height, DEFAULT_DEPTH);
+
+ 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 (zoom_factor != 1)
+ FreeBitmap(tmp_bitmap_1);
+
+ if (zoom_factor != 2)
+ FreeBitmap(tmp_bitmap_2);
+
+ if (zoom_factor != 4)
+ FreeBitmap(tmp_bitmap_4);
+
+ if (zoom_factor != 8)
+ FreeBitmap(tmp_bitmap_8);
+
+ if (zoom_factor != 16)
+ FreeBitmap(tmp_bitmap_16);
+
+ if (zoom_factor != 32)
+ FreeBitmap(tmp_bitmap_32);
+ }
+
+ /* replace image with extended image (containing 1/1, 1/2, 1/4, 1/8 size) */
+#if defined(TARGET_SDL)
+ swap_bitmap.surface = old_bitmap->surface;
+ old_bitmap->surface = new_bitmap->surface;
+ new_bitmap->surface = swap_bitmap.surface;
+#else
+ swap_bitmap.drawable = old_bitmap->drawable;
+ old_bitmap->drawable = new_bitmap->drawable;
+ new_bitmap->drawable = swap_bitmap.drawable;
+#endif
+
+ old_bitmap->width = new_bitmap->width;
+ old_bitmap->height = new_bitmap->height;
+
+#if 1
+ /* this replaces all blit masks created when loading -- maybe optimize this */
+ {
+#if defined(TARGET_X11)
+ if (old_bitmap->clip_mask)
+ XFreePixmap(display, old_bitmap->clip_mask);
+
+ old_bitmap->clip_mask =
+ Pixmap_to_Mask(old_bitmap->drawable, new_width, new_height);
+
+ XSetClipMask(display, old_bitmap->stored_clip_gc, old_bitmap->clip_mask);
+#else
+ SDL_Surface *old_surface = old_bitmap->surface;
+
+ if (old_bitmap->surface_masked)
+ SDL_FreeSurface(old_bitmap->surface_masked);
+
+ SDL_SetColorKey(old_surface, SDL_SRCCOLORKEY,
+ SDL_MapRGB(old_surface->format, 0x00, 0x00, 0x00));
+ if ((old_bitmap->surface_masked = SDL_DisplayFormat(old_surface)) ==NULL)
+ Error(ERR_EXIT, "SDL_DisplayFormat() failed");
+ SDL_SetColorKey(old_surface, 0, 0); /* reset transparent pixel */
+#endif
+ }
+#endif
+
+ UPDATE_BUSY_STATE();
+
+ FreeBitmap(new_bitmap); /* this actually frees the _old_ bitmap now */
+}
+
+void CreateBitmapWithSmallBitmaps(Bitmap *old_bitmap, int zoom_factor)
+{
+ CreateScaledBitmaps(old_bitmap, zoom_factor, TRUE);
+}
+
+void ScaleBitmap(Bitmap *old_bitmap, int zoom_factor)
+{
+ CreateScaledBitmaps(old_bitmap, zoom_factor, FALSE);