From d8916a1131d32fe7867a286455bfd7d009b98ba6 Mon Sep 17 00:00:00 2001 From: mike Date: Sun, 30 Apr 2000 22:03:57 +0000 Subject: [PATCH] Updated the banner pages. Added Windows BMP and Alias PIX file support. The PNG image loading code didn't free the read buffers. git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@1042 7a7537e8-13f0-0310-91df-b6672ffda945 --- conf/mime.types | 11 +- filter/Makefile | 11 +- filter/image-bmp.c | 499 +++++++++++++++++++++++++++++++++++++++++++++ filter/image-pix.c | 223 ++++++++++++++++++++ filter/image-png.c | 6 +- filter/image.c | 9 +- filter/image.h | 10 +- 7 files changed, 752 insertions(+), 17 deletions(-) create mode 100644 filter/image-bmp.c create mode 100644 filter/image-pix.c diff --git a/conf/mime.types b/conf/mime.types index fb026aa25..eb464335d 100644 --- a/conf/mime.types +++ b/conf/mime.types @@ -1,5 +1,5 @@ # -# "$Id: mime.types,v 1.8 2000/04/24 21:01:27 mike Exp $" +# "$Id: mime.types,v 1.9 2000/04/30 22:03:56 mike Exp $" # # MIME types file for the Common UNIX Printing System (CUPS). # @@ -99,10 +99,9 @@ image/x-xpixmap xpm ascii(0,1024) + string(3,"XPM") image/x-xwindowdump xwd image/x-sun-raster ras -# TODO: Add Alias, SoftImage, GIMP??? files -#image/x-alias pix -#image/x-softimage -#image/x-gimp-xcf xcf xcf.gz +#image/fpx fpx +image/x-alias pix short(8,8) short(8,24) +image/x-bitmap bmp string(0,BM) && !printable(2,14) ######################################################################## # @@ -124,5 +123,5 @@ application/vnd.cups-raster string(0,"RaSt") string(0,"tSaR") application/vnd.cups-raw # -# End of "$Id: mime.types,v 1.8 2000/04/24 21:01:27 mike Exp $". +# End of "$Id: mime.types,v 1.9 2000/04/30 22:03:56 mike Exp $". # diff --git a/filter/Makefile b/filter/Makefile index 363abc996..02f9b8eb7 100644 --- a/filter/Makefile +++ b/filter/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile,v 1.30 2000/04/20 19:56:38 mike Exp $" +# "$Id: Makefile,v 1.31 2000/04/30 22:03:56 mike Exp $" # # Filter makefile for the Common UNIX Printing System (CUPS). # @@ -29,9 +29,10 @@ TARGETS = hpgltops texttops pstops imagetops imagetoraster \ HPGLOBJS = hpgl-attr.o hpgl-config.o hpgl-main.o hpgl-prolog.o \ hpgl-char.o hpgl-input.o hpgl-polygon.o hpgl-vector.o -IMAGEOBJS = image-colorspace.o image-photocd.o image-sgilib.o \ - image-tiff.o image-gif.o image-png.o image-sgi.o image-zoom.o \ - image-jpeg.o image-pnm.o image-sun.o image.o +IMAGEOBJS = image-bmp.o image-colorspace.o image-gif.o image-jpeg.o \ + image-photocd.o image-pix.o image-png.o image-pnm.o \ + image-sgi.o image-sgilib.o image-sun.o image-tiff.o \ + image-zoom.o image.o raster.o FORMOBJS = form-attr.o form-main.o form-ps.o form-text.o form-tree.o OBJS = $(HPGLOBJS) $(IMAGEOBJS) $(FORMOBJS) \ imagetops.o imagetoraster.o common.o pstops.o raster.o \ @@ -197,5 +198,5 @@ $(OBJS): ../Makedefs ../cups/cups.h ../cups/ppd.h ../cups/language.h # -# End of "$Id: Makefile,v 1.30 2000/04/20 19:56:38 mike Exp $". +# End of "$Id: Makefile,v 1.31 2000/04/30 22:03:56 mike Exp $". # diff --git a/filter/image-bmp.c b/filter/image-bmp.c new file mode 100644 index 000000000..c78dc6af9 --- /dev/null +++ b/filter/image-bmp.c @@ -0,0 +1,499 @@ +/* + * "$Id: image-bmp.c,v 1.1 2000/04/30 22:03:57 mike Exp $" + * + * BMP image routines for the Common UNIX Printing System (CUPS). + * + * Copyright 1993-2000 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Easy Software Products and are protected by Federal + * copyright law. Distribution and use rights are outlined in the file + * "LICENSE.txt" which should have been included with this file. If this + * file is missing or damaged please contact Easy Software Products + * at: + * + * Attn: CUPS Licensing Information + * Easy Software Products + * 44141 Airport View Drive, Suite 204 + * Hollywood, Maryland 20636-3111 USA + * + * Voice: (301) 373-9603 + * EMail: cups-info@cups.org + * WWW: http://www.cups.org + * + * Contents: + * + * ImageReadBMP() - Read a BMP image file. + * read_word() - Read a 16-bit unsigned integer. + * read_dword() - Read a 32-bit unsigned integer. + * read_long() - Read a 32-bit signed integer. + */ + +/* + * Include necessary headers... + */ + +#include "image.h" + + +/* + * Constants for the bitmap compression... + */ + +# define BI_RGB 0 /* No compression - straight BGR data */ +# define BI_RLE8 1 /* 8-bit run-length compression */ +# define BI_RLE4 2 /* 4-bit run-length compression */ +# define BI_BITFIELDS 3 /* RGB bitmap with RGB masks */ + + +/* + * Local functions... + */ + +static unsigned short read_word(FILE *fp); +static unsigned int read_dword(FILE *fp); +static int read_long(FILE *fp); + + +/* + * 'ImageReadBMP()' - Read a BMP image file. + */ + +int /* O - Read status */ +ImageReadBMP(image_t *img, /* IO - Image */ + FILE *fp, /* I - Image file */ + int primary, /* I - Primary choice for colorspace */ + int secondary, /* I - Secondary choice for colorspace */ + int saturation, /* I - Color saturation (%) */ + int hue, /* I - Color hue (degrees) */ + const ib_t *lut) /* I - Lookup table for gamma/brightness */ +{ + int offset, /* Offset to bitmap data */ + info_size, /* Size of info header */ + planes, /* Number of planes (always 1) */ + depth, /* Depth of image (bits) */ + compression, /* Type of compression */ + image_size, /* Size of image in bytes */ + colors_used, /* Number of colors used */ + colors_important, /* Number of important colors */ + bpp, /* Bytes per pixel */ + x, y, /* Looping vars */ + color, /* Color of RLE pixel */ + count, /* Number of times to repeat */ + temp, /* Temporary color */ + align; /* Alignment bytes */ + ib_t bit, /* Bit in image */ + byte; /* Byte in image */ + ib_t *in, /* Input pixels */ + *out, /* Output pixels */ + *ptr; /* Pointer into pixels */ + ib_t colormap[256][4]; /* Colormap */ + + + /* + * Get the header... + */ + + getc(fp); /* Skip "BM" sync chars */ + getc(fp); + read_dword(fp); /* Skip size */ + read_word(fp); /* Skip reserved stuff */ + read_word(fp); + offset = read_dword(fp); + + fprintf(stderr, "offset = %d\n", offset); + + /* + * Then the bitmap information... + */ + + info_size = read_dword(fp); + img->xsize = read_long(fp); + img->ysize = read_long(fp); + planes = read_word(fp); + depth = read_word(fp); + compression = read_dword(fp); + image_size = read_dword(fp); + img->xppi = read_long(fp) * 0.0254 + 0.5; + img->yppi = read_long(fp) * 0.0254 + 0.5; + colors_used = read_dword(fp); + colors_important = read_dword(fp); + + fprintf(stderr, "info_size = %d, xsize = %d, ysize = %d, planes = %d, depth = %d\n", + info_size, img->xsize, img->ysize, planes, depth); + fprintf(stderr, "compression = %d, image_size = %d, xppi = %d, yppi = %d\n", + compression, image_size, img->xppi, img->yppi); + fprintf(stderr, "colors_used = %d, colors_important = %d\n", colors_used, + colors_important); + + if (info_size > 40) + for (info_size -= 40; info_size > 0; info_size --) + getc(fp); + + /* + * Get colormap... + */ + + if (colors_used == 0 && depth <= 8) + colors_used = 1 << depth; + + fread(colormap, colors_used, 4, fp); + + /* + * Setup image and buffers... + */ + + img->colorspace = primary; + + ImageSetMaxTiles(img, 0); + + in = malloc(img->xsize * 3); + bpp = ImageGetDepth(img); + out = malloc(img->xsize * bpp); + + /* + * Read the image data... + */ + + color = 0; + count = 0; + align = 0; + + for (y = img->ysize - 1; y >= 0; y --) + { + if (img->colorspace == IMAGE_RGB) + ptr = out; + else + ptr = in; + + switch (depth) + { + case 1 : /* Bitmap */ + for (x = img->xsize, bit = 128; x > 0; x --) + { + if (bit == 128) + byte = getc(fp); + + if (byte & bit) + { + *ptr++ = colormap[1][2]; + *ptr++ = colormap[1][1]; + *ptr++ = colormap[1][0]; + } + else + { + *ptr++ = colormap[0][2]; + *ptr++ = colormap[0][1]; + *ptr++ = colormap[0][0]; + } + + if (bit > 1) + bit >>= 1; + else + bit = 128; + } + + /* + * Read remaining bytes to align to 32 bits... + */ + + for (temp = (img->xsize + 7) / 8; temp & 3; temp ++) + getc(fp); + break; + + case 4 : /* 16-color */ + for (x = img->xsize, bit = 0xf0; x > 0; x --) + { + /* + * Get a new count as needed... + */ + + if (compression != BI_RLE4 && count == 0) + { + count = 2; + color = -1; + } + + if (count == 0) + { + while (align > 0) + { + align --; + getc(fp); + } + + if ((count = getc(fp)) == 0) + { + if ((count = getc(fp)) == 0) + { + /* + * End of line... + */ + + x ++; + continue; + } + else if (count == 1) + { + /* + * End of image... + */ + + break; + } + else if (count == 2) + { + /* + * Delta... + */ + + count = getc(fp) * getc(fp) * img->xsize; + color = 0; + } + else + { + /* + * Absolute... + */ + + color = -1; + align = ((4 - (count & 3)) / 2) & 1; + } + } + else + color = getc(fp); + } + + /* + * Get a new color as needed... + */ + + count --; + + if (bit == 0xf0) + { + if (color < 0) + temp = getc(fp); + else + temp = color; + + /* + * Copy the color value... + */ + + *ptr++ = colormap[temp >> 4][2]; + *ptr++ = colormap[temp >> 4][1]; + *ptr++ = colormap[temp >> 4][0]; + bit = 0x0f; + } + else + { + /* + * Copy the color value... + */ + + *ptr++ = colormap[temp & 15][2]; + *ptr++ = colormap[temp & 15][1]; + *ptr++ = colormap[temp & 15][0]; + bit = 0xf0; + } + } + break; + + case 8 : /* 256-color */ + for (x = img->xsize; x > 0; x --) + { + /* + * Get a new count as needed... + */ + + if (compression != BI_RLE8) + { + count = 1; + color = -1; + } + + if (count == 0) + { + while (align > 0) + { + align --; + getc(fp); + } + + if ((count = getc(fp)) == 0) + { + if ((count = getc(fp)) == 0) + { + /* + * End of line... + */ + + x ++; + continue; + } + else if (count == 1) + { + /* + * End of image... + */ + + break; + } + else if (count == 2) + { + /* + * Delta... + */ + + count = getc(fp) * getc(fp) * img->xsize; + color = 0; + } + else + { + /* + * Absolute... + */ + + color = -1; + align = (2 - (count & 1)) & 1; + } + } + else + color = getc(fp); + } + + /* + * Get a new color as needed... + */ + + if (color < 0) + temp = getc(fp); + else + temp = color; + + count --; + + /* + * Copy the color value... + */ + + *ptr++ = colormap[temp][2]; + *ptr++ = colormap[temp][1]; + *ptr++ = colormap[temp][0]; + } + break; + + case 24 : /* 24-bit RGB */ + for (x = img->xsize; x > 0; x --, ptr += 3) + { + ptr[2] = getc(fp); + ptr[1] = getc(fp); + ptr[0] = getc(fp); + } + + /* + * Read remaining bytes to align to 32 bits... + */ + + for (temp = img->xsize * 3; temp & 3; temp ++) + getc(fp); + break; + } + + if (img->colorspace == IMAGE_RGB) + { + if (saturation != 100 || hue != 0) + ImageRGBAdjust(out, img->xsize, saturation, hue); + } + else + { + if (saturation != 100 || hue != 0) + ImageRGBAdjust(in, img->xsize, saturation, hue); + + switch (img->colorspace) + { + case IMAGE_WHITE : + ImageRGBToWhite(in, out, img->xsize); + break; + case IMAGE_BLACK : + ImageRGBToBlack(in, out, img->xsize); + break; + case IMAGE_CMY : + ImageRGBToCMY(in, out, img->xsize); + break; + case IMAGE_CMYK : + ImageRGBToCMYK(in, out, img->xsize); + break; + } + } + + if (lut) + ImageLut(out, img->xsize * bpp, lut); + + ImagePutRow(img, 0, y, img->xsize, out); + } + + fclose(fp); + free(in); + free(out); + + return (0); +} + + +/* + * 'read_word()' - Read a 16-bit unsigned integer. + */ + +static unsigned short /* O - 16-bit unsigned integer */ +read_word(FILE *fp) /* I - File to read from */ +{ + unsigned char b0, b1; /* Bytes from file */ + + b0 = getc(fp); + b1 = getc(fp); + + return ((b1 << 8) | b0); +} + + +/* + * 'read_dword()' - Read a 32-bit unsigned integer. + */ + +static unsigned int /* O - 32-bit unsigned integer */ +read_dword(FILE *fp) /* I - File to read from */ +{ + unsigned char b0, b1, b2, b3; /* Bytes from file */ + + b0 = getc(fp); + b1 = getc(fp); + b2 = getc(fp); + b3 = getc(fp); + + return ((((((b3 << 8) | b2) << 8) | b1) << 8) | b0); +} + + +/* + * 'read_long()' - Read a 32-bit signed integer. + */ + +static int /* O - 32-bit signed integer */ +read_long(FILE *fp) /* I - File to read from */ +{ + unsigned char b0, b1, b2, b3; /* Bytes from file */ + + b0 = getc(fp); + b1 = getc(fp); + b2 = getc(fp); + b3 = getc(fp); + + return ((int)(((((b3 << 8) | b2) << 8) | b1) << 8) | b0); +} + + +/* + * End of "$Id: image-bmp.c,v 1.1 2000/04/30 22:03:57 mike Exp $". + */ diff --git a/filter/image-pix.c b/filter/image-pix.c new file mode 100644 index 000000000..28858ea8e --- /dev/null +++ b/filter/image-pix.c @@ -0,0 +1,223 @@ +/* + * "$Id: image-pix.c,v 1.1 2000/04/30 22:03:57 mike Exp $" + * + * Alias PIX image routines for the Common UNIX Printing System (CUPS). + * + * Copyright 1993-2000 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Easy Software Products and are protected by Federal + * copyright law. Distribution and use rights are outlined in the file + * "LICENSE.txt" which should have been included with this file. If this + * file is missing or damaged please contact Easy Software Products + * at: + * + * Attn: CUPS Licensing Information + * Easy Software Products + * 44141 Airport View Drive, Suite 204 + * Hollywood, Maryland 20636-3111 USA + * + * Voice: (301) 373-9603 + * EMail: cups-info@cups.org + * WWW: http://www.cups.org + * + * Contents: + * + * ImageReadPIX() - Read a PIX image file. + * read_short() - Read a 16-bit integer. + */ + +/* + * Include necessary headers... + */ + +#include "image.h" + + +/* + * Local functions... + */ + +static short read_short(FILE *fp); + + +/* + * 'ImageReadPIX()' - Read a PIX image file. + */ + +int /* O - Read status */ +ImageReadPIX(image_t *img, /* IO - Image */ + FILE *fp, /* I - Image file */ + int primary, /* I - Primary choice for colorspace */ + int secondary, /* I - Secondary choice for colorspace */ + int saturation, /* I - Color saturation (%) */ + int hue, /* I - Color hue (degrees) */ + const ib_t *lut) /* I - Lookup table for gamma/brightness */ +{ + short width, /* Width of image */ + height, /* Height of image */ + depth; /* Depth of image (bits) */ + int count, /* Repetition count */ + bpp, /* Bytes per pixel */ + x, y; /* Looping vars */ + ib_t r, g, b; /* Red, green/gray, blue values */ + ib_t *in, /* Input pixels */ + *out, /* Output pixels */ + *ptr; /* Pointer into pixels */ + + + /* + * Get the image dimensions and setup the image... + */ + + width = read_short(fp); + height = read_short(fp); + read_short(fp); + read_short(fp); + depth = read_short(fp); + + if (depth == 8) + img->colorspace = secondary; + else + img->colorspace = primary; + + img->xsize = width; + img->ysize = height; + + ImageSetMaxTiles(img, 0); + + in = malloc(img->xsize * (depth / 8)); + bpp = ImageGetDepth(img); + out = malloc(img->xsize * bpp); + + /* + * Read the image data... + */ + + if (depth == 8) + { + for (count = 0, y = 0; y < img->ysize; y ++) + { + if (img->colorspace == IMAGE_WHITE) + ptr = out; + else + ptr = in; + + for (x = img->xsize; x > 0; x --, count --) + { + if (count == 0) + { + count = getc(fp); + g = getc(fp); + } + + *ptr++ = g; + } + + if (img->colorspace != IMAGE_WHITE) + switch (img->colorspace) + { + case IMAGE_RGB : + ImageWhiteToRGB(in, out, img->xsize); + break; + case IMAGE_BLACK : + ImageWhiteToBlack(in, out, img->xsize); + break; + case IMAGE_CMY : + ImageWhiteToCMY(in, out, img->xsize); + break; + case IMAGE_CMYK : + ImageWhiteToCMYK(in, out, img->xsize); + break; + } + + if (lut) + ImageLut(out, img->xsize * bpp, lut); + + ImagePutRow(img, 0, y, img->xsize, out); + } + } + else + { + for (count = 0, y = 0; y < img->ysize; y ++) + { + if (img->colorspace == IMAGE_RGB) + ptr = out; + else + ptr = in; + + for (x = img->xsize; x > 0; x --, count --) + { + if (count == 0) + { + count = getc(fp); + b = getc(fp); + g = getc(fp); + r = getc(fp); + } + + *ptr++ = r; + *ptr++ = g; + *ptr++ = b; + } + + if (img->colorspace == IMAGE_RGB) + { + if (saturation != 100 || hue != 0) + ImageRGBAdjust(out, img->xsize, saturation, hue); + } + else + { + if (saturation != 100 || hue != 0) + ImageRGBAdjust(in, img->xsize, saturation, hue); + + switch (img->colorspace) + { + case IMAGE_WHITE : + ImageRGBToWhite(in, out, img->xsize); + break; + case IMAGE_BLACK : + ImageRGBToBlack(in, out, img->xsize); + break; + case IMAGE_CMY : + ImageRGBToCMY(in, out, img->xsize); + break; + case IMAGE_CMYK : + ImageRGBToCMYK(in, out, img->xsize); + break; + } + } + + if (lut) + ImageLut(out, img->xsize * bpp, lut); + + ImagePutRow(img, 0, y, img->xsize, out); + } + } + + fclose(fp); + free(in); + free(out); + + return (0); +} + + +/* + * 'read_short()' - Read a 16-bit integer. + */ + +static short /* O - Value from file */ +read_short(FILE *fp) /* I - File to read from */ +{ + int ch; /* Character from file */ + + + ch = getc(fp); + return ((ch << 8) | getc(fp)); +} + + +/* + * End of "$Id: image-pix.c,v 1.1 2000/04/30 22:03:57 mike Exp $". + */ diff --git a/filter/image-png.c b/filter/image-png.c index 6e98320c8..f0b9d8744 100644 --- a/filter/image-png.c +++ b/filter/image-png.c @@ -1,5 +1,5 @@ /* - * "$Id: image-png.c,v 1.8 2000/01/04 13:45:45 mike Exp $" + * "$Id: image-png.c,v 1.9 2000/04/30 22:03:57 mike Exp $" * * PNG image routines for the Common UNIX Printing System (CUPS). * @@ -192,6 +192,8 @@ ImageReadPNG(image_t *img, /* IO - Image */ png_read_destroy(pp, info, NULL); fclose(fp); + free(in); + free(out); return (0); } @@ -201,5 +203,5 @@ ImageReadPNG(image_t *img, /* IO - Image */ /* - * End of "$Id: image-png.c,v 1.8 2000/01/04 13:45:45 mike Exp $". + * End of "$Id: image-png.c,v 1.9 2000/04/30 22:03:57 mike Exp $". */ diff --git a/filter/image.c b/filter/image.c index 8df92356b..544b75772 100644 --- a/filter/image.c +++ b/filter/image.c @@ -1,5 +1,5 @@ /* - * "$Id: image.c,v 1.24 2000/04/24 20:52:04 mike Exp $" + * "$Id: image.c,v 1.25 2000/04/30 22:03:57 mike Exp $" * * Base image support for the Common UNIX Printing System (CUPS). * @@ -143,6 +143,8 @@ ImageOpen(char *filename, /* I - Filename of image */ if (memcmp(header, "GIF87a", 6) == 0 || memcmp(header, "GIF89a", 6) == 0) status = ImageReadGIF(img, fp, primary, secondary, saturation, hue, lut); + else if (memcmp(header, "BM", 2) == 0) + status = ImageReadBMP(img, fp, primary, secondary, saturation, hue, lut); else if (header[0] == 0x01 && header[1] == 0xda) status = ImageReadSGI(img, fp, primary, secondary, saturation, hue, lut); else if (header[0] == 0x59 && header[1] == 0xa6 && @@ -152,6 +154,9 @@ ImageOpen(char *filename, /* I - Filename of image */ status = ImageReadPNM(img, fp, primary, secondary, saturation, hue, lut); else if (memcmp(header2, "PCD_IPI", 7) == 0) status = ImageReadPhotoCD(img, fp, primary, secondary, saturation, hue, lut); + else if (memcmp(header + 8, "\000\010", 2) == 0 || + memcmp(header + 8, "\000\030", 2) == 0) + status = ImageReadPIX(img, fp, primary, secondary, saturation, hue, lut); #if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ) else if (memcmp(header, "\211PNG", 4) == 0) status = ImageReadPNG(img, fp, primary, secondary, saturation, hue, lut); @@ -791,5 +796,5 @@ flush_tile(image_t *img) /* I - Image */ /* - * End of "$Id: image.c,v 1.24 2000/04/24 20:52:04 mike Exp $". + * End of "$Id: image.c,v 1.25 2000/04/30 22:03:57 mike Exp $". */ diff --git a/filter/image.h b/filter/image.h index c7718fe1c..934dc40b9 100644 --- a/filter/image.h +++ b/filter/image.h @@ -1,5 +1,5 @@ /* - * "$Id: image.h,v 1.9 2000/01/04 13:45:46 mike Exp $" + * "$Id: image.h,v 1.10 2000/04/30 22:03:57 mike Exp $" * * Image library definitions for the Common UNIX Printing System (CUPS). * @@ -168,10 +168,16 @@ extern int ImagePutRow(image_t *img, int x, int y, int width, const ib_t *pixels * File formats... */ +extern int ImageReadBMP(image_t *img, FILE *fp, int primary, int secondary, + int saturation, int hue, const ib_t *lut); +extern int ImageReadFPX(image_t *img, FILE *fp, int primary, int secondary, + int saturation, int hue, const ib_t *lut); extern int ImageReadGIF(image_t *img, FILE *fp, int primary, int secondary, int saturation, int hue, const ib_t *lut); extern int ImageReadJPEG(image_t *img, FILE *fp, int primary, int secondary, int saturation, int hue, const ib_t *lut); +extern int ImageReadPIX(image_t *img, FILE *fp, int primary, int secondary, + int saturation, int hue, const ib_t *lut); extern int ImageReadPNG(image_t *img, FILE *fp, int primary, int secondary, int saturation, int hue, const ib_t *lut); extern int ImageReadPNM(image_t *img, FILE *fp, int primary, int secondary, @@ -221,5 +227,5 @@ extern void ImageZoomFree(izoom_t *z); #endif /* !_IMAGE_H_ */ /* - * End of "$Id: image.h,v 1.9 2000/01/04 13:45:46 mike Exp $". + * End of "$Id: image.h,v 1.10 2000/04/30 22:03:57 mike Exp $". */ -- 2.39.2