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

📄 gd_gif_in.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
static intGetDataBlock(gdIOCtx *fd, unsigned char *buf){	int rv;	int i;	char *tmp = NULL;		rv = GetDataBlock_(fd,buf);	if (VERBOSE) {		if (rv > 0) {			tmp = safe_emalloc(3 * rv, sizeof(char), 1);			for (i=0;i<rv;i++) {				sprintf(&tmp[3*sizeof(char)*i], " %02x", buf[i]);			}		} else {			tmp = estrdup("");		}		php_gd_error_ex(E_NOTICE, "[GetDataBlock returning %d: %s]", rv, tmp);		efree(tmp);	}	return(rv);}static intGetCode_(gdIOCtx *fd, int code_size, int flag){       static unsigned char    buf[280];       static int              curbit, lastbit, done, last_byte;       int                     i, j, ret;       unsigned char           count;       if (flag) {               curbit = 0;               lastbit = 0;               done = FALSE;               return 0;       }       if ( (curbit+code_size) >= lastbit) {               if (done) {                       if (curbit >= lastbit) {                                /* Oh well */                       }                                               return -1;               }               buf[0] = buf[last_byte-2];               buf[1] = buf[last_byte-1];               if ((count = GetDataBlock(fd, &buf[2])) <= 0)                       done = TRUE;               last_byte = 2 + count;               curbit = (curbit - lastbit) + 16;               lastbit = (2+count)*8 ;       }       ret = 0;       for (i = curbit, j = 0; j < code_size; ++i, ++j)               ret |= ((buf[ i / 8 ] & (1 << (i % 8))) != 0) << j;       curbit += code_size;       return ret;}static intGetCode(gdIOCtx *fd, int code_size, int flag){ int rv; rv = GetCode_(fd,code_size,flag); if (VERBOSE) php_gd_error_ex(E_NOTICE, "[GetCode(,%d,%d) returning %d]\n",code_size,flag,rv); return(rv);}#define STACK_SIZE ((1<<(MAX_LWZ_BITS))*2)static intLWZReadByte_(gdIOCtx *fd, int flag, int input_code_size){       static int      fresh = FALSE;       int             code, incode;       static int      code_size, set_code_size;       static int      max_code, max_code_size;       static int      firstcode, oldcode;       static int      clear_code, end_code;       static int      table[2][(1<< MAX_LWZ_BITS)];       static int      stack[STACK_SIZE], *sp;       register int    i;       if (flag) {               set_code_size = input_code_size;               code_size = set_code_size+1;               clear_code = 1 << set_code_size ;               end_code = clear_code + 1;               max_code_size = 2*clear_code;               max_code = clear_code+2;               GetCode(fd, 0, TRUE);                              fresh = TRUE;               for (i = 0; i < clear_code; ++i) {                       table[0][i] = 0;                       table[1][i] = i;               }               for (; i < (1<<MAX_LWZ_BITS); ++i)                       table[0][i] = table[1][0] = 0;               sp = stack;               return 0;       } else if (fresh) {               fresh = FALSE;               do {                       firstcode = oldcode =                               GetCode(fd, code_size, FALSE);               } while (firstcode == clear_code);               return firstcode;       }       if (sp > stack)               return *--sp;       while ((code = GetCode(fd, code_size, FALSE)) >= 0) {               if (code == clear_code) {                       for (i = 0; i < clear_code; ++i) {                               table[0][i] = 0;                               table[1][i] = i;                       }                       for (; i < (1<<MAX_LWZ_BITS); ++i)                               table[0][i] = table[1][i] = 0;                       code_size = set_code_size+1;                       max_code_size = 2*clear_code;                       max_code = clear_code+2;                       sp = stack;                       firstcode = oldcode =                                       GetCode(fd, code_size, FALSE);                       return firstcode;               } else if (code == end_code) {                       int             count;                       unsigned char   buf[260];                       if (ZeroDataBlock)                               return -2;                       while ((count = GetDataBlock(fd, buf)) > 0)                               ;                       if (count != 0)                       return -2;               }               incode = code;	       if (sp == (stack + STACK_SIZE)) {		       /* Bad compressed data stream */		       return -1;	       }               if (code >= max_code) {                       *sp++ = firstcode;                       code = oldcode;               }               while (code >= clear_code) {		       if (sp == (stack + STACK_SIZE)) {			       /* Bad compressed data stream */			       return -1;		       }                       *sp++ = table[1][code];                       if (code == table[0][code]) {                               /* Oh well */                       }                       code = table[0][code];               }               *sp++ = firstcode = table[1][code];               if ((code = max_code) <(1<<MAX_LWZ_BITS)) {                       table[0][code] = oldcode;                       table[1][code] = firstcode;                       ++max_code;                       if ((max_code >= max_code_size) &&                               (max_code_size < (1<<MAX_LWZ_BITS))) {                               max_code_size *= 2;                               ++code_size;                       }               }               oldcode = incode;               if (sp > stack)                       return *--sp;       }       return code;}static intLWZReadByte(gdIOCtx *fd, int flag, int input_code_size){ int rv; rv = LWZReadByte_(fd,flag,input_code_size); if (VERBOSE) php_gd_error_ex(E_NOTICE, "[LWZReadByte(,%d,%d) returning %d]\n",flag,input_code_size,rv); return(rv);}static voidReadImage(gdImagePtr im, gdIOCtx *fd, int len, int height, unsigned char (*cmap)[256], int interlace) /*1.4//, int ignore) */{       unsigned char   c;             int             v;       int             xpos = 0, ypos = 0, pass = 0;       int i;	   /*		**  Initialize the Compression routines		*/	   if (! ReadOK(fd,&c,1)) {		   return;	   }	   if (c > MAX_LWZ_BITS) {		   return;		   }       /* Stash the color map into the image */       for (i=0; (i<gdMaxColors); i++) {               im->red[i] = cmap[CM_RED][i];	               im->green[i] = cmap[CM_GREEN][i];	               im->blue[i] = cmap[CM_BLUE][i];	               im->open[i] = 1;       }       /* Many (perhaps most) of these colors will remain marked open. */       im->colorsTotal = gdMaxColors;       if (LWZReadByte(fd, TRUE, c) < 0) {               return;       }       /*       **  If this is an "uninteresting picture" ignore it.       **  REMOVED For 1.4       */       /*if (ignore) { */       /*        while (LWZReadByte(fd, FALSE, c) >= 0) */       /*                ; */       /*        return; */       /*} */       while ((v = LWZReadByte(fd,FALSE,c)) >= 0 ) {               /* This how we recognize which colors are actually used. */               if (im->open[v]) {                       im->open[v] = 0;               }               gdImageSetPixel(im, xpos, ypos, v);               ++xpos;               if (xpos == len) {                       xpos = 0;                       if (interlace) {                               switch (pass) {                               case 0:                               case 1:                                       ypos += 8; break;                               case 2:                                       ypos += 4; break;                               case 3:                                       ypos += 2; break;                               }                               if (ypos >= height) {                                       ++pass;                                       switch (pass) {                                       case 1:                                               ypos = 4; break;                                       case 2:                                               ypos = 2; break;                                       case 3:                                               ypos = 1; break;                                       default:                                               goto fini;                                       }                               }                       } else {                               ++ypos;                       }               }               if (ypos >= height)                       break;       }fini:       if (LWZReadByte(fd,FALSE,c)>=0) {               /* Ignore extra */       }}

⌨️ 快捷键说明

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