rnd-20040816-2-src
authorHolger Schemel <info@artsoft.org>
Mon, 16 Aug 2004 01:11:24 +0000 (03:11 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:47:40 +0000 (10:47 +0200)
* fixed big memory leak in function "CreateBitmapWithSmallBitmaps()"
  (which creates scaled down graphics for level editor and preview);
  there's still a memory leak somewhere in the artwork handling code
* added "scale image up" functionality to X11 version of zoom function

17 files changed:
ChangeLog
src/conftime.h
src/libem/cave.c
src/libem/convert.c
src/libem/graphics.c
src/libem/init.c
src/libem/input.c
src/libem/main.c
src/libem/sound.c
src/libem/synchro_1.c
src/libem/synchro_2.c
src/libem/synchro_3.c
src/libem/tab_generate.c
src/libem/ulaw_generate.c
src/libgame/image.c
src/libgame/sdl.c
src/libgame/system.c

index 8abe1ff2318e080e5257c16076d773f3f7090fc5..eebef01e11ca62e22e3e26498f1f5bd9727a3d5d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2004-08-16
+       * fixed big memory leak in function "CreateBitmapWithSmallBitmaps()"
+         (which creates scaled down graphics for level editor and preview);
+         there's still a memory leak somewhere in the artwork handling code
+       * added "scale image up" functionality to X11 version of zoom function
+
 2004-08-07
        * fixed bug in gadget code which caused reset of CEs in level editor
          (example: pressing 'b' [grab brush] on CE config page erased values)
index d022fcf195c00cb2a89702c8c0199e01e733d862..9883f12cd700ef8bc1f4789a09ad6be80fccb8b9 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2004-08-16 00:11]"
+#define COMPILE_DATE_STRING "[2004-08-16 03:09]"
index 25de9a5718bd2820dd77567792cd8df758cdf886..60478c28ef84bbcb623e9fa44ac2d88247766385 100644 (file)
@@ -1,3 +1,6 @@
+
+#if defined(TARGET_X11)
+
 /* 2000-08-10T16:43:50Z
  *
  * cave data structures
@@ -147,3 +150,5 @@ void free_cave_list(void)
        }
        cave_list = 0;
 }
+
+#endif
index fdd58537170e6570c1243012a7834e44acedae74..18f52e189b0414a44b752d09da07d430b4e4ac3e 100644 (file)
@@ -1,3 +1,6 @@
+
+#if defined(TARGET_X11)
+
 /* 2000-08-20T09:41:18Z
  *
  * identify all emerald mine caves and turn them into v6 format.
@@ -391,3 +394,5 @@ void convert_emerald(unsigned char *src)
        for(y = 0; y < HEIGHT; y++) for(x = 0; x < WIDTH; x++) Next[y][x] = Cave[y][x];
        for(y = 0; y < HEIGHT; y++) for(x = 0; x < WIDTH; x++) Draw[y][x] = Cave[y][x];
 }
+
+#endif
index fb667b6e24da948ca7690644a7a87a29263d0fbd..6b640db11b4b19ae8cb3ab5a5f89528ea8312668 100644 (file)
@@ -1,3 +1,6 @@
+
+#if defined(TARGET_X11)
+
 /* 2000-08-13T14:36:17Z
  *
  * graphics manipulation crap
@@ -393,3 +396,5 @@ void title_string(unsigned int y, unsigned int left, unsigned int right, char *s
        }
        XSetClipMask(display, screenGC, None);
 }
+
+#endif
index 33012f9c74f6d3a77cc2db0f3db1ed30bfc1fa3d..72283c7e5f6223f2fa151da8b765688edf9888f1 100644 (file)
@@ -1,3 +1,6 @@
+
+#if defined(TARGET_X11)
+
 /* 2000-08-10T18:03:54Z
  *
  * open X11 display and sound
@@ -117,6 +120,7 @@ static int gotWhite;
 
 #if 1
 static Bitmap *pcxBitmaps[4];
+static Bitmap *pcxBitmapsX2[4];
 #endif
 
 #if 0
@@ -341,6 +345,27 @@ int open_all(void)
        ttlmaskBitmap = pcxBitmaps[3]->clip_mask;
 #endif
 
+#if 0
+       for (i = 0; i < 4; i++)
+         pcxBitmapsX2[i] = ZoomBitmap(pcxBitmaps[i],
+                                      pcxBitmaps[i]->width * 2,
+                                      pcxBitmaps[i]->height * 2);
+
+       objBitmap = pcxBitmapsX2[0];
+       botBitmap = pcxBitmapsX2[1];
+       sprBitmap = pcxBitmapsX2[2];
+       ttlBitmap = pcxBitmapsX2[3];
+
+       objPixmap = pcxBitmapsX2[0]->drawable;
+       botPixmap = pcxBitmapsX2[1]->drawable;
+       sprPixmap = pcxBitmapsX2[2]->drawable;
+       ttlPixmap = pcxBitmapsX2[3]->drawable;
+       objmaskBitmap = pcxBitmapsX2[0]->clip_mask;
+       botmaskBitmap = pcxBitmapsX2[1]->clip_mask;
+       sprmaskBitmap = pcxBitmapsX2[2]->clip_mask;
+       ttlmaskBitmap = pcxBitmapsX2[3]->clip_mask;
+#endif
+
 #if 1
        screenBitmap = CreateBitmap(22 * TILEX, 14 * TILEY, DEFAULT_DEPTH);
        scoreBitmap = CreateBitmap(20 * TILEX, SCOREY, DEFAULT_DEPTH);
@@ -577,3 +602,5 @@ static int xpmFreeColoursFunc(Display *display, Colormap colourmap, unsigned lon
        if(colourmap != privateColourmap) XFreeColors(display, colourmap, pixels, npixels, 0);
        return(1); /* non-zero for success */
 }
