rnd-20020320-1-src
authorHolger Schemel <info@artsoft.org>
Wed, 20 Mar 2002 03:16:14 +0000 (04:16 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:36:22 +0000 (10:36 +0200)
src/libgame/image.c
src/libgame/image.h
src/libgame/misc.c
src/libgame/pcx.c
src/libgame/system.c
src/libgame/system.h
src/libgame/x11.c

index ae53b44a3b8b2d909b610adf2ef0176655d4db5d..ef2898e25b258478bca80bf61a6f595480931d8e 100644 (file)
 Image *newImage(unsigned int width, unsigned int height, unsigned int depth)
 {
   Image *image;
-  const unsigned int bytes_per_pixel = 1;
+  unsigned int bytes_per_pixel = (depth + 7) / 8;
   int i;
 
+#if 0
   if (depth > 8)
     Error(ERR_EXIT, "images with more than 256 colors are not supported");
 
   depth = 8;
+#endif
 
   image = checked_malloc(sizeof(Image));
   image->data = checked_malloc(width * height * bytes_per_pixel);
   image->width = width;
   image->height = height;
   image->depth = depth;
-  image->rgb.used = 0;
+  image->bytes_per_pixel = bytes_per_pixel;
+  image->bytes_per_row = width * bytes_per_pixel;
 
+  image->rgb.used = 0;
   for (i=0; i<MAX_COLORS; i++)
     image->rgb.color_used[i] = FALSE;
 
   image->type = (depth < 8 ? IMAGETYPE_BITMAP :
                 depth > 8 ? IMAGETYPE_TRUECOLOR : IMAGETYPE_RGB);
 
-  image->bytes_per_row = (depth + 7) / 8;
-  image->bytes_per_row *= width;
-
   return image;
 }
 
@@ -93,7 +94,7 @@ static Pixmap Image_to_Mask(Image *image, Display *display, Window window)
 {
   byte *src_ptr, *dst_ptr, *dst_ptr2;
   unsigned int bytes_per_row;
-  unsigned int x, y;
+  unsigned int x, y, i;
   byte bitmask;
   byte *mask_data;
   Pixmap mask_pixmap;
@@ -116,8 +117,9 @@ static Pixmap Image_to_Mask(Image *image, Display *display, Window window)
 
     for (x=0; x<image->width; x++)
     {
-      if (*src_ptr++)          /* source pixel solid? (pixel index != 0)  */
-       *dst_ptr2 |= bitmask;   /* then write a bit into the image mask    */
+      for (i=0; i<image->bytes_per_pixel; i++)
+       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? */
       {
@@ -167,12 +169,16 @@ XImageInfo *Image_to_Pixmap(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, bytes_per_pixel, bits_per_pixel;
+  unsigned int display_bytes_per_pixel, display_bits_per_pixel;
+  unsigned int a, c = 0, x, y;
   XColor xcolor;
   XImage *ximage;
   XImageInfo *ximageinfo;
   byte *src_ptr, *dst_ptr;
 
+  if (image->type == IMAGETYPE_TRUECOLOR && depth == 8)
+    Error(ERR_EXIT, "cannot handle true-color images on 8-bit display");
+
   if (!global_cmap)
   {
     if (visual == DefaultVisual(display, screen))
@@ -417,14 +423,14 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
 
   /* create XImage from internal image structure and convert it to Pixmap */
 
-  bits_per_pixel = bitsPerPixelAtDepth(display, screen, depth);
-  bytes_per_pixel = (bits_per_pixel + 7) / 8;
+  display_bits_per_pixel = bitsPerPixelAtDepth(display, screen, depth);
+  display_bytes_per_pixel = (display_bits_per_pixel + 7) / 8;
 
   ximage = XCreateImage(display, visual, depth, ZPixmap, 0,
                        NULL, image->width, image->height,
-                       8, image->width * bytes_per_pixel);
+                       8, image->width * display_bytes_per_pixel);
   ximage->data =
-    checked_malloc(image->width * image->height * bytes_per_pixel);
+    checked_malloc(image->width * image->height * display_bytes_per_pixel);
   ximage->byte_order = MSBFirst;
 
   src_ptr = image->data;
@@ -450,8 +456,8 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
                redvalue[image->rgb.red[pixval] >> 8] |
                greenvalue[image->rgb.green[pixval] >> 8] |
                bluevalue[image->rgb.blue[pixval] >> 8];
-             value_to_memory(pixval, dst_ptr, bytes_per_pixel);
-             dst_ptr += bytes_per_pixel;
+             value_to_memory(pixval, dst_ptr, display_bytes_per_pixel);
+             dst_ptr += display_bytes_per_pixel;
            }
          }
          break;
@@ -463,14 +469,14 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
          {
            for (x=0; x<image->width; x++)
            {
-             pixval = memory_to_value(src_ptr, image->depth);
+             pixval = memory_to_value(src_ptr, image->bytes_per_pixel);
              pixval =
                redvalue[TRUECOLOR_RED(pixval)] |
                greenvalue[TRUECOLOR_GREEN(pixval)] |
                bluevalue[TRUECOLOR_BLUE(pixval)];
-             value_to_memory(pixval, dst_ptr, bytes_per_pixel);
-             src_ptr += image->depth;
-             dst_ptr += bytes_per_pixel;
+             value_to_memory(pixval, dst_ptr, display_bytes_per_pixel);
+             src_ptr += image->bytes_per_pixel;
+             dst_ptr += display_bytes_per_pixel;
            }
          }
          break;
@@ -486,7 +492,7 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
 
     case PseudoColor:
     {
-      if (bytes_per_pixel == 1)                        /* (common) special case */
+      if (display_bytes_per_pixel == 1)                /* special case */
       {
        for (y=0; y<image->height; y++)
          for (x=0; x<image->width; x++)
@@ -499,8 +505,8 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
          for (x=0; x<image->width; x++)
          {
            value_to_memory(ximageinfo->index[c + *src_ptr++],
-                           dst_ptr, bytes_per_pixel);
-           dst_ptr += bytes_per_pixel;
+                           dst_ptr, display_bytes_per_pixel);
+           dst_ptr += display_bytes_per_pixel;
          }
        }
       }
index 2b3af63d7723c61060309e2e546796d93b0b66fd..feb1a973010a107088fbfdd8ca3a9454269bf7ca 100644 (file)
@@ -50,7 +50,8 @@ typedef struct
   unsigned int  width;         /* width of image in pixels            */
   unsigned int  height;                /* height of image in pixels           */
   unsigned int  depth;         /* depth of image in bits if IRGB type */
-  unsigned int  bytes_per_row; /* ((depth + 7) / 8) bytes * width     */
+  unsigned int  bytes_per_pixel;/* (depth + 7) / 8                     */
+  unsigned int  bytes_per_row; /* width * bytes_per_pixel             */
   byte         *data;          /* image data                          */
 } Image;
 
index 7a55d94de4e5ebf8ae1881ca330828937a9a4a73..e8e34e0bc6fd6df546194864b0a970d17fdc8770 100644 (file)
@@ -425,6 +425,7 @@ void GetOptions(char *argv[])
   options.ro_base_directory = RO_BASE_PATH;
   options.rw_base_directory = RW_BASE_PATH;
   options.level_directory = RO_BASE_PATH "/" LEVELS_DIRECTORY;
+  options.graphics_directory = RO_BASE_PATH "/" GRAPHICS_DIRECTORY;
   options.serveronly = FALSE;
   options.network = FALSE;
   options.verbose = FALSE;
@@ -471,8 +472,9 @@ void GetOptions(char *argv[])
             "  -d, --display machine:0       X server display\n"
             "  -b, --basepath directory      alternative base directory\n"
             "  -l, --level directory         alternative level directory\n"
-            "  -s, --serveronly              only start network server\n"
+            "  -g, --graphics directory      alternative graphics directory\n"
             "  -n, --network                 network multiplayer game\n"
+            "  -s, --serveronly              only start network server\n"
             "  -v, --verbose                 verbose mode\n"
             "      --debug                   display debugging information\n",
             program.command_basename);
