This is giflib.c in view mode; [Download] [Up]
/*
Copyright Notice:
Copyright 1990 Robert C. Hood
This software is distributed "as is" without warranty. Use this software at your OWN RISK. Source may be distributed freely, at NO CHARGE, but must be accompanied by this documentation and copyright notice.
*/
#include <stdio.h>
#include <libc.h>
#include "giflib.h"
#include "io.h"
int readgifheader(char *filename, int *xsize, int *ysize)
{
if ( (GIF_file = fopen(filename,"rb")) == NULL){
return(-1);
}
if (getsig () < 0)
return -1;
if (getdesc () < 0)
return -1;
if (getgcmap () < 0)
return -1;
if (getidesc () < 0)
return -1;
*xsize = GIF_xsize;
*ysize = GIF_ysize;
return 0;
}
int readgif(unsigned char *rmap, unsigned char *gmap, unsigned char *bmap)
{
int loop;
GIF_curx = 0;
GIF_cury = 0;
GIF_ytemp = 8;
GIF_ystart = 0;
r = rmap;
g = gmap;
b = bmap;
for (loop = 0; loop < (GIF_ysize * GIF_xsize); ++loop){
r [loop] = GIF_globalmap [GIF_background * 3];
b [loop] = GIF_globalmap [GIF_background * 3 + 1];
g [loop] = GIF_globalmap [GIF_background * 3 + 2];
}
if ((r == 0) || (g == 0) || (b == 0))
return -1;
loop = getimage ();
free (GIF_globalmap);
fclose(GIF_file);
return loop;
}
int getsig(void)
{
if (((char)fgetc (GIF_file) != 'G') || ((char)fgetc (GIF_file) != 'I') ||
((char)fgetc (GIF_file) != 'F') || ((char)fgetc (GIF_file) != '8') ||
((char)fgetc (GIF_file) != '7') || ((char)fgetc (GIF_file) != 'a'))
return (-1);
return 0;
}
int getdesc (void)
{
unsigned char temp;
GIF_swidth = (int)fgetc (GIF_file) + ((int)fgetc (GIF_file) << 8);
GIF_sheight = (int)fgetc (GIF_file) + ((int)fgetc (GIF_file) << 8);
temp = (unsigned char)fgetc (GIF_file);
GIF_gmap = temp >> 7;
GIF_colorres = (temp >> 4) & 7;
GIF_gbits = temp & 7;
GIF_background = fgetc (GIF_file);
if (fgetc (GIF_file) != 0)
return (-1);
return 0;
}
int getgcmap (void)
{
int size, loop;
unsigned char *ptr;
if (GIF_gmap){
size = 1 << (GIF_gbits + 1);
if ((GIF_globalmap = (unsigned char *)malloc (sizeof (char) * size * 3)) == 0)
return -1;
ptr = GIF_globalmap;
for (loop = 0; loop < size * 3; ++loop){
*ptr = fgetc (GIF_file);
++ptr;
}
}else{
GIF_globalmap = 0;
}
return(0);
}
int getidesc (void)
{
unsigned char temp;
if ((char)fgetc (GIF_file) != ',')
return -1;
GIF_xpos = (int)fgetc (GIF_file) + ((int)fgetc (GIF_file) << 8);
GIF_ypos = (int)fgetc (GIF_file) + ((int)fgetc (GIF_file) << 8);
GIF_xsize = (int)fgetc (GIF_file) + ((int)fgetc (GIF_file) << 8);
GIF_ysize = (int)fgetc (GIF_file) + ((int)fgetc (GIF_file) << 8);
temp = fgetc (GIF_file);
GIF_lmap = temp >> 7;
GIF_interlaced = (temp >> 6) & 1;
GIF_lbits = temp & 7;
return 0;
}
unsigned short *table [4096];
char hex [] = "0123456789abcdef";
void output (int code, int bits)
{
register int loop;
unsigned char *ptr;
unsigned short *p;
p = table [code];
for (loop = 1; loop < ((int)*p + 1); ++loop){
ptr = GIF_globalmap + *(p + loop) * 3;
*(r + (GIF_cury * GIF_xsize) + GIF_curx) = *ptr;
*(g + (GIF_cury * GIF_xsize) + GIF_curx) = *(ptr + 1);
*(b + (GIF_cury * GIF_xsize) + GIF_curx) = *(ptr + 2);
if ((++(GIF_curx)) == GIF_xsize){
GIF_curx = 0;
if (GIF_interlaced == 0)
++GIF_cury;
else{
GIF_cury += GIF_ytemp;
if (GIF_cury >= GIF_ysize){
++GIF_ystart;
switch (GIF_ystart){
case 1:
GIF_ytemp = 8;
GIF_cury = 4;
break;
case 2:
GIF_ytemp = 4;
GIF_cury = 2;
break;
case 3:
GIF_ytemp = 2;
GIF_cury = 1;
break;
}
}
}
}
}
}
int getimage (void)
{
unsigned int first, data, bits, dsize, csize, clear, eod, maxcode, nextcode, oldcode=0;
register unsigned int totalbits, maxbits, loop, done;
csize = fgetc (GIF_file);
bits = csize + 1;
for (loop = 0; loop < (1 << csize); ++ loop){
table [loop] = (unsigned short *)malloc (sizeof (unsigned short) * 2);
*table [loop] = 1;
*(table [loop] + 1) = (unsigned char)loop;
}
dsize = fgetc (GIF_file);
startbuffer (dsize);
totalbits = 0;
maxbits = dsize * 8;
clear = 1 << csize;
eod = clear + 1;
nextcode = eod + 1;
maxcode = (1 << bits) - 1;
done = 0;
first = 1;
while (!done){
if ((totalbits + bits) >= maxbits){
/* data = getbits (maxbits - totalbits) << (bits - (maxbits - totalbits)); */
data = getbits (maxbits - totalbits);
dsize = fgetc (GIF_file);
startbuffer (dsize);
data += (getbits (bits - (maxbits - totalbits)) << (maxbits - totalbits));
totalbits = (bits - (maxbits - totalbits));
maxbits = dsize * 8;
}else{
data = getbits (bits);
totalbits += bits;
}
if (data == clear){
bits = csize + 1;
for (loop = clear + 2; loop < nextcode; ++loop)
free (table [loop]);
nextcode = clear + 2;
maxcode = (1 << bits) - 1;
first = 1;
}else
if (data == eod){
done = 1;
}else
if (first == 1){
first = 0;
output (data, clear);
oldcode = data;
}else
if (data < nextcode){
output (data, clear);
table [nextcode] = (unsigned short *)malloc (sizeof (unsigned short) * (*table [oldcode] + 2));
for (loop = 1; loop < ((int)*table [oldcode] + 1); ++loop)
*(table [nextcode] + loop) = *(table [oldcode] + loop);
*table [nextcode] = *table [oldcode] + 1;
*(table [nextcode] + *table [nextcode]) = *(table [data] + 1);
++nextcode;
if (nextcode > maxcode){
if (nextcode != 4096){
++bits;
maxcode = (1 << bits) - 1;
}
}
oldcode = data;
}
else
if (data == nextcode){
table [nextcode] = (unsigned short *)malloc (sizeof (unsigned short) *
(*table [oldcode] + 2));
for (loop = 1; loop < ((int)*table [oldcode] + 1); ++loop)
*(table [nextcode] + loop) = *(table [oldcode] + loop);
*table [nextcode] = *table [oldcode] + 1;
*(table [nextcode] + *table [nextcode]) = *(table [oldcode]+1);
output (nextcode, clear);
++nextcode;
if (nextcode > maxcode){
if (nextcode != 4096){
++bits;
maxcode = (1 << bits) - 1;
}
}
oldcode = data;
}
else /* BAD */
{
return (-1);
}
}
for (loop = clear + 2; loop < nextcode; ++loop)
free (table [loop]);
return 0;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.