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

📄 gd.c

📁 Nessus的应用与漏洞扫描技术的研究
💻 C
📖 第 1 页 / 共 4 页
字号:
  { output(code_clear);    did_clear();  }}static void rl_flush_fromclear(int count){ int n; if (VERBOSE) printf("rl_flush_fromclear %d\n",count); max_out_clear(); rl_table_pixel = rl_pixel; n = 1; while (count > 0)  { if (n == 1)     { rl_table_max = 1;       output_plain(rl_pixel);       count --;     }    else if (count >= n)     { rl_table_max = n;       output_plain(rl_basecode+n-2);       count -= n;     }    else if (count == 1)     { rl_table_max ++;       output_plain(rl_pixel);       count = 0;     }    else     { rl_table_max ++;       output_plain(rl_basecode+count-2);       count = 0;     }    if (out_count == 0) n = 1; else n ++;  } reset_out_clear(); if (VERBOSE) printf("rl_flush_fromclear leaving table_max=%d\n",rl_table_max);}static void rl_flush_clearorrep(int count){ int withclr; if (VERBOSE) printf("rl_flush_clearorrep %d\n",count); withclr = 1 + compute_triangle_count(count,max_ocodes); if (withclr < count)  { output(code_clear);    did_clear();    rl_flush_fromclear(count);  } else  { for (;count>0;count--) output_plain(rl_pixel);  }}static void rl_flush_withtable(int count){ int repmax; int repleft; int leftover; if (VERBOSE) printf("rl_flush_withtable %d\n",count); repmax = count / rl_table_max; leftover = count % rl_table_max; repleft = (leftover ? 1 : 0); if (out_count+repmax+repleft > max_ocodes)  { repmax = max_ocodes - out_count;    leftover = count - (repmax * rl_table_max);    repleft = 1 + compute_triangle_count(leftover,max_ocodes);  } if (VERBOSE) printf("rl_flush_withtable repmax=%d leftover=%d repleft=%d\n",repmax,leftover,repleft); if (1+compute_triangle_count(count,max_ocodes) < repmax+repleft)  { output(code_clear);    did_clear();    rl_flush_fromclear(count);    return;  } max_out_clear(); for (;repmax>0;repmax--) output_plain(rl_basecode+rl_table_max-2); if (leftover)  { if (just_cleared)     { rl_flush_fromclear(leftover);     }    else if (leftover == 1)     { output_plain(rl_pixel);     }    else     { output_plain(rl_basecode+leftover-2);     }  } reset_out_clear();}static void rl_flush(void){ int table_reps; int table_extra; if (VERBOSE) printf("rl_flush [ %d %d\n",rl_count,rl_pixel); if (rl_count == 1)  { output_plain(rl_pixel);    rl_count = 0;    if (VERBOSE) printf("rl_flush ]\n");    return;  } if (just_cleared)  { rl_flush_fromclear(rl_count);  } else if ((rl_table_max < 2) || (rl_table_pixel != rl_pixel))  { rl_flush_clearorrep(rl_count);  } else  { rl_flush_withtable(rl_count);  } if (VERBOSE) printf("rl_flush ]\n"); rl_count = 0;}static void compress(int init_bits, FILE *outfile, gdImagePtr im, int background){ int c; ofile = outfile; obuf = 0; obits = 0; oblen = 0; code_clear = 1 << (init_bits - 1); code_eof = code_clear + 1; rl_basecode = code_eof + 1; out_bump_init = (1 << (init_bits - 1)) - 1; /* for images with a lot of runs, making out_clear_init larger will    give better compression. */  out_clear_init = (init_bits <= 3) ? 9 : (out_bump_init-1);#ifdef DEBUGGING_ENVARS  { const char *ocienv;    ocienv = getenv("GIF_OUT_CLEAR_INIT");    if (ocienv)     { out_clear_init = atoi(ocienv);       if (VERBOSE) printf("[overriding out_clear_init to %d]\n",out_clear_init);     }  }#endif out_bits_init = init_bits; max_ocodes = (1 << GIFBITS) - ((1 << (out_bits_init - 1)) + 3); did_clear(); output(code_clear); rl_count = 0; while (1)  { c = GIFNextPixel(im);    if ((rl_count > 0) && (c != rl_pixel)) rl_flush();    if (c == EOF) break;    if (rl_pixel == c)     { rl_count ++;     }    else     { rl_pixel = c;       rl_count = 1;     }  } output(code_eof); output_flush();}/*----------------------------------------------------------------------- * * End of miGIF section  - See copyright notice at start of section. */*-----------------------------------------------------------------------/****************************************************************************** * * GIF Specific routines * ******************************************************************************//* * Number of characters so far in this 'packet' */static int a_count;/* * Set up the 'byte output' routine */static voidchar_init(void){        a_count = 0;}/* * Define the storage for the packet accumulator */static char accum[ 256 ];static void init_statics(void) {	/* Some of these are properly initialized later. What I'm doing		here is making sure code that depends on C's initialization		of statics doesn't break when the code gets called more		than once. */	Width = 0;	Height = 0;	curx = 0;	cury = 0;	CountDown = 0;	Pass = 0;	Interlace = 0;	a_count = 0;}/* +-------------------------------------------------------------------+ *//* | Copyright 1990, 1991, 1993, David Koblas.  (koblas@netcom.com)    | *//* |   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.           | *//* +-------------------------------------------------------------------+ */#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) (fread(buffer, len, 1, 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 (FILE *fd, int number, unsigned char (*buffer)[256]);static int DoExtension (FILE *fd, int label, int *Transparent);static int GetDataBlock (FILE *fd, unsigned char *buf);static int GetCode (FILE *fd, int code_size, int flag);static int LWZReadByte (FILE *fd, int flag, int input_code_size);static void ReadImage (gdImagePtr im, FILE *fd, int len, int height, unsigned char (*cmap)[256], int interlace, int ignore);int ZeroDataBlock;gdImagePtrgdImageCreateFromGif(FILE *fd){       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             imageCount = 0;       char            version[4];       gdImagePtr im = 0;       ZeroDataBlock = FALSE;       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];       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 */                       int i;                       if (imageCount < imageNumber) {                               return 0;                       }                       /* Terminator before any image was declared! */                       if (!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;               }               if (c == '!') {         /* Extension */                       if (! ReadOK(fd,&c,1)) {                               return 0;                       }                       DoExtension(fd, c, &Transparent);                       continue;               }               if (c != ',') {         /* Not a valid start character */                       continue;               }               ++imageCount;               if (! ReadOK(fd,buf,9)) {	               return 0;               }               useGlobalColormap = ! BitSet(buf[8], LOCALCOLORMAP);               bitPixel = 1<<((buf[8]&0x07)+1);               imw = LM_to_uint(buf[4],buf[5]);               imh = LM_to_uint(buf[6],buf[7]);	       if (!(im = gdImageCreate(imw, imh))) {			 return 0;	       }               im->interlace = BitSet(buf[8], INTERLACE);               if (! useGlobalColormap) {                       if (ReadColorMap(fd, bitPixel, localColorMap)) {                                  return 0;                       }                       ReadImage(im, fd, imw, imh, localColorMap,                                  BitSet(buf[8], INTERLACE),                                  imageCount != imageNumber);               } else {                       ReadImage(im, fd, imw, imh,                                 ColorMap,                                  BitSet(buf[8], INTERLACE),                                  imageCount != imageNumber);               }               if (Transparent != (-1)) {                       gdImageColorTransparent(im, Transparent);               }	          }}static intReadColorMap(FILE *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(FILE *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_(FILE *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;}static intGetDataBlock(FILE *fd, unsigned char *buf){ int rv; int i; rv = GetDataBlock_(fd,buf); if (VERBOSE)  { printf("[GetDataBlock returning %d",rv);    if (rv > 0)     { printf(":");       for (i=0;i<rv;i++) printf(" %02x",buf[i]);     }    printf("]\n");  } return(rv);}static intGetCode_(FILE *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(FILE *fd, int code_size, int flag){ int rv; rv = GetCode_(fd,code_size,flag); if (VERBOSE) printf("[GetCode(,%d,%d) returning %d]\n",code_size,flag,rv); return(rv);}static intLWZReadByte_(FILE *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[(1<<(MAX_LWZ_BITS))*2], *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 (code >= max_code) {                       *sp++ = firstcode;                       code = oldcode;               }               while (code >= clear_code) {                       *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(FILE *fd, int flag, int input_code_size){ int rv; rv = LWZReadByte_(fd,flag,input_code_size); if (VERBOSE) printf("[LWZReadByte(,%d,%d) returning %d]\n",flag,input_code_size,rv); return(rv);}static voidReadImage(gdImagePtr im, FILE *fd, int len, int height, unsigned char (*cmap)[256], int interlace, int ignore){       unsigned char   c;             int             v;       int             xpos = 0, ypos = 0, pass = 0;       int i;       /* 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;

⌨️ 快捷键说明

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