+
+#endif
index 3ccf6a4f690d4d3b5c849e061b1880fb5052e5a2..2aafb6650a78f2742b4bdb118f5ecd954a8f4a21 100644 (file)
@@ -1,3 +1,6 @@
+
+#if defined(TARGET_X11)
+
 /* 2000-08-13T15:29:40Z
  *
  * handle input from x11 and keyboard and joystick
@@ -323,3 +326,5 @@ void input_eventloop(void)
        input_esc = 0;
        for(i = 0; i < 1; i++) if(keymatrix[escKeyCode[i] >> 3] & 1 << (escKeyCode[i] & 7)) input_esc = 1;
 }
+
+#endif
index ca79044c2320c96a9295b44dfd363ce02e7052d9..71376b28fe2f5180cdecf0714191b03aa273b6c0 100644 (file)
@@ -1,3 +1,6 @@
+
+#if defined(TARGET_X11)
+
 /* Emerald Mine
  * 
  * David Tritscher
@@ -99,3 +102,13 @@ void snprintf_overflow(char *description)
        fprintf(stderr, "%s %s\n", "Fault occured while attempting to", description);
        abort();
 }
+
+#else
+
+int em_main()
+{
+  /* temporary dummy until X11->SDL conversion finished */
+  return 0;
+}
+
+#endif
index 57fec5a13c2fb7893b9436e7f8e38c42b1758031..4f89139e3485d25ae287a526aafcf69c3484ae1b 100644 (file)
@@ -1,3 +1,6 @@
+
+#if defined(TARGET_X11)
+
 /* 2000-08-10T17:39:15Z
  *
  * handle sounds in emerald mine
@@ -335,3 +338,5 @@ fail:
 }
 
 #endif /* defined(PLATFORM_LINUX) || defined(PLATFORM_BSD) */
+
+#endif
index 8b2f47f8e78ceb5839cea135463b1c8055b4e7b1..9f4309c5acd2ff3bcdc569758a643436d29e85c9 100644 (file)
@@ -1,4 +1,6 @@
 
+#if defined(TARGET_X11)
+
 /* first part of synchro.
  *
  * game logic for players.
@@ -792,3 +794,5 @@ static void player(struct PLAYER *ply)
                }
        }
 }
+
+#endif
index 731e9faaad31deaea51db5dfb5ca76ee342119d6..8dc7846354fe62dc52daed77c52c39955a0e3123 100644 (file)
@@ -1,4 +1,6 @@
 
+#if defined(TARGET_X11)
+
 /* second part of synchro.
  *
  * game logic for monsters.
@@ -3811,3 +3813,5 @@ done:
                void *temp = Cave; Cave = Next; Next = Draw; Draw = temp; /* triple buffering */
        }
 }
+
+#endif
index 1d85e6bbc4764df26bcf87ceefef8bf4a625502c..e0b86f97e7571121823bcdf0c4b1c0e20dd7c092 100644 (file)
@@ -1,4 +1,6 @@
 
+#if defined(TARGET_X11)
+
 /* third part of synchro.
  *
  * handle global elements.
@@ -86,3 +88,5 @@ void synchro_3(void)
                Next[y][x] = Cave[y][x];
        }
 }
+
+#endif
index d11cc77ad6be06456a81e47fa975b6b33906282b..22ffef4cf534b578393941def6b40dcbcf02bebf 100644 (file)
@@ -1,3 +1,6 @@
+
+#if defined(TARGET_X11)
+
 /* 2000-04-19T13:26:05Z
  *
  * construct some tables to be included directly in emerald mine source.
@@ -4678,3 +4681,5 @@ void tab_generate()
   create_spr();
   create_ttl();
 }
+
+#endif
index b877b76d77d57c7f6fc35158d6c60bff0578c812..5a8453c95d729eee5dcb9d59d146bba19be7c82f 100644 (file)
@@ -1,3 +1,6 @@
+
+#if defined(TARGET_X11)
+
 /* 2000-08-10T04:29:10Z
  *
  * generate ulaw<->linear conversion tables to be included
@@ -174,3 +177,5 @@ unsigned char calc_linear_to_ulaw(int sample)
 }
 
 #endif /* defined(PLATFORM_LINUX) || defined(PLATFORM_BSD) */
+
+#endif
index 977111f442092dfd43895a9d0677ad6b265b3adc..42c3384a0cd6c8f518b97138750a370de561134c 100644 (file)
@@ -569,8 +569,8 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
   -----------------------------------------------------------------------------
   ZoomPixmap
 
-  Important note: The scaling code currently only supports scaling down the
-  image by a power of 2 -- scaling up is currently not supported at all!
+  Important note: The scaling code currently only supports scaling of the image
+  up or down by a power of 2 -- other scaling factors currently not supported!
   -----------------------------------------------------------------------------
 */
 
