cristy@dupont.com (05/24/91)
Submitted-by: cristy@dupont.com Posting-number: Volume 13, Issue 28 Archive-name: imagemagic/part12 #!/bin/sh # this is img.12 (part 12 of ImageMagick) # do not concatenate these parts, unpack them in order with /bin/sh # file ImageMagick/filters/Makefile continued # if test ! -r _shar_seq_.tmp; then echo 'Please unpack part 1 first!' exit 1 fi (read Scheck if test "$Scheck" != 12; then echo Please unpack part "$Scheck" next! exit 1 else exit 0 fi ) < _shar_seq_.tmp || exit 1 if test ! -f _shar_wnt_.tmp; then echo 'x - still skipping ImageMagick/filters/Makefile' else echo 'x - continuing file ImageMagick/filters/Makefile' sed 's/^X//' << 'SHAR_EOF' >> 'ImageMagick/filters/Makefile' && X clean:: X $(RM) TIFFtoMIFF X install:: TIFFtoMIFF X $(INSTALL) -c $(INSTPGMFLAGS) TIFFtoMIFF $(BINDIR) X MIFFtoTIFF: $(MIFFtoTIFFObjects) X $(RM) $@ X $(CC) -o $@ $(MIFFtoTIFFObjects) $(LDOPTIONS) $(TIFF_LIBRARIES) $(LDLIBS) $(EXTRA_LOAD_FLAGS) X clean:: X $(RM) MIFFtoTIFF X install:: MIFFtoTIFF X $(INSTALL) -c $(INSTPGMFLAGS) MIFFtoTIFF $(BINDIR) X depend:: X $(DEPEND) -s "# DO NOT DELETE" -- $(ALLDEFINES) -- $(SRCS) X image.o: X $(CC) $(CFLAGS) -c ../image.c X kolb.o: X $(CC) $(CFLAGS) -c ../kolb.c X quantize.o: X $(CC) $(CFLAGS) -c ../quantize.c X colors.o: X $(CC) $(CFLAGS) -c ../colors.c X compress.o: X $(CC) $(CFLAGS) -c ../compress.c X ########################################################################### # common rules for all Makefiles - do not edit X emptyrule:: X clean:: X $(RM_CMD) \#* X Makefile:: X -@if [ -f Makefile ]; then \ X echo " $(RM) Makefile.bak; $(MV) Makefile Makefile.bak"; \ X $(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \ X else exit 0; fi X $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR) X tags:: X $(TAGS) -w *.[ch] X $(TAGS) -xw *.[ch] > TAGS X saber: X #load $(ALLDEFINES) $(SRCS) X osaber: X #load $(ALLDEFINES) $(OBJS) X ########################################################################### # empty rules for directories that do not have SUBDIRS - do not edit X install:: X @echo "install in $(CURRENT_DIR) done" X install.man:: X @echo "install.man in $(CURRENT_DIR) done" X Makefiles:: X includes:: X ########################################################################### # dependencies generated by makedepend X SHAR_EOF echo 'File ImageMagick/filters/Makefile is complete' && chmod 0755 ImageMagick/filters/Makefile || echo 'restore of ImageMagick/filters/Makefile failed' Wc_c="`wc -c < 'ImageMagick/filters/Makefile'`" test 14700 -eq "$Wc_c" || echo 'ImageMagick/filters/Makefile: original size 14700, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= ImageMagick/filters/GIFtoMIFF.c ============== if test -f 'ImageMagick/filters/GIFtoMIFF.c' -a X"$1" != X"-c"; then echo 'x - skipping ImageMagick/filters/GIFtoMIFF.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting ImageMagick/filters/GIFtoMIFF.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/filters/GIFtoMIFF.c' && /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % IIIII M M PPPP OOO RRRR TTTTT % % I MM MM P P O O R R T % % I M M M PPPP O O RRRR T % % I M M P O O R R T % % IIIII M M P OOO R R T % % % % % % Import GIF image to a MIFF format. % % % % % % % % Software Design % % John Cristy % % January 1991 % % % % % % Copyright 1991 E. I. Dupont de Nemours & Company % % % % Permission to use, copy, modify, distribute, and sell this software and % % its documentation for any purpose is hereby granted without fee, % % provided that the above Copyright notice appear in all copies and that % % both that Copyright notice and this permission notice appear in % % supporting documentation, and that the name of E. I. Dupont de Nemours % % & Company not be used in advertising or publicity pertaining to % % distribution of the software without specific, written prior % % permission. E. I. Dupont de Nemours & Company makes no representations % % about the suitability of this software for any purpose. It is provided % % "as is" without express or implied warranty. % % % % E. I. Dupont de Nemours & Company disclaims all warranties with regard % % to this software, including all implied warranties of merchantability % % and fitness, in no event shall E. I. Dupont de Nemours & Company be % % liable for any special, indirect or consequential damages or any % % damages whatsoever resulting from loss of use, data or profits, whether % % in an action of contract, negligence or other tortious action, arising % % out of or in connection with the use or performance of this software. % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Command syntax: % % import [-scene #] image.gif image.miff % % Specify 'image.gif' as '-' for standard input. % Specify 'image.miff' as '-' for standard output. % */ X #include "display.h" #include "image.h" /* X 01/01/91 X X Modified to convert GIF to MIFF image format. X X cristy@dupont.com */ /* +-------------------------------------------------------------------+ */ /* | Copyright 1990, David Koblas. | */ /* | Permission to use, copy, modify, and distribute this software | */ /* | and its documentation for any purpose and without fee is hereby | */ /* | granted, provided that the above copyright notice appear in all | */ /* | copies and that both that copyright notice and this permission | */ /* | notice appear in supporting documentation. This software is | */ /* | provided "as is" without express or implied warranty. | */ /* +-------------------------------------------------------------------+ */ X #define MAXCOLORMAPSIZE 256 X #define TRUE 1 #define FALSE 0 X #define CM_RED 0 #define CM_GREEN 1 #define CM_BLUE 2 X #define MAX_LWZ_BITS 12 X #define INTERLACE 0x40 #define LOCALCOLORMAP 0x80 #define BitSet(byte, bit) (((byte) & (bit)) == (bit)) X #define ReadOK(file,buffer,len) (fread(buffer, len, 1, file) != 0) X #define LM_to_uint(a,b) (((b)<<8)|(a)) X struct { X unsigned int Width; X unsigned int Height; X unsigned char ColorMap[3][MAXCOLORMAPSIZE]; X unsigned int BitPixel; X unsigned int ColorResolution; X unsigned int Background; X unsigned int AspectRatio; } GifScreen; X struct { X int transparent; X int delayTime; X int inputFlag; X int disposal; } Gif89 = { -1, -1, -1, 0 }; X char X *application_name, X *input_filename, X *output_filename; X int scene; int verbose; int showComment; X static char usage[] = X "[-verbose] [-comments] [-image N] [-scene N] GIFfile MIFFfile"; X static void ReadGIF(); static void ReadGIFImage(); static int ReadColorMap(); static int DoExtension(); static int GetDataBlock(); static void Error(); X void main(argc,argv) int argc; char **argv; { #define Usage(usage) \ { \ X (void) fprintf(stderr,"usage: %s\n",usage); \ X exit(1); \ } X X int argn; X FILE *in; X int imageNumber; X X application_name=argv[0]; X X argn = 1; X imageNumber = 1; X scene = 0; X verbose = FALSE; X showComment = FALSE; X X while (argn < argc && argv[argn][0] == '-' && argv[argn][1] != '\0') { X if (strncmp(argv[argn], "-verbose", 2)) { X verbose = TRUE; X showComment = TRUE; X } else if (strncmp(argv[argn], "-comments", 2)) { X showComment = TRUE; X } else if (strncmp(argv[argn], "-image", 2)) { X ++argn; X if (argn == argc || sscanf(argv[argn], "%d", &imageNumber) != 1) X Usage(usage); X } else if (strncmp(argv[argn], "-scene", 2)) { X ++argn; X if (argn == argc || sscanf(argv[argn], "%d", &scene) != 1) X Usage(usage); X } else { X Usage(usage); X } X ++argn; X } X input_filename=argv[argn]; X if (input_filename == (char *) NULL ) X Usage(usage); X if (*input_filename == '-') X in=stdin; X else X in=fopen(input_filename,"r"); X ++argn; X output_filename=argv[argn]; X if (output_filename == (char *) NULL) X Usage(usage); X ReadGIF(in, imageNumber); X fclose(in); X exit(0); } X static void ReadGIF(fd, imageNumber) FILE *fd; int imageNumber; { X unsigned char buf[16]; X unsigned char c; X unsigned char localColorMap[3][MAXCOLORMAPSIZE]; X int useGlobalColormap; X int bitPixel; X int imageCount = 0; X char version[4]; X X if (! ReadOK(fd,buf,6)) X Error("error reading magic number",(char *) NULL); X X if (strncmp(buf,"GIF",3) != 0) X Error("not a GIF file",(char *) NULL); X X strncpy(version, buf + 3, 3); X version[3] = '\0'; X X if ((strcmp(version, "87a") != 0) && (strcmp(version, "89a") != 0)) X Error("bad version number, not '87a' or '89a'",(char *) NULL); X X if (! ReadOK(fd,buf,7)) X Error("failed to read screen descriptor",(char *) NULL); X X GifScreen.Width = LM_to_uint(buf[0],buf[1]); X GifScreen.Height = LM_to_uint(buf[2],buf[3]); X GifScreen.BitPixel = 2<<(buf[4]&0x07); X GifScreen.ColorResolution = (((buf[4]&0x70)>>3)+1); X GifScreen.Background = buf[5]; X GifScreen.AspectRatio = buf[6]; X X if (BitSet(buf[4], LOCALCOLORMAP)) { /* Global Colormap */ X if (ReadColorMap(fd,GifScreen.BitPixel,GifScreen.ColorMap)) X Error("error reading global colormap",(char *) NULL); X } X X if (GifScreen.AspectRatio != 0) { X float r; X r = ( (float) GifScreen.AspectRatio + 15.0 ) / 64.0; X } X X for (;;) { X if (! ReadOK(fd,&c,1)) X Error("EOF / read error on image data",(char *) NULL); X X if (c == ';') { /* GIF terminator */ X if (imageCount < imageNumber) X Error("not enough images in the file",(char *) NULL); X return; X } X X if (c == '!') { /* Extension */ X if (! ReadOK(fd,&c,1)) X Error("OF / read error on extention function code",(char *) NULL); X DoExtension(fd, c); X continue; X } X X if (c != ',') { /* Not a valid start character */ X continue; X } X X ++imageCount; X X if (! ReadOK(fd,buf,9)) X Error("couldn't read left/top/width/height",(char *) NULL); X X useGlobalColormap = ! BitSet(buf[8], LOCALCOLORMAP); X X bitPixel = 1<<((buf[8]&0x07)+1); X X if (! useGlobalColormap) { X if (ReadColorMap(fd, bitPixel, localColorMap)) X Error("error reading local colormap",(char *) NULL); X ReadGIFImage(fd, LM_to_uint(buf[4],buf[5]), X LM_to_uint(buf[6],buf[7]), localColorMap, X BitSet(buf[8], INTERLACE), imageCount != imageNumber); X } else { X ReadGIFImage(fd, LM_to_uint(buf[4],buf[5]), X LM_to_uint(buf[6],buf[7]), GifScreen.ColorMap, X BitSet(buf[8], INTERLACE), imageCount != imageNumber); X } X X } } X static int ReadColorMap(fd,number,buffer) FILE *fd; int number; unsigned char buffer[3][MAXCOLORMAPSIZE]; { X int i; X unsigned char rgb[3]; X X for (i = 0; i < number; ++i) { X if (! ReadOK(fd, rgb, sizeof(rgb))) X Error("bad colormap",(char *) NULL); X X buffer[CM_RED][i] = rgb[0] ; X buffer[CM_GREEN][i] = rgb[1] ; X buffer[CM_BLUE][i] = rgb[2] ; X } X return FALSE; } X static int DoExtension(fd, label) FILE *fd; int label; { X static char buf[256]; X char *str; X X switch (label) { X case 0x01: /* Plain Text Extension */ X str = "Plain Text Extension"; #ifdef notdef X if (GetDataBlock(fd, buf) == 0) X ; X X lpos = LM_to_uint(buf[0], buf[1]); X tpos = LM_to_uint(buf[2], buf[3]); X width = LM_to_uint(buf[4], buf[5]); X height = LM_to_uint(buf[6], buf[7]); X cellw = buf[8]; X cellh = buf[9]; X foreground = buf[10]; X background = buf[11]; X X while (GetDataBlock(fd, buf) != 0) { X PPM_ASSIGN(image[ypos][xpos], X cmap[CM_RED][v], X cmap[CM_GREEN][v], X cmap[CM_BLUE][v]); X ++index; X } X X return FALSE; #else X break; #endif X case 0xff: /* Application Extension */ X str = "Application Extension"; X break; X case 0xfe: /* Comment Extension */ X str = "Comment Extension"; X while (GetDataBlock(fd, buf) != 0) { X if (showComment) X printf("gif comment: %s", buf); X } X return FALSE; X case 0xf9: /* Graphic Control Extension */ X str = "Graphic Control Extension"; X (void) GetDataBlock(fd, buf); X Gif89.disposal = (buf[0] >> 2) & 0x7; X Gif89.inputFlag = (buf[0] >> 1) & 0x1; X Gif89.delayTime = LM_to_uint(buf[1],buf[2]); X if ((buf[0] & 0x1) != 0) X Gif89.transparent = buf[3]; X X while (GetDataBlock(fd, buf) != 0) X ; X return FALSE; X default: X str = buf; X sprintf(buf, "UNKNOWN (0x%02x)", label); X break; X } X X while (GetDataBlock(fd, buf) != 0) X ; X X return FALSE; } X int ZeroDataBlock = FALSE; X static int GetDataBlock(fd, buf) FILE *fd; unsigned char *buf; { X unsigned char count; X X if (! ReadOK(fd,&count,1)) { X Warning("error in getting DataBlock size",(char *) NULL); X return -1; X } X X ZeroDataBlock = count == 0; X X if ((count != 0) && (! ReadOK(fd, buf, count))) { X Warning("error in reading DataBlock",(char *) NULL); X return -1; X } X X return count; } X static int GetCode(fd, code_size, flag) FILE *fd; int code_size; int flag; { X static unsigned char buf[280]; X static int curbit, lastbit, done, last_byte; X int i, j, ret; X unsigned char count; X X if (flag) { X curbit = 0; X lastbit = 0; X done = FALSE; X return 0; X } X X if ( (curbit+code_size) >= lastbit) { X if (done) { X if (curbit >= lastbit) X Error("ran off the end of my bits",(char *) NULL); X return -1; X } X buf[0] = buf[last_byte-2]; X buf[1] = buf[last_byte-1]; X X if ((count = GetDataBlock(fd, &buf[2])) == 0) X done = TRUE; X X last_byte = 2 + count; X curbit = (curbit - lastbit) + 16; X lastbit = (2+count)*8 ; X } X X ret = 0; X for (i = curbit, j = 0; j < code_size; ++i, ++j) X ret |= ((buf[ i / 8 ] & (1 << (i % 8))) != 0) << j; X X curbit += code_size; X X return ret; } X static int LWZReadByte(fd, flag, input_code_size) FILE *fd; int flag; int input_code_size; { X static int fresh = FALSE; X int code, incode; X static int code_size, set_code_size; X static int max_code, max_code_size; X static int firstcode, oldcode; X static int clear_code, end_code; X static int table[2][(1<< MAX_LWZ_BITS)]; X static int stack[(1<<(MAX_LWZ_BITS))*2], *sp; X register int i; X X if (flag) { X set_code_size = input_code_size; X code_size = set_code_size+1; X clear_code = 1 << set_code_size ; X end_code = clear_code + 1; X max_code_size = 2*clear_code; X max_code = clear_code+2; X X GetCode(fd, 0, TRUE); X X fresh = TRUE; X X for (i = 0; i < clear_code; ++i) { X table[0][i] = 0; X table[1][i] = i; X } X for (; i < (1<<MAX_LWZ_BITS); ++i) X table[0][i] = table[1][0] = 0; X X sp = stack; X X return 0; X } else if (fresh) { X fresh = FALSE; X do { X firstcode = oldcode = X GetCode(fd, code_size, FALSE); X } while (firstcode == clear_code); X return firstcode; X } X X if (sp > stack) X return *--sp; X X while ((code = GetCode(fd, code_size, FALSE)) >= 0) { X if (code == clear_code) { X for (i = 0; i < clear_code; ++i) { X table[0][i] = 0; X table[1][i] = i; X } X for (; i < (1<<MAX_LWZ_BITS); ++i) X table[0][i] = table[1][i] = 0; X code_size = set_code_size+1; X max_code_size = 2*clear_code; X max_code = clear_code+2; X sp = stack; X firstcode = oldcode = X GetCode(fd, code_size, FALSE); X return firstcode; X } else if (code == end_code) { X int count; X unsigned char buf[260]; X X if (ZeroDataBlock) X return -2; X X while ((count = GetDataBlock(fd, buf)) > 0) X ; X X if (count != 0) X Warning("missing EOD in data stream (common occurance)",(char *) NULL); X return -2; X } X X incode = code; X X if (code >= max_code) { X *sp++ = firstcode; X code = oldcode; X } X X while (code >= clear_code) { X *sp++ = table[1][code]; X if (code == table[0][code]) X Error("circular table entry BIG ERROR",(char *) NULL); X code = table[0][code]; X } X X *sp++ = firstcode = table[1][code]; X X if ((code = max_code) <(1<<MAX_LWZ_BITS)) { X table[0][code] = oldcode; X table[1][code] = firstcode; X ++max_code; X if ((max_code >= max_code_size) && X (max_code_size < (1<<MAX_LWZ_BITS))) { X max_code_size *= 2; X ++code_size; X } X } X X oldcode = incode; X X if (sp > stack) X return *--sp; X } X return code; } X static void ReadGIFImage(fd, len, height, cmap, interlace, ignore) FILE *fd; int len, height; char cmap[3][MAXCOLORMAPSIZE]; int interlace, ignore; { X unsigned char c; X int v; X int xpos = 0, ypos = 0, pass = 0; X unsigned char X *image; X X /* X ** Initialize the Compression routines X */ X if (! ReadOK(fd,&c,1)) X Error("EOF / read error on image data",(char *) NULL); X X if (LWZReadByte(fd, TRUE, c) < 0) X Error("error reading image",(char *) NULL); X X /* X ** If this is an "uninteresting picture" ignore it. X */ X if (ignore) { X if (verbose) X Warning("skipping image...",(char *) NULL); X X while (LWZReadByte(fd, FALSE, c) >= 0) X ; X return; X } X X if ((image = (unsigned char *) malloc(len* height)) == NULL) X Error("couldn't alloc space for image",(char *) NULL); X X while ((v = LWZReadByte(fd,FALSE,c)) >= 0 ) { X image[ypos*len+xpos]=v; X X ++xpos; X if (xpos == len) { X xpos = 0; X if (interlace) { X switch (pass) { X case 0: X case 1: X ypos += 8; break; X case 2: X ypos += 4; break; X case 3: X ypos += 2; break; X } X X if (ypos >= height) { X ++pass; X switch (pass) { X case 1: X ypos = 4; break; X case 2: X ypos = 2; break; X case 3: X ypos = 1; break; X } X } X } else { X ++ypos; X } X } X } X X if (verbose) X Warning("writing output",(char *) NULL); X GIFtoMIFF(cmap,image,len,height); } X /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % E r r o r % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Function Error displays an error message and then terminates the program. % % The format of the Error routine is: % % Error(message,qualifier) % % A description of each parameter follows: % % o message: Specifies the message to display before terminating the % program. % % o qualifier: Specifies any qualifier to the message. % % */ static void Error(message,qualifier) char X *message, X *qualifier; { X (void) fprintf(stderr,"%s: %s",application_name,message); X if (qualifier != (char *) NULL) X (void) fprintf(stderr," %s",qualifier); X (void) fprintf(stderr,".\n"); X exit(1); } /* X Write MIFF format. */ GIFtoMIFF(colormap,pixels,width,height) char X colormap[3][MAXCOLORMAPSIZE]; X unsigned char X *pixels; X unsigned int X width, X height; { X register int X i; X X Image X image; X X register RunlengthPacket X *q; X X unsigned char X blue, X green, X red; X X unsigned short X index; X X /* X Initialize image header. X */ X if (strcmp(output_filename,"-") == 0) X (void) strcpy(image.filename,"-"); X else X (void) strcpy(image.filename,output_filename); X image.class=PseudoClass; X image.compression=RunlengthEncodedCompression; X image.comments=(char *) NULL; X image.scene=scene; X image.columns=width; X image.rows=height; X image.colors=MAXCOLORMAPSIZE; X /* X Allocate memory. X */ X image.comments=(char *) malloc((unsigned int) (strlen(image.filename)+256)); X image.colormap=(ColorPacket *) malloc(image.colors*sizeof(ColorPacket)); X image.pixels=(RunlengthPacket *) X malloc(image.columns*image.rows*sizeof(RunlengthPacket)); X if ((image.comments == (char *) NULL) || X (image.colormap == (ColorPacket *) NULL) || X (image.pixels == (RunlengthPacket *) NULL)) X { X (void) fprintf(stderr,"Can't import GIF image, not enough memory.\n"); X exit(1); X } X /* X Initialize comments, colormap, and pixel data. X */ X (void) sprintf(image.comments,"\n Imported from GIF image: %s\n\0", X input_filename); X for (i=0; i < image.colors; i++) X { X image.colormap[i].red=colormap[CM_RED][i]; X image.colormap[i].green=colormap[CM_GREEN][i]; X image.colormap[i].blue=colormap[CM_BLUE][i]; X } X image.packets=0; X q=image.pixels; X q->length=MaxRunlength; X for (i=0; i < (image.columns*image.rows); i++) X { X index=pixels[i]; X red=image.colormap[index].red; X green=image.colormap[index].green; X blue=image.colormap[index].blue; X if ((red == q->red) && (green == q->green) && (blue == q->blue) && X (q->length < MaxRunlength)) X q->length++; X else X { X if (image.packets > 0) X q++; X image.packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=index; X q->length=0; X } X } X if (image.packets > ((image.columns*image.rows*3) >> 2)) X image.compression=NoCompression; X WriteImage(&image); X (void) free((char *) image.pixels); X (void) free((char *) image.colormap); } SHAR_EOF chmod 0755 ImageMagick/filters/GIFtoMIFF.c || echo 'restore of ImageMagick/filters/GIFtoMIFF.c failed' Wc_c="`wc -c < 'ImageMagick/filters/GIFtoMIFF.c'`" test 20330 -eq "$Wc_c" || echo 'ImageMagick/filters/GIFtoMIFF.c: original size 20330, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= ImageMagick/filters/SUNtoMIFF.c ============== if test -f 'ImageMagick/filters/SUNtoMIFF.c' -a X"$1" != X"-c"; then echo 'x - skipping ImageMagick/filters/SUNtoMIFF.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting ImageMagick/filters/SUNtoMIFF.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/filters/SUNtoMIFF.c' && /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % IIIII M M PPPP OOO RRRR TTTTT % % I MM MM P P O O R R T % % I M M M PPPP O O RRRR T % % I M M P O O R R T % % IIIII M M P OOO R R T % % % % % % Import SUN raster image to a MIFF format. % % % % % % % % Software Design % % John Cristy % % January 1991 % % % % % % Copyright 1991 E. I. Dupont de Nemours & Company % % % % Permission to use, copy, modify, distribute, and sell this software and % % its documentation for any purpose is hereby granted without fee, % % provided that the above Copyright notice appear in all copies and that % % both that Copyright notice and this permission notice appear in % % supporting documentation, and that the name of E. I. Dupont de Nemours % % & Company not be used in advertising or publicity pertaining to % % distribution of the software without specific, written prior % % permission. E. I. Dupont de Nemours & Company makes no representations % % about the suitability of this software for any purpose. It is provided % % "as is" without express or implied warranty. % % % % E. I. Dupont de Nemours & Company disclaims all warranties with regard % % to this software, including all implied warranties of merchantability % % and fitness, in no event shall E. I. Dupont de Nemours & Company be % % liable for any special, indirect or consequential damages or any % % damages whatsoever resulting from loss of use, data or profits, whether % % in an action of contract, negligence or other tortious action, arising % % out of or in connection with the use or performance of this software. % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Command syntax: % % import [-scene #] image.sun image.miff % % Specify 'image.sun' as '-' for standard input. % Specify 'image.miff' as '-' for standard output. % % */ X #include <string.h> #include "display.h" #include "image.h" X /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % E r r o r % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Function Error displays an error message and then terminates the program. % % The format of the Error routine is: % % Error(message,qualifier) % % A description of each parameter follows: % % o message: Specifies the message to display before terminating the % program. % % o qualifier: Specifies any qualifier to the message. % % */ void Error(message,qualifier) char X *message, X *qualifier; { X (void) fprintf(stderr,"%s: %s",application_name,message); X if (qualifier != (char *) NULL) X (void) fprintf(stderr," %s",qualifier); X (void) fprintf(stderr,".\n"); X exit(1); } X /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % M S B F i r s t O r d e r % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Function MSBFirstOrder converts a least-significant byte first buffer of % integers to most-significant byte first. % % The format of the MSBFirstOrder routine is: % % MSBFirstOrder(p,length); % % A description of each parameter follows. % % o p: Specifies a pointer to a buffer of integers. % % o length: Specifies the length of the buffer. % % */ MSBFirstOrder(p,length) register char X *p; X register unsigned X length; { X register char X c, X *q, X *sp; X X q=p+length; X while (p < q) X { X sp=p+3; X c=(*sp); X *sp=(*p); X *p++=c; X sp=p+1; X c=(*sp); X *sp=(*p); X *p++=c; X p+=2; X } } X /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % R e a d R a s t e r I m a g e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Function ReadSUNImage reads an image file and returns it. It allocates % the memory necessary for the new Image structure and returns a pointer to % the new image. % % The format of the ReadSUNImage routine is: % % image=ReadSUNImage(filename) % % A description of each parameter follows: % % o image: Function ReadSUNImage returns a pointer to the image after % reading. A null image is returned if there is a a memory shortage or % if the image cannot be read. % % o filename: Specifies the name of the image to read. % % */ static Image *ReadSUNImage(filename) char X *filename; { #define RMT_EQUAL_RGB 1 #define RMT_NONE 0 #define RMT_RAW 2 #define RT_STANDARD 1 #define RT_FORMAT_RGB 3 X X typedef struct _Rasterfile X { X int X magic, X width, X height, X depth, X length, X type, X maptype, X maplength; X } Rasterfile; X X Image X *image; X X Rasterfile X sun_header; X X register int X bit, X i, X x, X y; X X register RunlengthPacket X *q; X X register unsigned char X *p; X X unsigned char X blue, X green, X red, X *sun_pixels; X X unsigned long X lsb_first; X X unsigned short X index; X X /* X Allocate image structure. X */ X image=(Image *) malloc(sizeof(Image)); X if (image == (Image *) NULL) X Error("memory allocation error",(char *) NULL); X /* X Initialize Image structure. X */ X image->id=UnknownId; X image->class=DirectClass; X image->compression=RunlengthEncodedCompression; X image->columns=0; X image->rows=0; X image->packets=0; X image->colors=0; X image->scene=0; X image->colormap=(ColorPacket *) NULL; X image->pixels=(RunlengthPacket *) NULL; X image->comments=(char *) NULL; X /* X Open image file. X */ X (void) strcpy(image->filename,filename); X if (*image->filename == '-') X image->file=stdin; X else X if (strcmp(image->filename+strlen(image->filename)-2,".Z") != 0) X image->file=fopen(image->filename,"r"); X else X { X char X command[256]; X X /* X Image file is compressed-- uncompress it. X */ X (void) sprintf(command,"uncompress -c %s",image->filename); X image->file=(FILE *) popen(command,"r"); X } X if (image->file == (FILE *) NULL) X Error("unable to open file",image->filename); X /* X Read raster image. X */ X (void) ReadData((char *) &sun_header,1,sizeof(Rasterfile),image->file); X /* X Ensure the header byte-order is most-significant byte first. X */ X lsb_first=1; X if (*(char *) &lsb_first) X MSBFirstOrder((char *) &sun_header,sizeof(sun_header)); X if (sun_header.magic != 0x59a66a95) X Error("not a SUN raster,",image->filename); X if ((sun_header.type != RT_STANDARD) && (sun_header.type != RT_FORMAT_RGB)) X Error("not in standard format,",image->filename); X switch (sun_header.maptype) X { X case RMT_NONE: X { X if (sun_header.depth < 24) X { X /* X Create linear color ramp. X */ X image->colors=1 << sun_header.depth; X image->colormap=(ColorPacket *) X malloc(image->colors*sizeof(ColorPacket)); X if (image->colormap == (ColorPacket *) NULL) X Error("memory allocation error",(char *) NULL); X for (i=0; i < image->colors; i++) X { X image->colormap[i].red=(255*i)/(image->colors-1); X image->colormap[i].green=(255*i)/(image->colors-1); X image->colormap[i].blue=(255*i)/(image->colors-1); X } X } X break; X } X case RMT_EQUAL_RGB: X { X unsigned char X *sun_colormap; X X /* X Read Sun raster colormap. X */ X image->colors=sun_header.maplength/3; X image->colormap= X (ColorPacket *) malloc(image->colors*sizeof(ColorPacket)); X sun_colormap=(unsigned char *) X malloc(image->colors*sizeof(unsigned char)); X if ((image->colormap == (ColorPacket *) NULL) || X (sun_colormap == (unsigned char *) NULL)) X Error("memory allocation error",(char *) NULL); X (void) ReadData((char *) sun_colormap,1,(int) image->colors,image->file); X for (i=0; i < image->colors; i++) X image->colormap[i].red=sun_colormap[i]; X (void) ReadData((char *) sun_colormap,1,(int) image->colors,image->file); X for (i=0; i < image->colors; i++) X image->colormap[i].green=sun_colormap[i]; X (void) ReadData((char *) sun_colormap,1,(int) image->colors,image->file); X for (i=0; i < image->colors; i++) X image->colormap[i].blue=sun_colormap[i]; X (void) free((char *) sun_colormap); X break; X } X case RMT_RAW: X { X unsigned char X *sun_colormap; X X /* X Read Sun raster colormap. X */ X sun_colormap=(unsigned char *) X malloc(sun_header.maplength*sizeof(unsigned char)); X if (sun_colormap == (unsigned char *) NULL) X Error("memory allocation error",(char *) NULL); X (void) ReadData((char *) sun_colormap,1,sun_header.maplength, X image->file); X (void) free((char *) sun_colormap); X break; X } X default: X { X Error("colormap type is not supported",image->filename); X break; X } X } X sun_pixels=(unsigned char *) X malloc((unsigned int) sun_header.length*sizeof(unsigned char)); X if (sun_pixels == (unsigned char *) NULL) X Error("memory allocation error",(char *) NULL); X (void) ReadData((char *) sun_pixels,1,sun_header.length,image->file); X /* X Create image. X */ X image->comments=(char *) malloc((unsigned int) (strlen(image->filename)+256)); X if (image->comments == (char *) NULL) X Error("memory allocation error",(char *) NULL); X (void) sprintf(image->comments,"\n Imported from Sun raster image: %s\n\0", X image->filename); X image->class=(sun_header.depth < 24 ? PseudoClass : DirectClass); X image->columns=sun_header.width; X image->rows=sun_header.height; X image->pixels=(RunlengthPacket *) X malloc(image->columns*image->rows*sizeof(RunlengthPacket)); X if (image->pixels == (RunlengthPacket *) NULL) X Error("memory allocation error",(char *) NULL); X /* X Convert Sun raster image to runlength-encoded packets. X */ X p=sun_pixels; X image->packets=0; X q=image->pixels; X q->length=MaxRunlength; X if (sun_header.depth == 1) X for (y=0; y < image->rows; y++) X { X /* X Convert bitmap scanline to runlength-encoded color packets. X */ X for (x=0; x < (image->columns >> 3); x++) X { X for (bit=7; bit >= 0; bit--) X { X index=((*p) & (0x01 << bit) ? 0x00 : 0x01); X red=image->colormap[index].red; X green=image->colormap[index].green; X blue=image->colormap[index].blue; X if ((red == q->red) && (green == q->green) && (blue == q->blue) && X (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=index; X q->length=0; X } X } X p++; X } X if ((image->columns % 8) != 0) X { X for (bit=7; bit >= (8-(image->columns % 8)); bit--) X { X index=((*p) & (0x01 << bit) ? 0x00 : 0x01); X red=image->colormap[index].red; X green=image->colormap[index].green; X blue=image->colormap[index].blue; X if ((red == q->red) && (green == q->green) && (blue == q->blue) && X (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=index; X q->length=0; X } X } X p++; X } X } X else X if (image->class == PseudoClass) X for (y=0; y < image->rows; y++) X { X /* X Convert PseudoColor scanline to runlength-encoded color packets. X */ X for (x=0; x < image->columns; x++) X { X index=(*p++); X red=image->colormap[index].red; X green=image->colormap[index].green; X blue=image->colormap[index].blue; X if ((red == q->red) && (green == q->green) && (blue == q->blue) && X (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=index; X q->length=0; X } X } X if ((image->columns % 2) != 0) X p++; X } X else X for (y=0; y < image->rows; y++) X { X /* X Convert DirectColor scanline to runlength-encoded color packets. X */ X for (x=0; x < image->columns; x++) X { X if (sun_header.type == RT_STANDARD) X { X blue=(*p++); X green=(*p++); X red=(*p++); X } X else X { X red=(*p++); X green=(*p++); X blue=(*p++); X } X if ((red == q->red) && (green == q->green) && (blue == q->blue) && X (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=0; X q->length=0; X } X } X if ((image->columns % 2) != 0) X p++; X } X (void) free((char *) sun_pixels); X if (image->file != stdin) X if (strcmp(image->filename+strlen(image->filename)-2,".Z") != 0) X (void) fclose(image->file); X else X (void) pclose(image->file); X if (image->packets > ((image->columns*image->rows*3) >> 2)) X image->compression=NoCompression; X image->pixels=(RunlengthPacket *) X realloc((char *) image->pixels,image->packets*sizeof(RunlengthPacket)); X return(image); } X /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % U s a g e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Function Usage displays the program usage; % % The format of the Usage routine is: % % Usage(message) % % A description of each parameter follows: % % message: Specifies a specific message to display to the user. % */ static void Usage(message) char X *message; { X if (message != (char *) NULL) X (void) fprintf(stderr,"Can't continue, %s\n\n",message); X (void) fprintf(stderr,"Usage: %s [-scene #] image.sun image.miff\n\n", X application_name); X (void) fprintf(stderr,"Specify 'image.sun' as '-' for standard input.\n"); X (void) fprintf(stderr,"Specify 'image.miff' as '-' for standard output.\n"); X exit(1); } X /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % M a i n % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % */ int main(argc,argv) int X argc; X char X *argv[]; { X char X filename[256]; X X Image X *image; X X int X i; X X unsigned int X scene; X X /* X Initialize program variables. X */ X application_name=argv[0]; X i=1; X scene=0; X if (argc < 3) X Usage((char *) NULL); X /* X Read image and convert to MIFF format. X */ X if (strncmp(argv[i],"-scene",2) == 0) X { X i++; X scene=atoi(argv[i++]); X } X (void) strcpy(filename,argv[i++]); X image=ReadSUNImage(filename); X if (image == (Image *) NULL) X exit(1); X (void) strcpy(image->filename,argv[i++]); X image->scene=scene; X (void) WriteImage(image); X (void) fprintf(stderr,"%s => %s %dx%d\n",filename,image->filename, X image->columns,image->rows); X DestroyImage(image); X return(False); } SHAR_EOF chmod 0755 ImageMagick/filters/SUNtoMIFF.c || echo 'restore of ImageMagick/filters/SUNtoMIFF.c failed' Wc_c="`wc -c < 'ImageMagick/filters/SUNtoMIFF.c'`" test 20166 -eq "$Wc_c" || echo 'ImageMagick/filters/SUNtoMIFF.c: original size 20166, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= ImageMagick/filters/TIFFtoMIFF.c ============== if test -f 'ImageMagick/filters/TIFFtoMIFF.c' -a X"$1" != X"-c"; then echo 'x - skipping ImageMagick/filters/TIFFtoMIFF.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting ImageMagick/filters/TIFFtoMIFF.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/filters/TIFFtoMIFF.c' && /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % IIIII M M PPPP OOO RRRR TTTTT % % I MM MM P P O O R R T % % I M M M PPPP O O RRRR T % % I M M P O O R R T % % IIIII M M P OOO R R T % % % % % % Import TIFF image to a MIFF format. % % % % % % % % Software Design % % John Cristy % % January 1991 % % % % % % Copyright 1991 E. I. Dupont de Nemours & Company % % % % Permission to use, copy, modify, distribute, and sell this software and % % its documentation for any purpose is hereby granted without fee, % % provided that the above Copyright notice appear in all copies and that % % both that Copyright notice and this permission notice appear in % % supporting documentation, and that the name of E. I. Dupont de Nemours % % & Company not be used in advertising or publicity pertaining to % % distribution of the software without specific, written prior % % permission. E. I. Dupont de Nemours & Company makes no representations % % about the suitability of this software for any purpose. It is provided % % "as is" without express or implied warranty. % % % % E. I. Dupont de Nemours & Company disclaims all warranties with regard % % to this software, including all implied warranties of merchantability % % and fitness, in no event shall E. I. Dupont de Nemours & Company be % % liable for any special, indirect or consequential damages or any % % damages whatsoever resulting from loss of use, data or profits, whether % % in an action of contract, negligence or other tortious action, arising % % out of or in connection with the use or performance of this software. % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Command syntax: % % import [-scene #] image.tiff image.miff % % Specify 'image.tiff' as '-' for standard input. % Specify 'image.miff' as '-' for standard output. % % */ X #include <string.h> #include "display.h" #include "image.h" X /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % E r r o r % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Function Error displays an error message and then terminates the program. % % The format of the Error routine is: % % Error(message,qualifier) % % A description of each parameter follows: % % o message: Specifies the message to display before terminating the % program. % % o qualifier: Specifies any qualifier to the message. % % */ void Error(message,qualifier) char X *message, X *qualifier; { X (void) fprintf(stderr,"%s: %s",application_name,message); X if (qualifier != (char *) NULL) X (void) fprintf(stderr," %s",qualifier); X (void) fprintf(stderr,".\n"); X exit(1); } X /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % R e a d T i f f I m a g e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Function ReadTIFFImage reads an image file and returns it. It allocates the % memory necessary for the new Image structure and returns a pointer to the % new image. % % The format of the ReadTIFFImage routine is: % % image=ReadTIFFImage(filename) % % A description of each parameter follows: % % o image: Function ReadTIFFImage returns a pointer to the image after % reading. A null image is returned if there is a a memory shortage or % if the image cannot be read. % % o filename: Specifies the name of the image to read. % % o verbose: A value greater than zero prints detailed information about % the image. % % */ static Image *ReadTIFFImage(filename,verbose) char X *filename; X unsigned int X verbose; { #include <tiff.h> #include <tiffio.h> X X Image X *image; X X register int X i; X X register RunlengthPacket X *q; X X register unsigned char X *p; X X register unsigned int X x, X y; X X register unsigned short X index; X X TIFF X *file; X X unsigned char X blue, X green, X red, X *scanline; X X unsigned short X bits_per_sample, X fill_order, X image_length, X image_width, X photometric, X planar_configuration, X samples_per_pixel; X X /* X Allocate image structure. X */ X image=(Image *) malloc(sizeof(Image)); X if (image == (Image *) NULL) X Error("unable to allocate memory",(char *) NULL); X /* X Initialize Image structure. X */ X image->id=UnknownId; X image->class=DirectClass; X image->compression=RunlengthEncodedCompression; X image->columns=0; X image->rows=0; X image->packets=0; X image->colors=0; X image->scene=0; X image->colormap=(ColorPacket *) NULL; X image->pixels=(RunlengthPacket *) NULL; X image->comments=(char *) NULL; X /* X Open TIFF image file. X */ X (void) strcpy(image->filename,filename); X file=TIFFOpen(image->filename,"r"); X if (file == (TIFF *) NULL) X exit(1); X if (verbose) X TIFFPrintDirectory(file,stderr,False,False,False); X /* X Verify this image is acceptable. X */ X if (!TIFFGetField(file,TIFFTAG_BITSPERSAMPLE,&bits_per_sample)) X bits_per_sample=1; X if (!TIFFGetField(file,TIFFTAG_PHOTOMETRIC,&photometric)) X photometric=PHOTOMETRIC_PALETTE; X if ((bits_per_sample > 8) && (photometric != PHOTOMETRIC_RGB)) X Error("image is more than 8-bits per sample",(char *) NULL); X if (!TIFFGetField(file,TIFFTAG_SAMPLESPERPIXEL,&samples_per_pixel)) X samples_per_pixel=1; X if ((samples_per_pixel != 1) && (samples_per_pixel != 3) && X (samples_per_pixel != 4)) X Error("samples per pixel must be 1, 3, or 4",(char *) NULL); X /* X Initialize image attributes. X */ X if (!TIFFGetField(file,TIFFTAG_PHOTOMETRIC,&photometric)) X photometric=PHOTOMETRIC_PALETTE; X TIFFGetField(file,TIFFTAG_IMAGEWIDTH,&image_width); X TIFFGetField(file,TIFFTAG_IMAGELENGTH,&image_length); X image->comments=(char *) malloc((unsigned int) (strlen(image->filename)+256)); X if (image->comments == (char *) NULL) X Error("unable to allocate memory",(char *) NULL); X (void) sprintf(image->comments,"\n Imported from TIFF image %s.\n\0", X image->filename); X image->class=(photometric == PHOTOMETRIC_RGB ? DirectClass : PseudoClass); X image->columns=image_width; X image->rows=image_length; X image->colors=1 << bits_per_sample; X if (image->class == PseudoClass) X { X /* X Prepare for pseudo-color image. X */ X image->colormap=(ColorPacket *) malloc(image->colors*sizeof(ColorPacket)); X if (image->colormap == (ColorPacket *) NULL) X Error("unable to allocate memory",(char *) NULL); X /* X Create colormap. X */ X switch (photometric) X { X case PHOTOMETRIC_MINISBLACK: X { X for (i=0; i < image->colors; i++) X { X image->colormap[i].red=(255*i)/(image->colors-1); X image->colormap[i].green=(255*i)/(image->colors-1); X image->colormap[i].blue=(255*i)/(image->colors-1); X } X break; X } X case PHOTOMETRIC_MINISWHITE: X { X for (i=0; i < image->colors; i++) X { X image->colormap[i].red=255-(255*i)/(image->colors-1); X image->colormap[i].green=255-(255*i)/(image->colors-1); X image->colormap[i].blue=255-(255*i)/(image->colors-1); X } X break; X } X case PHOTOMETRIC_PALETTE: X { X unsigned short X *blue_colormap, X *green_colormap, X *red_colormap; X X TIFFGetField(file,TIFFTAG_COLORMAP,&red_colormap,&green_colormap, X &blue_colormap); X for (i=0; i < image->colors; i++) X { X image->colormap[i].red=red_colormap[i] >> 8; X image->colormap[i].green=green_colormap[i] >> 8; X image->colormap[i].blue=blue_colormap[i] >> 8; X } X break; X } X default: X break; X } X } X /* X Allocate memory for the image and scanline buffer. X */ X image->pixels=(RunlengthPacket *) X malloc(image->columns*image->rows*sizeof(RunlengthPacket)); X TIFFGetField(file,TIFFTAG_PLANARCONFIG,&planar_configuration); X if (planar_configuration == PLANARCONFIG_CONTIG) X scanline=(unsigned char *) malloc((unsigned int) TIFFScanlineSize(file)); X else X scanline=(unsigned char *) X malloc((unsigned int) samples_per_pixel*TIFFScanlineSize(file)); X if ((image->pixels == (RunlengthPacket *) NULL) || X (scanline == (unsigned char *) NULL)) X Error("unable to allocate memory",(char *) NULL); X /* X Read the TIFF image and write to image pixel buffer. X */ X if (!TIFFGetField(file,TIFFTAG_FILLORDER,&fill_order)) X fill_order=FILLORDER_MSB2LSB; X image->packets=0; X q=image->pixels; X q->length=MaxRunlength; X for (y=0; y < image->rows; y++) X { X p=scanline; X if (TIFFReadScanline(file,p,y,0) < 0) X Error("unable to read TIFF scanline",(char *) NULL); X if (planar_configuration != PLANARCONFIG_CONTIG) X for (i=1; i < samples_per_pixel; i++) X if (TIFFReadScanline(file,p+i*TIFFScanlineSize(file),y,i) < 0) X Error("unable to read TIFF scanline",(char *) NULL); X switch (photometric) X { X case PHOTOMETRIC_RGB: X { X switch (bits_per_sample) X { X case 8: X default: X { X /* X Assumes Max Sample Value is 255. X */ X for (x=0; x < image->columns; x++) X { X if (planar_configuration == PLANARCONFIG_CONTIG) X { X red=(*p++); X green=(*p++); X blue=(*p++); X } X else X { X red=(*p); X green=(*(p+TIFFScanlineSize(file))); X blue=(*(p+2*TIFFScanlineSize(file))); X p++; X } X if ((red == q->red) && (green == q->green) && X (blue == q->blue) && (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=0; X q->length=0; X } X if (samples_per_pixel == 4) X p++; X } X break; X } X case 16: X { X register unsigned short X *p; X X /* X Assumes Max Sample Value is 2047. X */ X p=(unsigned short *) scanline; X for (x=0; x < image->columns; x++) X { X if (planar_configuration == PLANARCONFIG_CONTIG) X { X red=(*p++ >> 3); X green=(*p++ >> 3); X blue=(*p++ >> 3); X } X else X { X red=(*p >> 3); X green=(*(p+TIFFScanlineSize(file)) >> 3); X blue=(*(p+2*TIFFScanlineSize(file)) >> 3); X p++; X } X if ((red == q->red) && (green == q->green) && X (blue == q->blue) && (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=0; X q->length=0; X } X if (samples_per_pixel == 4) X p++; X } X break; X } X } X break; X } X case PHOTOMETRIC_MINISBLACK: X case PHOTOMETRIC_MINISWHITE: X { X switch (bits_per_sample) X { X case 1: X { X register int X bit; X X for (x=0; x < image->columns; x+=8) X { X for (bit=7; bit >= 0; bit--) X { X index=((*p) & (0x01 << bit) ? 0x01 : 0x00); X red=image->colormap[index].red; X green=image->colormap[index].green; X blue=image->colormap[index].blue; X if ((red == q->red) && (green == q->green) && X (blue == q->blue) && (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=index; X q->length=0; X } X } X p++; X } X if ((image->columns % 8) != 0) X { X for (bit=7; bit >= (8-(image->columns % 8)); bit--) X { X index=((*p) & (0x01 << bit) ? 0x00 : 0x01); X red=image->colormap[index].red; X green=image->colormap[index].green; X blue=image->colormap[index].blue; X if ((red == q->red) && (green == q->green) && X (blue == q->blue) && (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=index; X q->length=0; X } X } X p++; X } X break; X } X case 2: X { X for (x=0; x < image->columns; x+=4) X { X index=(*p >> 6) & 3; X red=image->colormap[index].red; X green=image->colormap[index].green; X blue=image->colormap[index].blue; X if ((red == q->red) && (green == q->green) && X (blue == q->blue) && (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=index; X q->length=0; X } X index=(*p >> 4) & 3; X red=image->colormap[index].red; X green=image->colormap[index].green; X blue=image->colormap[index].blue; X if ((red == q->red) && (green == q->green) && X (blue == q->blue) && (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=index; X q->length=0; X } X index=(*p >> 2) & 3; X red=image->colormap[index].red; X green=image->colormap[index].green; X blue=image->colormap[index].blue; X if ((red == q->red) && (green == q->green) && X (blue == q->blue) && (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=index; X q->length=0; X } X index=(*p) & 3; X red=image->colormap[index].red; X green=image->colormap[index].green; X blue=image->colormap[index].blue; X if ((red == q->red) && (green == q->green) && X (blue == q->blue) && (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=index; X q->length=0; X } X p++; X } X break; X } X case 4: X { X for (x=0; x < image->columns; x+=2) X { X index=(*p >> 4); X red=image->colormap[index].red; X green=image->colormap[index].green; X blue=image->colormap[index].blue; X if ((red == q->red) && (green == q->green) && X (blue == q->blue) && (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=index; X q->length=0; X } X index=(*p) & 0xf; X red=image->colormap[index].red; X green=image->colormap[index].green; X blue=image->colormap[index].blue; X if ((red == q->red) && (green == q->green) && X (blue == q->blue) && (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=index; X q->length=0; X } X p++; X } X break; X } X case 8: X { X for (x=0; x < image->columns; x++) X { X index=(*p); X red=image->colormap[index].red; X green=image->colormap[index].green; X blue=image->colormap[index].blue; X if ((red == q->red) && (green == q->green) && X (blue == q->blue) && (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=index; X q->length=0; X } X p++; X } X break; X } X default: X break; X } X break; X } X case PHOTOMETRIC_PALETTE: X { X for (x=0; x < image->columns; x++) X { X index=(*p++); X red=image->colormap[index].red; X green=image->colormap[index].green; X blue=image->colormap[index].blue; X if ((red == q->red) && (green == q->green) && (blue == q->blue) && X (q->length < MaxRunlength)) X q->length++; X else X { X if (image->packets > 0) X q++; X image->packets++; X q->red=red; X q->green=green; X q->blue=blue; X q->index=index; X q->length=0; X } X } X break; X } X default: X break; X } X } X free((char *) scanline); X TIFFClose(file); X if (image->class == PseudoClass) X QuantizeImage(image,image->colors,8,False,True); X if (image->packets > ((image->columns*image->rows*3) >> 2)) X image->compression=NoCompression; X image->pixels=(RunlengthPacket *) X realloc((char *) image->pixels,image->packets*sizeof(RunlengthPacket)); X return(image); } X /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % U s a g e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Procedure Usage displays the program usage; % % The format of the Usage routine is: % % Usage(message) % % A description of each parameter follows: % % program_name: Specifies the name of this program. % % message: Specifies a specific message to display to the user. % */ static void Usage(message) char X *message; { X if (message != (char *) NULL) X (void) fprintf(stderr,"Can't continue, %s\n\n",message); X (void) fprintf(stderr,"Usage: %s [-scene #] image.tiff image.miff\n\n", X application_name); X (void) fprintf(stderr,"Specify 'image.tiff' as '-' for standard input.\n"); X (void) fprintf(stderr,"Specify 'image.miff' as '-' for standard output.\n"); X exit(1); } X /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % M a i n % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % */ int main(argc,argv) int X argc; X char X *argv[]; { X char X filename[256]; X X Image X *image; X X int X i; X X unsigned int X scene; X X /* X Initialize program variables. X */ X application_name=argv[0]; X i=1; X scene=0; X if (argc < 3) X Usage((char *) NULL); X /* X Read image and convert to MIFF format. X */ X if (strncmp(argv[i],"-scene",2) == 0) X { X i++; X scene=atoi(argv[i++]); X } X (void) strcpy(filename,argv[i++]); X image=ReadTIFFImage(filename); X if (image == (Image *) NULL) X exit(1); X (void) strcpy(image->filename,argv[i++]); X image->scene=scene; X (void) WriteImage(image); X (void) fprintf(stderr,"%s => %s %dx%d\n",filename,image->filename, X image->columns,image->rows); X DestroyImage(image); X return(False); } SHAR_EOF chmod 0755 ImageMagick/filters/TIFFtoMIFF.c || echo 'restore of ImageMagick/filters/TIFFtoMIFF.c failed' Wc_c="`wc -c < 'ImageMagick/filters/TIFFtoMIFF.c'`" test 25596 -eq "$Wc_c" || echo 'ImageMagick/filters/TIFFtoMIFF.c: original size 25596, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= ImageMagick/filters/MIFFtoTIFF.c ============== if test -f 'ImageMagick/filters/MIFFtoTIFF.c' -a X"$1" != X"-c"; then echo 'x - skipping ImageMagick/filters/MIFFtoTIFF.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting ImageMagick/filters/MIFFtoTIFF.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/filters/MIFFtoTIFF.c' && /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % EEEEE X X PPPP OOO RRRR TTTTT % % E X X P P O O R R T % % EEE X PPPP O O RRRR T % % E X X P O O R R T % % EEEEE X X P OOO R R T % % % % % % Export MIFF image to a TIFF raster format. % % % % % % % % Software Design % % John Cristy % % January 1991 % SHAR_EOF true || echo 'restore of ImageMagick/filters/MIFFtoTIFF.c failed' fi echo 'End of ImageMagick part 12' echo 'File ImageMagick/filters/MIFFtoTIFF.c is continued in part 13' echo 13 > _shar_seq_.tmp exit 0 -- Dan Heller O'Reilly && Associates Z-Code Software Comp-sources-x: Senior Writer President comp-sources-x@uunet.uu.net argv@ora.com argv@zipcode.com