This is gifheader.c in view mode; [Download] [Up]
/*
gifHeader.c
gifheader.c, gifbmap.c, and gif.h are based on "giftoppm"
of David Koblas.
They are modified by T. Ogihara. (1995)
*/
/* +-------------------------------------------------------------------+ */
/* | 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. | */
/* +-------------------------------------------------------------------+ */
#include <stdio.h>
#include "gif.h"
#include "strfunc.h"
gifHeader *loadGifHeader(FILE *fd, int *errcode)
{
unsigned char buf[16];
gifHeader *gh;
int cc;
if (! ReadOK(fd,buf,6)) {
*errcode = Err_FORMAT;
return NULL;
}
buf[6] = 0;
if (strcmp(buf,"GIF87a") != 0 && strcmp(buf,"GIF89a") != 0) {
*errcode = Err_FORMAT;
return NULL;
}
if ((gh = (gifHeader *)malloc(sizeof(gifHeader))) == NULL) {
*errcode = Err_MEMORY;
return NULL;
}
gh->width = get_short(fd);
gh->height = get_short(fd);
gh->colors = 2 << ((cc = getc(fd)) & 0x07);
gh->bits = 8;
gh->Resolution = ((cc & 0x70) >> 3) + 1;
gh->colormap = BitSet(cc, LOCALCOLORMAP);
gh->transp = -1;
gh->interlace = BitSet(cc, INTERLACE);
gh->isgray = NO;
gh->Background = getc(fd);
gh->AspectRatio = getc(fd);
strcpy(gh->ver, buf+3);
// gh->palette = ...;
gh->memo = NULL;
return gh;
}
void freeGifHeader(gifHeader *gh)
{
if (gh) {
if (gh->memo) free((void *)gh->memo);
free((void *)gh);
}
}
commonInfo *gifInfo(gifHeader *gh)
/* Convert gif-header into commonInfo */
{
commonInfo *cinf;
int i, pnum;
if (gh == NULL) return NULL;
cinf = (commonInfo *)malloc(sizeof(commonInfo));
cinf->width = gh->width;
cinf->height = gh->height;
cinf->type = Type_gif;
cinf->bits = gh->bits;
cinf->alpha = (gh->transp >= 0);
cinf->isplanar = YES;
cinf->numcolors = gh->isgray ? 1 : 3;
cinf->cspace = gh->isgray ? NX_OneIsWhiteColorSpace : NX_RGBColorSpace;
cinf->xbytes = byte_length(gh->bits, gh->width);
pnum = gh->colors + ((gh->transp >= 0) ? 1 : 0);
if (pnum > 256) pnum = 256;
cinf->palette = copyPalette(gh->palette, pnum);
/* Make the index of transparence the last entry of palette */
if (gh->transp >= 0) {
cinf->palsteps = --pnum;
if (gh->transp != pnum) {
unsigned char *p, *q;
p = gh->palette[pnum];
q = cinf->palette[gh->transp];
for (i = 0; i < 3; i++)
q[i] = p[i];
p = cinf->palette[pnum];
for (i = 0; i < 3; i++)
p[i] = 255;
}
}else
cinf->palsteps = gh->colors;
sprintf(cinf->memo, "%d x %d GIF%s%s%s %d%s",
gh->width, gh->height, gh->ver,
gh->interlace ? " Interlace" : "",
(gh->transp >= 0) ? " Alpha" : "",
gh->colors, gh->isgray?"steps":"colors");
if (gh->memo) {
strcat(cinf->memo, " : ");
comm_cat(cinf->memo, gh->memo);
}
return cinf;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.