@@ -582,13 +582,29 @@ void ZoomPixmap(Display *display, GC gc, Pixmap src_pixmap, Pixmap dst_pixmap,
   byte *src_ptr, *dst_ptr;
   int bits_per_pixel;
   int bytes_per_pixel;
-  int x, y, i;
+  int x, y, xx, yy, i;
+#if 1
+  boolean scale_down = (src_width > dst_width);
+  int zoom_factor;
+#else
   int zoom_factor = src_width / dst_width;     /* currently very limited! */
+#endif
   int row_skip, col_skip;
 
-  /* adjust source image size to integer multiple of destination image size */
-  src_width  = dst_width  * zoom_factor;
-  src_height = dst_height * zoom_factor;
+  if (scale_down)
+  {
+    zoom_factor = src_width / dst_width;
+
+    /* adjust source image size to integer multiple of destination size */
+    src_width  = dst_width  * zoom_factor;
+    src_height = dst_height * zoom_factor;
+  }
+  else
+  {
+    zoom_factor = dst_width / src_width;
+
+    /* no adjustment needed when scaling up (some pixels may be left blank) */
+  }
 
   /* copy source pixmap to temporary image */
   src_ximage = XGetImage(display, src_pixmap, 0, 0, src_width, src_height,
@@ -607,14 +623,40 @@ void ZoomPixmap(Display *display, GC gc, Pixmap src_pixmap, Pixmap dst_pixmap,
   src_ptr = (byte *)src_ximage->data;
   dst_ptr = (byte *)dst_ximage->data;
 
-  col_skip = (zoom_factor - 1) * bytes_per_pixel;
-  row_skip = col_skip * src_width;
+  if (scale_down)
+  {
+    col_skip = (zoom_factor - 1) * bytes_per_pixel;
+    row_skip = col_skip * src_width;
+
+    /* scale image down by scaling factor 'zoom_factor' */
+    for (y = 0; y < src_height; y += zoom_factor, src_ptr += row_skip)
+      for (x = 0; x < src_width; x += zoom_factor, src_ptr += col_skip)
+       for (i = 0; i < bytes_per_pixel; i++)
+         *dst_ptr++ = *src_ptr++;
+  }
+  else
+  {
+    row_skip = src_width * bytes_per_pixel;
+
+    /* scale image up by scaling factor 'zoom_factor' */
+    for (y = 0; y < src_height; y++)
+    {
+      for (yy = 0; yy < zoom_factor; yy++)
+      {
+       if (yy > 0)
+         src_ptr -= row_skip;
+
+       for (x = 0; x < src_width; x++)
+       {
+         for (xx = 0; xx < zoom_factor; xx++)
+           for (i = 0; i < bytes_per_pixel; i++)
+             *dst_ptr++ = *(src_ptr + i);
 
-  /* scale image down by scaling factor 'zoom_factor' */
-  for (y = 0; y < src_height; y += zoom_factor, src_ptr += row_skip)
-    for (x = 0; x < src_width; x += zoom_factor, src_ptr += col_skip)
-      for (i = 0; i < bytes_per_pixel; i++)
-       *dst_ptr++ = *src_ptr++;
+         src_ptr += i;
+       }
+      }
+    }
+  }
 
   /* copy scaled image to destination pixmap */
   XPutImage(display, dst_pixmap, gc, dst_ximage, 0, 0, 0, 0,
index e9d10df51f3a8103acb3520b27615e00cb487e1c..1bc222a958c49c227bfc9fa9a6a23bf853cd8a33 100644 (file)
@@ -1116,9 +1116,8 @@ int zoomSurfaceY(SDL_Surface * src, SDL_Surface * dst)
   -----------------------------------------------------------------------------
   zoomSurface()
 
-  Zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
+  Zooms a 32bit or 8bit 'src' surface to newly created 'dst' surface.
   'zoomx' and 'zoomy' are scaling factors for width and height.
-  If 'smooth' is 1 then the destination 32bit surface is anti-aliased.
   If the surface is not 8bit or 32bit RGBA/ABGR it will be converted
   into a 32bit RGBA format on the fly.
   -----------------------------------------------------------------------------
index 8f26dc77fb97e7933f5ed2f24c71d453b0dfd5d9..93d251e9d37bb86cb74596cfe9cfc298af92b07f 100644 (file)
@@ -814,6 +814,7 @@ Bitmap *ZoomBitmap(Bitmap *src_bitmap, int zoom_width, int zoom_height)
 
 void CreateBitmapWithSmallBitmaps(Bitmap *src_bitmap)
 {
+  Bitmap swap_bitmap;
   Bitmap *tmp_bitmap, *tmp_bitmap_2, *tmp_bitmap_8;
   int src_width, src_height;
   int tmp_width, tmp_height;
@@ -838,6 +839,8 @@ void CreateBitmapWithSmallBitmaps(Bitmap *src_bitmap)
   FreeBitmap(tmp_bitmap_2);
   FreeBitmap(tmp_bitmap_8);
 
+#if 0
+
 #if defined(TARGET_SDL)
   /* !!! what about the old src_bitmap->surface ??? FIX ME !!! */
   src_bitmap->surface = tmp_bitmap->surface;
@@ -846,6 +849,20 @@ void CreateBitmapWithSmallBitmaps(Bitmap *src_bitmap)
   /* !!! see above !!! */
   src_bitmap->drawable = tmp_bitmap->drawable;
   tmp_bitmap->drawable = None;
+#endif
+
+#else
+
+#if defined(TARGET_SDL)
+  swap_bitmap.surface = src_bitmap->surface;
+  src_bitmap->surface = tmp_bitmap->surface;
+  tmp_bitmap->surface = swap_bitmap.surface;
+#else
+  swap_bitmap.drawable = src_bitmap->drawable;
+  src_bitmap->drawable = tmp_bitmap->drawable;
+  tmp_bitmap->drawable = swap_bitmap.drawable;
+#endif
+
 #endif
 
   src_bitmap->height = tmp_bitmap->height;