This is writegif.c in view mode; [Download] [Up]
/* * WriteGIF() - writes an image in GIF format * * RCS: * $Revision: 2.3 $ * $Date: 1996/05/03 02:21:34 $ * * Security: * Unclassified * * Description: * this function writes an image in GIF89a format * GIF is copyrighted trademark of Compuserve Inc. * * from ImageMagick * Input Parameters: * type identifier description * * text * * Output Parameters: * type identifier description * * text * * Return Values: * value description * * Side Effects: * text * * Limitations and Comments: * text * * Development History: * when who why * 08/04/94 muquit first cut for ntf2gif */ #include "combine.h" #include "defines.h" #include "errcds.h" int WriteGIFImage(gifimage,filename) Image *gifimage; char *filename; { register int x, i; unsigned char bits_per_pixel, c, *alpha; unsigned int colors, status; FILE *fp; int rc = 0; register Runlength *p; setbuf(stdout, NULL); fp = stdout; #ifdef SYS_WIN32 _setmode(_fileno(fp), _O_BINARY); #endif colors = 256; gifimage->fp = fp; alpha=(unsigned char *)NULL; if (gifimage->alpha) { if (!UncompressImage(gifimage)) return (5); p=gifimage->pixels; alpha=(unsigned char *) malloc(gifimage->columns*gifimage->rows*sizeof(unsigned char)); if (alpha == (unsigned char *) NULL) { fprintf (stderr, "WriteGIF: memory allocation failed!\n"); rc = MALLOC_FAILED; goto ExitProcessing; } else { for(x=0; x < (gifimage->columns*gifimage->rows); x++) { alpha[x]=(unsigned char) (p->index & 0xff); p++; } colors--; } } if ((gifimage->class == DirectClass) || (gifimage->colors > colors)) { QuantizeImage(gifimage, colors, 8, False, RGBColorspace, True); SyncImage(gifimage); if (!UncompressImage(gifimage)) { (void) fprintf (stderr," Failed to uncompress!\n"); return(5); } } colors = gifimage->colors; if (alpha != (unsigned char *) NULL) { CompressColormap(gifimage); colors++; } #ifdef DEBUG fprintf (stderr, "GIF image colors: %d\n", colors); #endif for (bits_per_pixel = 1; bits_per_pixel < 8; bits_per_pixel++) if ((1 << bits_per_pixel) >= colors) break; /* ** Write GIF Header */ (void) fwrite("GIF89a", 1, 6, fp); (void) fflush(fp); LSBFirstWriteShort (gifimage->columns, fp); (void) fflush(fp); LSBFirstWriteShort (gifimage->rows, fp); (void) fflush(fp); c = 0x80; c|=(8-1) << 4; c|=(bits_per_pixel-1); (void) fputc((char) c, fp); (void) fputc (0x0, fp); (void) fputc (0x0, fp); /* ** write colormap */ for (i=0; i < gifimage->colors; i++) { (void) fputc ((char) gifimage->colormap[i].red, fp); (void) fputc ((char) gifimage->colormap[i].green, fp); (void) fputc ((char) gifimage->colormap[i].blue, fp); } /* ** wrtie transparent channel */ if (alpha != (unsigned char *) NULL) { p=gifimage->pixels; for (x=0; x < (gifimage->columns*gifimage->rows); x++) { if (alpha[x] == Transparent) break; p++; } (void) fputc((char) gifimage->colormap[p->index].red,fp); (void) fputc((char) gifimage->colormap[p->index].green,fp); (void) fputc((char) gifimage->colormap[p->index].blue,fp); i++; } for (; i < (int) (1 << bits_per_pixel); i++) { (void) fputc (0x0, fp); (void) fputc (0x0, fp); (void) fputc (0x0, fp); } if (strcmp(gifimage->type, "GIF87") != 0) { if (gifimage->comments != (char *) NULL) { register char *p; register unsigned int count; /* ** write comment extension block */ (void) fputc (0x21, fp); (void) fputc (0xfe, fp); p = gifimage->comments; while ((int) strlen (p) > 0) { count = Min ((int) strlen(p), 255); (void) fputc (count, fp); for (i=0; i < count; i++) (void) fputc (*p++, fp); } (void) fputc (0x0, fp); } if (alpha != (unsigned char *) NULL) { (void) fputc(0x21,fp); (void) fputc(0xf9,fp); (void) fputc(0x4,fp); (void) fputc(0x1,fp); (void) fputc(0x0,fp); (void) fputc(0x0,fp); (void) fputc((char) gifimage->colors,fp); (void) fputc(0x0,fp); p=gifimage->pixels; for (x=0; x < (gifimage->columns*gifimage->rows); x++) { if (alpha[x] == Transparent) p->index=gifimage->colors; p++; } (void) free ((char *) alpha); } } /* ** write gifimage separator */ (void) fputc (',', fp); LSBFirstWriteShort (0, fp); (void) fflush(fp); LSBFirstWriteShort (0, fp); (void) fflush(fp); LSBFirstWriteShort (gifimage->columns, fp); (void) fflush(fp); LSBFirstWriteShort (gifimage->rows, fp); (void) fflush(fp); (void) fputc (0x0, fp); c = Max(bits_per_pixel, 2); (void) fputc ((char) c, fp); status = LZWEncodeImage (gifimage, Max(bits_per_pixel, 2)+1); if (status == False) { (void) fprintf (stderr, "Unable to write gifimage, Memory allocation failed!\n"); rc = MALLOC_FAILED; goto ExitProcessing; } (void) fputc(0x0, fp); (void) fputc(';',fp); ExitProcessing: return (rc); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.