rnd-19981113-3
authorHolger Schemel <info@artsoft.org>
Fri, 13 Nov 1998 20:02:27 +0000 (21:02 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:31:45 +0000 (10:31 +0200)
src/Makefile
src/files.c
src/image.c
src/image.h

index a6ab699696ebb7356b22370b2e205af465a34d1a..6dc3a1a2480e7645034ce1ae99dbfa051f5ff3dd 100644 (file)
 CC = gcc
 
 # on Solaris and similar systems, you'll need to uncomment this
-EXTRA_LIBS = -lnsl -lsocket 
+EXTRA_LIBS = -lnsl -lsocket 
 
-# specify path to X11 on your system
-# X11_PATH = /usr/X11
-X11_PATH = /local/X11
+# specify X11 library path on your system
+XLIB_PATH = /usr/X11/lib
 
 # change this to the directory where you want to install game data like levels
 GAME_DIR = .
@@ -73,12 +72,7 @@ DEBUG = -DDEBUG -g -Wall
 # LIBS = -L/usr/X11R6/lib -lX11 -lm
 
 # LIBS = -L/usr/X11R6/lib $(EXTRA_X11_LIBS) -lX11 -lm $(EXTRA_LIBS)
-
-XINC_PATH = $(X11_PATH)/include
-XLIB_PATH = $(X11_PATH)/lib
-
-INCL = -I$(XINC_PATH)
-LIBS = -L$(XLIB_PATH) $(EXTRA_X11_LIBS) -lX11 -lm $(EXTRA_LIBS) -R$(XLIB_PATH)
+LIBS = -L$(XLIB_PATH) $(EXTRA_X11_LIBS) -lX11 -lm $(EXTRA_LIBS)
 
 # CFLAGS = -O2 $(CONFIG) $(SYSTEM)
 CFLAGS = $(DEBUG) $(CONFIG) $(SYSTEM) $(INCL)
@@ -136,3 +130,10 @@ clean:
 
 backup:
        ./make_backup.sh
+
+depend:
+       for i in $(SRCS); do $(CPP) $(CFLAGS) -M $$i; done > .depend
+
+ifeq (.depend,$(wildcard .depend))
+include .depend
+endif
index fc7d7a940bc0dff11ad34fd02178a3ee3cf02965..ac1b0fa74a380246fa12e2f8880e3240648f6fae 100644 (file)
@@ -495,9 +495,6 @@ void LoadScore(int level_nr)
 
   for(i=0; i<MAX_SCORE_ENTRIES; i++)
   {
-    int position_nr;
-
-    fscanf(file, "%d", &position_nr);
     fscanf(file, "%d", &highscore[i].Score);
     fgets(line, MAX_LINE_LEN, file);
 
@@ -539,7 +536,7 @@ void SaveScore(int level_nr)
   fprintf(file, "%s\n\n", SCORE_COOKIE);
 
   for(i=0; i<MAX_SCORE_ENTRIES; i++)
-    fprintf(file, "%d %d %s\n", i+1, highscore[i].Score, highscore[i].Name);
+    fprintf(file, "%d %s\n", highscore[i].Score, highscore[i].Name);
 
   fclose(file);
 
index b0a8a1d50a57c2aeab396130d7d1aa51f7021a1f..cfd42ace044d963f89bacc1f2d5efbad8134125e 100644 (file)
@@ -40,9 +40,14 @@ static void Image_to_Mask(Image *image)
   src_ptr = image->data;
   dst_ptr = image->data_mask;
 
+  /* create bitmap data which can be used by 'XCreateBitmapFromData()'
+   * directly to create a pixmap of depth 1 for use as a clip mask for
+   * the corresponding image pixmap
+   */
+
   for (y=0; y<image->height; y++)
   {
-    bitmask = 0x80;            /* start with leftmost bit in the byte     */
+    bitmask = 0x01;            /* start with leftmost bit in the byte     */
     dst_ptr2 = dst_ptr;                /* start with leftmost byte in the row     */
 
     for (x=0; x<image->width; x++)
@@ -50,9 +55,9 @@ static void Image_to_Mask(Image *image)
       if (*src_ptr++)          /* source pixel solid? (pixel index != 0)  */
        *dst_ptr2 |= bitmask;   /* then write a bit into the image mask    */
 
-      if ((bitmask >>= 1) == 0)        /* bit at rightmost byte position reached? */
+      if ((bitmask <<= 1) == 0)        /* bit at rightmost byte position reached? */
       {
-       bitmask = 0x80;         /* start again with leftmost bit position  */
+       bitmask = 0x01;         /* start again with leftmost bit position  */
        dst_ptr2++;             /* continue with next byte in image mask   */
       }
     }
@@ -62,48 +67,33 @@ static void Image_to_Mask(Image *image)
 }
 
 static boolean XImage_to_Pixmap(Display *display, Window parent,
-                               XImageInfo *ximageinfo)
+                               XImageInfo *ximageinfo, Image *image)
 {
-  XGCValues gcv;
-
-  ximageinfo->pixmap =
-    XCreatePixmap(display, parent,
-                 ximageinfo->ximage->width,
-                 ximageinfo->ximage->height,
-                 ximageinfo->depth);
-
-  ximageinfo->pixmap_mask =
-    XCreatePixmap(display, parent,
-                 ximageinfo->ximage->width,
-                 ximageinfo->ximage->height,
-                 1);
+  ximageinfo->pixmap = XCreatePixmap(display, parent,
+                                    ximageinfo->ximage->width,
+                                    ximageinfo->ximage->height,
+                                    ximageinfo->depth);
 
   /* build and cache the GC */
 
   if (!ximageinfo->gc)
   {
-    gcv.function = GXcopy;
-    ximageinfo->gc =
-      XCreateGC(ximageinfo->display, ximageinfo->pixmap,
-               GCFunction, &gcv);
-  }
+    XGCValues gcv;
 
-  if (!ximageinfo->gc_mask)
-  {
     gcv.function = GXcopy;
-    gcv.foreground = ximageinfo->foreground;
-    gcv.background = ximageinfo->background;
-    ximageinfo->gc_mask =
-      XCreateGC(ximageinfo->display, ximageinfo->pixmap_mask,
-               GCFunction | GCForeground | GCBackground, &gcv);
+    ximageinfo->gc = XCreateGC(ximageinfo->display, ximageinfo->pixmap,
+                              GCFunction, &gcv);
   }
 
   XPutImage(ximageinfo->display, ximageinfo->pixmap, ximageinfo->gc,
            ximageinfo->ximage, 0, 0, 0, 0,
            ximageinfo->ximage->width, ximageinfo->ximage->height);
-  XPutImage(ximageinfo->display, ximageinfo->pixmap_mask, ximageinfo->gc_mask,
-           ximageinfo->ximage_mask, 0, 0, 0, 0,
-           ximageinfo->ximage->width, ximageinfo->ximage->height);
+
+  ximageinfo->pixmap_mask = XCreateBitmapFromData(ximageinfo->display,
+                                                 parent,
+                                                 image->data_mask,
+                                                 image->width,
+                                                 image->height);
 
   return (ximageinfo->pixmap != None && ximageinfo->pixmap_mask != None);
 }