@@ -511,6 +513,15 @@ void GetOptions(char *argv[])
       if (option_arg == next_option)
        options_left++;
     }
+    else if (strncmp(option, "-graphics", option_len) == 0)
+    {
+      if (option_arg == NULL)
+       Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str);
+
+      options.graphics_directory = option_arg;
+      if (option_arg == next_option)
+       options_left++;
+    }
     else if (strncmp(option, "-network", option_len) == 0)
     {
       options.network = TRUE;
index 58c19bd3caac8e9616244c474b7b456642ebbc55..f6ef16c99362e47e7364a173b46e4229395c0785 100644 (file)
@@ -19,7 +19,7 @@
 #include "misc.h"
 
 
-#define PCX_DEBUG              TRUE
+#define PCX_DEBUG              FALSE
 
 #define PCX_MAGIC              0x0a    /* first byte in a PCX image file    */
 #define PCX_SUPPORTED_VERSION  5       /* last acceptable version number    */
index b4ac9ce4e83a3b8bb4e49a954e78f071a6ab4391..3d00d8e890d4ec419a0907220c76c3adaab1f229 100644 (file)
@@ -109,12 +109,12 @@ void InitProgramInfo(char *unix_userdata_directory, char *program_title,
                     char *x11_icon_basename, char *x11_iconmask_basename,
                     char *msdos_pointer_basename)
 {
-  char *gfx_dir = getPath2(options.ro_base_directory, GRAPHICS_DIRECTORY);
-  char *x11_icon_filename = getPath2(gfx_dir, x11_icon_basename);
-  char *x11_iconmask_filename = getPath2(gfx_dir, x11_iconmask_basename);
-  char *msdos_pointer_filename = getPath2(gfx_dir, msdos_pointer_basename);
-
-  free(gfx_dir);
+  char *x11_icon_filename =
+    getPath2(options.graphics_directory, x11_icon_basename);
+  char *x11_iconmask_filename =
+    getPath2(options.graphics_directory, x11_iconmask_basename);
+  char *msdos_pointer_filename =
+    getPath2(options.graphics_directory, msdos_pointer_basename);
 
 #if defined(PLATFORM_UNIX)
   program.userdata_directory = unix_userdata_directory;
@@ -581,8 +581,7 @@ inline boolean ChangeVideoModeIfNeeded(boolean fullscreen)
 Bitmap *LoadImage(char *basename)
 {
   Bitmap *new_bitmap;
-  char *filename = getPath3(options.ro_base_directory, GRAPHICS_DIRECTORY,
-                           basename);
+  char *filename = getPath2(options.graphics_directory, basename);
 
 #if defined(TARGET_SDL)
   new_bitmap = SDLLoadImage(filename);
index 34a068a543b6f846f5ec1ebfe96dc6e19fbb7250..75a986beaf8eddfbdceca434ce923732db6a78d1 100644 (file)
@@ -156,6 +156,7 @@ struct OptionInfo
   char *ro_base_directory;
   char *rw_base_directory;
   char *level_directory;
+  char *graphics_directory;
   boolean serveronly;
   boolean network;
   boolean verbose;
index 625a6c93a98d7afa3d8c4da1b298e34c4641ab73..6adfc11d4787855eb2c9e47923c33065f5a538a2 100644 (file)
@@ -73,17 +73,11 @@ static void X11InitDisplay()
 
   /* got appropriate visual? */
   if (depth < 8)
-  {
-    printf("Sorry, displays with less than 8 bits per pixel not supported.\n");
-    exit(-1);
-  }
+    Error(ERR_EXIT, "X11 display not supported (less than 8 bits per pixel)");
   else if ((depth ==8 && visual->class != PseudoColor) ||
           (depth > 8 && visual->class != TrueColor &&
            visual->class != DirectColor))
-  {
-    printf("Sorry, cannot get appropriate visual.\n");
-    exit(-1);
-  }
+    Error(ERR_EXIT, "X11 display not supported (inappropriate visual)");
 #endif /* !PLATFORM_MSDOS */
 }
 
@@ -146,8 +140,7 @@ static DrawWindow *X11InitWindow()
                    PropModePrepend, (unsigned char *) &delete_atom, 1);
 
 #if 0
-  sprintf(icon_filename, "%s/%s/%s",
-         options.ro_base_directory, GRAPHICS_DIRECTORY,
+  sprintf(icon_filename, "%s/%s", options.graphics_directory,
          icon_pic.picture_filename);
 #endif
   if (XReadBitmapFile(display, new_window->drawable,
@@ -158,8 +151,7 @@ static DrawWindow *X11InitWindow()
          program.x11_icon_filename);
 
 #if 0
-  sprintf(icon_filename, "%s/%s/%s",
-         options.ro_base_directory, GRAPHICS_DIRECTORY,
+  sprintf(icon_filename, "%s/%s", options.graphics_directory,
          icon_pic.picturemask_filename);
 #endif
   if (XReadBitmapFile(display, new_window->drawable,