This is getsize.c in view mode; [Download] [Up]
/* * GetGIFsize - reads the image size in a GIF file * * RCS: * $Revision: 2.3 $ * $Date: 1996/05/03 02:21:34 $ * * Security: * Unclassified * * Description: * This functions returns after reading the size params in a GIF file * * Input Parameters: * type identifier description * * char *filename * unsigned int *width; * unsigned int *height; * * Output Parameters: * type identifier description * * unsigned int *width * unsigned int *height * * Return Values: * value description * 0 on success * * Side Effects: * text * * Limitations and Comments: * text * * Development History: * when who why * 02/18/96 muquit first cut */ #include "combine.h" #include "defines.h" #include "errcds.h" int GetGIFsize(filename,width,height) char *filename; unsigned int *width, *height; { #define BitSet(byte, bit) (((byte) & (bit)) == (bit)) #define LSBFirstOrder(x, y) (((y) << 8) | (x)) int rc = 0; short int transparency_index; unsigned char c, *global_colormap, header[MaxTextLength], type[12]; unsigned int global_colors; FILE *fp=(FILE *) NULL; *width=0; *height=0; fp = fopen (filename, "rb"); if (fp == (FILE *) NULL) { fprintf (stderr, "could not open file: %s\n",filename); rc = OPEN_FAILED; goto ExitProcessing; } rc = Read_Data ((char *) type, 1, 6, fp); if ((rc == 1) || ((strncmp((char *) type, "GIF87", 5) != 0) && (strncmp ((char *) type, "GIF89", 5) != 0))) { fprintf (stderr, "Not a GIF Image: [%s]\n",filename); rc = NOT_A_GIF_FILE; goto ExitProcessing; } rc = Read_Data ((char *) header, 1, 7, fp); if (rc == 1) { rc = FAILED_TO_READ_SCREEND; goto ExitProcessing; } global_colors = 0; global_colormap = (unsigned char *) NULL; if (BitSet(header[4], 0x80)) { global_colors = 1 << ((header[4] & 0x07) + 1); fseek(fp,3*global_colors,1); } transparency_index = (-1); for ( ; ; ) { rc = Read_Data ((char *) &c, 1, 1, fp); if (rc == 1) { rc = 0; break; } if (c == ';') /* terminator */ break; if (c == '!') /* EXTENSION ! */ { rc = Read_Data ((char *) &c, 1, 1, fp); if (rc == 1) { rc = READ_ERR_EXT_BLOCK; goto ExitProcessing; } switch (c) { case 0xf9: /* Transperency */ { while (ReadDataBlock ((char *) header, fp) !=0) if ((header[0] * 0x01) == 1) { transparency_index = header[3]; } break; } case 0xfe: /* comment extension */ { int length; for ( ; ; ) { length = ReadDataBlock ((char *) header, fp); if (length <= 0) break; } break; } default: { while (ReadDataBlock ((char *) header, fp) != 0); break; } } } if (c != ',') continue; /* ** read Header Now */ rc = Read_Data ((char *) header, 1, 9, fp); if (rc == 1) { rc = READ_ERR_WIDTH_HEIGHT; goto ExitProcessing; } *width = LSBFirstOrder (header[4], header[5]); *height = LSBFirstOrder (header[6], header[7]); break; }/* for (;;) */ ExitProcessing: if (fp != (FILE *) NULL) (void) fclose ((FILE *) fp); return (rc); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.