+ 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);
+}
+
+
+/* ------------------------------------------------------------------------- */
+/* mouse pointer functions */
+/* ------------------------------------------------------------------------- */
+
+#if !defined(PLATFORM_MSDOS)
+#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;
+#else
+/* some people complained about a "white dot" on the screen and thought it
+ was a graphical error... OK, let's just remove the whole pointer :-) */
+static const char **cursor_image_playfield = cursor_image_none;
+#endif
+
+#if defined(TARGET_SDL)
+static const int cursor_bit_order = BIT_ORDER_MSB;
+#elif defined(TARGET_X11_NATIVE)
+static const int cursor_bit_order = BIT_ORDER_LSB;
+#endif
+
+static struct MouseCursorInfo *get_cursor_from_image(const char **image)
+{
+ struct MouseCursorInfo *cursor;
+ boolean bit_order_msb = (cursor_bit_order == BIT_ORDER_MSB);
+ int header_lines = 4;
+ int x, y, i;
+
+ cursor = checked_calloc(sizeof(struct MouseCursorInfo));