@@ -147,16 +137,12 @@ XImageInfo *Image_to_XImage(Display *display, int screen, Visual *visual,
   static int num_cmap_entries, free_cmap_entries;
   static boolean private_cmap = FALSE;
   Pixel *redvalue, *greenvalue, *bluevalue;
-  unsigned int a, c=0, x, y, linelen, dpixlen, dbits;
+  unsigned int a, c = 0, x, y, dpixlen, dbits;
   XColor xcolor;
-  XGCValues gcv;
   XImageInfo *ximageinfo;
 
   /* for building image */
-  byte *data, *destptr, *srcptr;
-
-  /* for building image mask */
-  byte *data_mask;
+  byte *data, *src_ptr, *dst_ptr;
 
   if (!global_cmap)
   {
@@ -179,11 +165,8 @@ XImageInfo *Image_to_XImage(Display *display, int screen, Visual *visual,
   ximageinfo->drawable = None;
   ximageinfo->index = NULL;
   ximageinfo->rootimage = FALSE;
-  ximageinfo->foreground = ximageinfo->background= 0;
   ximageinfo->gc = NULL;
-  ximageinfo->gc_mask = NULL;
   ximageinfo->ximage = NULL;
-  ximageinfo->ximage_mask = NULL;
 
   switch (visual->class)
   {
@@ -205,8 +188,7 @@ XImageInfo *Image_to_XImage(Display *display, int screen, Visual *visual,
       retry_direct: /* tag we hit if a DirectColor allocation fails on
                     * default colormap */
 
-      /* calculate number of distinct colors in each band
-       */
+      /* calculate number of distinct colors in each band */
 
       redcolors = greencolors = bluecolors = 1;
       for (pixval=1; pixval; pixval <<= 1)
@@ -219,15 +201,12 @@ XImageInfo *Image_to_XImage(Display *display, int screen, Visual *visual,
          bluecolors <<= 1;
       }
       
-      /* sanity check
-       */
+      /* sanity check */
 
-      if ((redcolors > visual->map_entries) ||
-         (greencolors > visual->map_entries) ||
-         (bluecolors > visual->map_entries))
-      {
-       fprintf(stderr, "Warning: inconsistency in color information (this may be ugly)\n");
-      }
+      if (redcolors > visual->map_entries ||
+         greencolors > visual->map_entries ||
+         bluecolors > visual->map_entries)
+       Error(ERR_WARN, "inconsistency in color information");
 
       redstep = 256 / redcolors;
       greenstep = 256 / greencolors;
@@ -417,14 +396,14 @@ XImageInfo *Image_to_XImage(Display *display, int screen, Visual *visual,
       break;
   
     default:
-      printf("Sorry, only DirectColor, TrueColor and PseudoColor supported\n");
-      exit(0);
+      Error(ERR_RETURN, "display type not supported");
+      Error(ERR_EXIT, "DirectColor, TrueColor or PseudoColor display needed");
       break;
   }
 
 #ifdef DEBUG_TIMING
   count2 = Counter();
-  printf("   CONVERTING IMAGE TO XIMAGE (COLORMAP) IN %.2f SECONDS\n",
+  printf("   CONVERTING IMAGE TO XIMAGE (IMAGE COLORMAP) IN %.2f SECONDS\n",
         (float)(count2-count1)/1000.0);
   count1 = Counter();
 #endif
@@ -439,12 +418,12 @@ XImageInfo *Image_to_XImage(Display *display, int screen, Visual *visual,
                                    NULL, image->width, image->height,
                                    8, image->width * dpixlen);
 
-  data = (byte *)checked_malloc(image->width * image->height * dpixlen);
+  data = checked_malloc(image->width * image->height * dpixlen);
   ximageinfo->depth = ddepth;
   ximageinfo->ximage->data = (char *)data;
   ximageinfo->ximage->byte_order = MSBFirst;
-  srcptr = image->data;
-  destptr = data;
+  src_ptr = image->data;
+  dst_ptr = data;
 
   switch (visual->class)
   {
@@ -457,32 +436,25 @@ XImageInfo *Image_to_XImage(Display *display, int screen, Visual *visual,
       {
        for (x=0; x<image->width; x++)
        {
-         pixval = memToVal(srcptr, 1);
+         pixval = *src_ptr++;
          pixval =
            redvalue[image->rgb.red[pixval] >> 8] |
            greenvalue[image->rgb.green[pixval] >> 8] |
            bluevalue[image->rgb.blue[pixval] >> 8];
-         valToMem(pixval, destptr, dpixlen);
-         srcptr += 1;
-         destptr += dpixlen;
+         valToMem(pixval, dst_ptr, dpixlen);
+         dst_ptr += dpixlen;
        }
       }
       break;
     }
 
-    default:
+    case PseudoColor:
     {
-      if (dpixlen == 1)                        /* most common */
+      if (dpixlen == 1)                                /* most common */
       {
        for (y=0; y<image->height; y++)
-       {
          for (x=0; x<image->width; x++)
-         {
-           *destptr = ximageinfo->index[c + *srcptr];
-           srcptr++;
-           destptr++;
-         }
-       }
+           *dst_ptr++ = ximageinfo->index[c + *src_ptr++];
       }
       else                                     /* less common */
       {
@@ -490,60 +462,19 @@ XImageInfo *Image_to_XImage(Display *display, int screen, Visual *visual,
        {
          for (x=0; x<image->width; x++)
          {
-           register unsigned long temp;
-           temp = memToVal(srcptr, 1);
-           valToMem(ximageinfo->index[c + temp], destptr, dpixlen);
-           srcptr += 1;
-           destptr += dpixlen;
+           valToMem(ximageinfo->index[c + *src_ptr++], dst_ptr, dpixlen);
+           dst_ptr += dpixlen;
          }
        }
       }
+      break;
     }
-  }
-
-  /* NOW CREATE IMAGE MASK */
-  /* we copy the data to be more consistent */
-
-  linelen = ((image->width + 7) / 8);
-  data_mask = checked_malloc(linelen * image->height);
-
-  memcpy((char *)data_mask, (char *)image->data_mask,
-        linelen * image->height);
-
-  gcv.function = GXcopy;
-  ximageinfo->ximage_mask =
-    XCreateImage(display, visual, 1, XYBitmap, 0, (char *)data_mask,
-                image->width, image->height, 8, linelen);
 
-#if 1
-  if (visual->class == DirectColor || visual->class == TrueColor)
-  {
-    Pixel pixval;
-    dbits = bitsPerPixelAtDepth(display, screen, ddepth);
-    dpixlen = (dbits + 7) / 8;
-    pixval =
-      redvalue[65535 >> 8] |
-      greenvalue[65535 >> 8] |
-      bluevalue[65535 >> 8];
-    ximageinfo->background = pixval;
-    pixval =
-      redvalue[0 >> 8] |
-      greenvalue[0 >> 8] |
-      bluevalue[0 >> 8];
-    ximageinfo->foreground = pixval;
-  }
-  else /* Not Direct or True Color */
-  {
-    ximageinfo->foreground = BlackPixel(display, screen);
-    ximageinfo->background = WhitePixel(display, screen);
+    default:
+      Error(ERR_RETURN, "display type not supported");
+      Error(ERR_EXIT, "DirectColor, TrueColor or PseudoColor display needed");
+      break;
   }
-#else
-  ximageinfo->foreground = WhitePixel(display, screen);
-  ximageinfo->background = BlackPixel(display, screen);
-#endif
-
-  ximageinfo->ximage_mask->bitmap_bit_order = MSBFirst;
-  ximageinfo->ximage_mask->byte_order = MSBFirst;
 
   if (redvalue)
   {
@@ -665,7 +596,7 @@ int Read_PCX_to_Pixmaps(Display *display, Window window, char *filename,
 
 #ifdef DEBUG_TIMING
   count2 = Counter();
-  printf("   CONVERTING IMAGE TO XIMAGE (BITMAP) IN %.2f SECONDS\n",
+  printf("   CONVERTING IMAGE TO XIMAGE IN %.2f SECONDS\n",
         (float)(count2-count1)/1000.0);
   count1 = Counter();
 #endif
@@ -674,7 +605,7 @@ int Read_PCX_to_Pixmaps(Display *display, Window window, char *filename,
     XSetWindowColormap(display, window, ximageinfo->cmap);
 
   /* convert XImage to Pixmap */
-  if (!(XImage_to_Pixmap(display, window, ximageinfo)))
+  if (!(XImage_to_Pixmap(display, window, ximageinfo, image)))
   {
     fprintf(stderr, "Cannot convert XImage to Pixmap.\n");
     exit(1);
index 0561257f17832d5bdae66fca952d7949c43d5d38..b1d033ace479b8e4df3d7aa12d66e8925667f457 100644 (file)
@@ -29,13 +29,9 @@ typedef struct
   Pixel    *index;     /* array of pixel values allocated                  */
   int       no;                /* number of pixels in the array                    */
   int       rootimage; /* True if is a root image - eg, retain colors      */
-  Pixel     foreground; /* foreground and background pixels for mono images */
-  Pixel     background;
   Colormap  cmap;      /* colormap used for image                          */
   GC        gc;                /* cached gc for sending image                      */
-  GC        gc_mask;   /* cached gc for sending image mask                 */
   XImage   *ximage;    /* ximage structure                                 */
-  XImage   *ximage_mask;/* ximage structure of mask                         */
   Pixmap   pixmap;     /* final pixmap                                     */
   Pixmap   pixmap_mask;        /* final pixmap of mask                             */
 } XImageInfo;