ftp.nice.ch/pub/next/graphics/viewer/ToyViewer.2.6a.s.tar.gz#/ToyViewer2.6a/src/gifheader.c

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.