⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gd_gif_in.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <math.h>#include <string.h>#include <stdlib.h>#include "gd.h"#include "php.h"/* Used only when debugging GIF compression code *//* #define DEBUGGING_ENVARS */#ifdef DEBUGGING_ENVARSstatic int verbose_set = 0;static int verbose;#define VERBOSE (verbose_set?verbose:set_verbose())static int set_verbose(void){ verbose = !!getenv("GIF_VERBOSE"); verbose_set = 1; return(verbose);}#else#define VERBOSE 0#endif#define        MAXCOLORMAPSIZE         256#define        TRUE    1#define        FALSE   0#define CM_RED         0#define CM_GREEN       1#define CM_BLUE                2#define        MAX_LWZ_BITS            12#define INTERLACE              0x40#define LOCALCOLORMAP  0x80#define BitSet(byte, bit)      (((byte) & (bit)) == (bit))#define        ReadOK(file,buffer,len) (gdGetBuf(buffer, len, file) != 0)#define LM_to_uint(a,b)                        (((b)<<8)|(a))/* We may eventually want to use this information, but def it out for now */#if 0static struct {       unsigned int    Width;       unsigned int    Height;       unsigned char   ColorMap[3][MAXCOLORMAPSIZE];       unsigned int    BitPixel;       unsigned int    ColorResolution;       unsigned int    Background;       unsigned int    AspectRatio;} GifScreen;#endifstatic struct {       int     transparent;       int     delayTime;       int     inputFlag;       int     disposal;} Gif89 = { -1, -1, -1, 0 };static int ReadColorMap (gdIOCtx *fd, int number, unsigned char (*buffer)[256]);static int DoExtension (gdIOCtx *fd, int label, int *Transparent);static int GetDataBlock (gdIOCtx *fd, unsigned char *buf);static int GetCode (gdIOCtx *fd, int code_size, int flag);static int LWZReadByte (gdIOCtx *fd, int flag, int input_code_size);static void ReadImage (gdImagePtr im, gdIOCtx *fd, int len, int height, unsigned char (*cmap)[256], int interlace); /*1.4//, int ignore); */int ZeroDataBlock;gdImagePtr gdImageCreateFromGifSource(gdSourcePtr inSource){        gdIOCtx         *in = gdNewSSCtx(inSource, NULL);        gdImagePtr      im;        im = gdImageCreateFromGifCtx(in);        in->gd_free(in);        return im;}gdImagePtrgdImageCreateFromGif(FILE *fdFile){        gdIOCtx		*fd = gdNewFileCtx(fdFile);        gdImagePtr    	im = 0;        im = gdImageCreateFromGifCtx(fd);        fd->gd_free(fd);        return im;}gdImagePtrgdImageCreateFromGifCtx(gdIOCtxPtr fd){/* 1.4       int imageNumber; */       int BitPixel;       int ColorResolution;       int Background;       int AspectRatio;       int Transparent = (-1);       unsigned char   buf[16];       unsigned char   c;       unsigned char   ColorMap[3][MAXCOLORMAPSIZE];       unsigned char   localColorMap[3][MAXCOLORMAPSIZE];       int             imw, imh;       int             useGlobalColormap;       int             bitPixel;       int	       i;       /*1.4//int             imageCount = 0; */       char            version[4];       gdImagePtr im = 0;       ZeroDataBlock = FALSE;       /*1.4//imageNumber = 1; */       if (! ReadOK(fd,buf,6)) {		return 0;	}       if (strncmp((char *)buf,"GIF",3) != 0) {		return 0;	}       strncpy(version, (char *)buf + 3, 3);       version[3] = '\0';       if ((strcmp(version, "87a") != 0) && (strcmp(version, "89a") != 0)) {		return 0;	}       if (! ReadOK(fd,buf,7)) {		return 0;	}       BitPixel        = 2<<(buf[4]&0x07);       ColorResolution = (int) (((buf[4]&0x70)>>3)+1);       Background      = buf[5];       AspectRatio     = buf[6];		imw = LM_to_uint(buf[0],buf[1]);		imh = LM_to_uint(buf[2],buf[3]); 		if (BitSet(buf[4], LOCALCOLORMAP)) {    /* Global Colormap */               if (ReadColorMap(fd, BitPixel, ColorMap)) {			return 0;		}       }       for (;;) {               if (! ReadOK(fd,&c,1)) {                       return 0;               }               if (c == ';') {         /* GIF terminator */			goto terminated;	       }               if (c == '!') {         /* Extension */                       if (! ReadOK(fd,&c,1)) {                               return 0;                       }                       DoExtension(fd, c, &Transparent);                       continue;               }               if (c != ',') {         /* Not a valid start character */                       continue;               }               /*1.4//++imageCount; */               if (! ReadOK(fd,buf,9)) {	               return 0;               }               useGlobalColormap = ! BitSet(buf[8], LOCALCOLORMAP);               bitPixel = 1<<((buf[8]&0x07)+1);			   if (!useGlobalColormap) {				   if (ReadColorMap(fd, bitPixel, localColorMap)) {					   return 0;				   }			   }			   	       if (!(im = gdImageCreate(imw, imh))) {			 return 0;	       }               im->interlace = BitSet(buf[8], INTERLACE);               if (! useGlobalColormap) {                       ReadImage(im, fd, imw, imh, localColorMap,                                  BitSet(buf[8], INTERLACE));                                  /*1.4//imageCount != imageNumber); */               } else {                       ReadImage(im, fd, imw, imh,                                 ColorMap,                                  BitSet(buf[8], INTERLACE));                                 /*1.4//imageCount != imageNumber); */               }               if (Transparent != (-1)) {                       gdImageColorTransparent(im, Transparent);               }	   	       goto terminated;       }terminated:       /* Terminator before any image was declared! */       if (!im) {		return 0;       }		if (!im->colorsTotal) {			gdImageDestroy(im);			return 0;		}       /* Check for open colors at the end, so          we can reduce colorsTotal and ultimately          BitsPerPixel */       for (i=((im->colorsTotal-1)); (i>=0); i--) {		if (im->open[i]) {                	im->colorsTotal--;                } else {                	break;                }       }        return im;}static intReadColorMap(gdIOCtx *fd, int number, unsigned char (*buffer)[256]){       int             i;       unsigned char   rgb[3];       for (i = 0; i < number; ++i) {               if (! ReadOK(fd, rgb, sizeof(rgb))) {                       return TRUE;               }               buffer[CM_RED][i] = rgb[0] ;               buffer[CM_GREEN][i] = rgb[1] ;               buffer[CM_BLUE][i] = rgb[2] ;       }       return FALSE;}static intDoExtension(gdIOCtx *fd, int label, int *Transparent){       static unsigned char     buf[256];       switch (label) {       case 0xf9:              /* Graphic Control Extension */               (void) GetDataBlock(fd, (unsigned char*) buf);               Gif89.disposal    = (buf[0] >> 2) & 0x7;               Gif89.inputFlag   = (buf[0] >> 1) & 0x1;               Gif89.delayTime   = LM_to_uint(buf[1],buf[2]);               if ((buf[0] & 0x1) != 0)                       *Transparent = buf[3];               while (GetDataBlock(fd, (unsigned char*) buf) > 0)                       ;               return FALSE;       default:               break;       }       while (GetDataBlock(fd, (unsigned char*) buf) > 0)               ;       return FALSE;}static intGetDataBlock_(gdIOCtx *fd, unsigned char *buf){       unsigned char   count;       if (! ReadOK(fd,&count,1)) {               return -1;       }       ZeroDataBlock = count == 0;       if ((count != 0) && (! ReadOK(fd, buf, count))) {               return -1;       }       return count;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -