From: Holger Schemel Date: Wed, 20 Mar 2002 03:16:14 +0000 (+0100) Subject: rnd-20020320-1-src X-Git-Tag: 2.1.0^2~88 X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=commitdiff_plain;h=11db3a75c0ab5b9e8c98b4cdbb17080f9dc3d1a5 rnd-20020320-1-src --- diff --git a/src/libgame/image.c b/src/libgame/image.c index ae53b44a..ef2898e2 100644 --- a/src/libgame/image.c +++ b/src/libgame/image.c @@ -23,30 +23,31 @@ 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; irgb.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; xwidth; x++) { - if (*src_ptr++) /* source pixel solid? (pixel index != 0) */ - *dst_ptr2 |= bitmask; /* then write a bit into the image mask */ + for (i=0; ibytes_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; xwidth; 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; yheight; y++) for (x=0; xwidth; x++) @@ -499,8 +505,8 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual, for (x=0; xwidth; 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; } } } diff --git a/src/libgame/image.h b/src/libgame/image.h index 2b3af63d..feb1a973 100644 --- a/src/libgame/image.h +++ b/src/libgame/image.h @@ -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; diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 7a55d94d..e8e34e0b 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -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; diff --git a/src/libgame/pcx.c b/src/libgame/pcx.c index 58c19bd3..f6ef16c9 100644 --- a/src/libgame/pcx.c +++ b/src/libgame/pcx.c @@ -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 */ diff --git a/src/libgame/system.c b/src/libgame/system.c index b4ac9ce4..3d00d8e8 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -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); diff --git a/src/libgame/system.h b/src/libgame/system.h index 34a068a5..75a986be 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -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; diff --git a/src/libgame/x11.c b/src/libgame/x11.c index 625a6c93..6adfc11d 100644 --- a/src/libgame/x11.c +++ b/src/libgame/x11.c @@ -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,