+
+ 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_8, new_bitmap, 0, 0, width_1 / 8, height_1 / 8,
+ 3 * width_1 / 4, height_1);
+
+ if (zoom_factor != 1)
+ FreeBitmap(tmp_bitmap_1);
+
+ if (zoom_factor != 2)
+ FreeBitmap(tmp_bitmap_2);
+
+ if (zoom_factor != 8)
+ FreeBitmap(tmp_bitmap_8);
+
+#if 0
+
+#if defined(TARGET_SDL)
+ /* !!! what about the old old_bitmap->surface ??? FIX ME !!! */
+ old_bitmap->surface = new_bitmap->surface;
+ new_bitmap->surface = NULL;
+#else
+ /* !!! see above !!! */
+ old_bitmap->drawable = new_bitmap->drawable;
+ new_bitmap->drawable = None;
+#endif
+
+#else
+
+ /* replace image with extended image (containing normal, 1/2 and 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
+
+#endif
+
+ old_bitmap->width = new_bitmap->width;
+ old_bitmap->height = new_bitmap->height;
+
+ FreeBitmap(new_bitmap);
+}
+
+
+/* ------------------------------------------------------------------------- */
+/* mouse pointer functions */
+/* ------------------------------------------------------------------------- */
+
+#if !defined(PLATFORM_MSDOS)
+/* XPM */
+static const char *cursor_image_playfield[] =
+{
+ /* width height num_colors chars_per_pixel */
+ " 16 16 3 1",
+
+ /* colors */
+ "X c #000000",
+ ". c #ffffff",
+ " c None",
+
+#if 1
+ /* 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 :-) */
+
+ /* pixels */
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+
+ /* hot spot */
+ "0,0"
+#else
+ /* pixels */
+ " X ",
+ "X.X ",
+ " X ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+
+ /* hot spot */
+ "1,1"
+#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));
+
+ sscanf(image[0], " %d %d ", &cursor->width, &cursor->height);
+
+ i = -1;
+ for (y = 0; y < cursor->width; y++)