Annotation of parser3/src/lib/gd/gif.h, revision 1.1

1.1     ! paf         1: /** @file
        !             2:        Parser: image manipulations decls.
        !             3: 
        !             4:        Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
        !             5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
        !             6:        based on:
        !             7:        gd.h: declarations file for the gifdraw module.
        !             8: 
        !             9:        Written by Tom Boutell, 5/94.
        !            10:        Copyright 1994, Cold Spring Harbor Labs.
        !            11:        Permission granted to use this code in any fashion provided
        !            12:        that this notice is retained and any alterations are
        !            13:        labeled as such. It is requested, but not required, that
        !            14:        you share extensions to this module with us so that we
        !            15:        can incorporate them into new versions. 
        !            16: */
        !            17: 
        !            18: #ifndef GIF_H
        !            19: #define GIF_H
        !            20: 
        !            21: static const char * const IDENT_GIF_H="$Date: 2003/11/20 16:34:24 $";
        !            22: 
        !            23: #include "pa_config_includes.h"
        !            24: 
        !            25: 
        !            26: #include "pa_memory.h"
        !            27: 
        !            28: #define gdMaxColors 0x100
        !            29: #define HSIZE  5003            /* 80% occupancy */
        !            30: 
        !            31: struct gdBuf {
        !            32:        void *ptr;
        !            33:        size_t size;
        !            34: 
        !            35:        gdBuf(void *aptr, size_t asize): ptr(aptr), size(asize) {}
        !            36: };
        !            37: 
        !            38: class gdGrowingBuf: PA_Object {
        !            39:        unsigned char *fptr;
        !            40:        size_t fallocated;
        !            41:        size_t fused;
        !            42: 
        !            43:        void expand(size_t delta) {
        !            44:                size_t new_allocated=fallocated+delta;
        !            45:                fptr=(unsigned char*)realloc(fptr, new_allocated);
        !            46:                fallocated=new_allocated;
        !            47:        }
        !            48: public:
        !            49:        operator gdBuf() { return gdBuf(fptr, fused); }
        !            50: 
        !            51:        gdGrowingBuf(): fptr(0), fallocated(0), fused(0) {}
        !            52: 
        !            53:        void append(unsigned char *abuf, size_t asize) {
        !            54:                ssize_t delta=asize-(fallocated-fused);
        !            55:                if(delta>0)
        !            56:                        expand(delta+100);
        !            57: 
        !            58:                memcpy(&fptr[fused], abuf, asize);
        !            59:                fused+=asize;
        !            60:        }
        !            61: };
        !            62: 
        !            63: /** Image type. 
        !            64:        See functions below; you will not need to change
        !            65:        the elements directly. Use the provided macros to
        !            66:        access sx, sy, the color table, and colorsTotal for 
        !            67:        read-only purposes. 
        !            68: */
        !            69: class gdImage: public PA_Object {
        !            70: 
        !            71: public: 
        !            72:        
        !            73:        //@{
        !            74:        /// @name Functions to manipulate images
        !            75:        void Create(int asx, int asy);
        !            76:        bool CreateFromGif(FILE *fd);
        !            77:        void SetPixel(int x, int y, int color);
        !            78:        int GetPixel(int x, int y);
        !            79:        void Line(int x1, int y1, int x2, int y2, int color);
        !            80:        void StyledLine(int x1, int y1, int x2, int y2, int color, const char* lineStyle);
        !            81:        void Rectangle(int x1, int y1, int x2, int y2, int color);
        !            82:        void LineReplaceColor(int x1, int y1, int x2, int y2, int a, int b);
        !            83:        void FilledRectangle(int x1, int y1, int x2, int y2, int color);
        !            84:        //@}
        !            85: 
        !            86:        /// Point type for use in polygon drawing.
        !            87:        struct Point {
        !            88:                int x, y;
        !            89:        };
        !            90:        
        !            91:        void Polygon(Point *p, int n, int c, bool closed=true);
        !            92:        void FilledPolygon(Point *p, int n, int c);
        !            93:        void FilledPolygonReplaceColor(Point *p, int n, int a, int b);
        !            94: 
        !            95:        int ColorAllocate(int r, int g, int b);
        !            96:        int ColorClosest(int r, int g, int b, int tolerance=0);
        !            97:        int ColorExact(int r, int g, int b);
        !            98:        int ColorRGB(int r, int g, int b);
        !            99:        int Color(unsigned int rgb);
        !           100:        void ColorDeallocate(int color);
        !           101:        void SetColorTransparent(int color);
        !           102:        
        !           103:        int BoundsSafe(int x, int y);
        !           104:        void DoSetPixel(int x, int y, int color);
        !           105:        
        !           106:        gdBuf Gif();
        !           107:        void Arc(int cx, int cy, int w, int h, int s, int e, int color);
        !           108:        void Sector(int cx, int cy, int w, int h, int s, int e, int color);
        !           109:        void FillToBorder(int x, int y, int border, int color);
        !           110:        void Fill(int x, int y, int color);
        !           111:        void Copy(gdImage& dst, int dstX, int dstY, int srcX, int srcY, int w, int h);
        !           112:        void CopyResampled(gdImage& dst, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH, int tolerance);
        !           113:        void SetLineWidth(int width);
        !           114:        void SetLineStyle(const char* aLineStyle);
        !           115:        void SetInterlace(int interlaceArg); /* On or off(1 or 0) */
        !           116:        
        !           117: public: 
        !           118: 
        !           119:        //@{
        !           120:        /// @name information about image. READ ONLY
        !           121:        int SX() { return sx; }
        !           122:        int SY() { return sy; }
        !           123:        int ColorsTotal() { return colorsTotal; }
        !           124:        int Red(int c) { return red[c]; }
        !           125:        int Green(int c) { return green[c]; }
        !           126:        int Blue(int c) { return blue[c]; }
        !           127:        int GetTransparent() { return transparent; }
        !           128:        int GetInterlaced() { return interlace; }
        !           129:        //@}
        !           130: 
        !           131: private:
        !           132: 
        !           133:        unsigned char ** pixels;
        !           134:        int sx;
        !           135:        int sy;
        !           136:        int colorsTotal;
        !           137:        int red[gdMaxColors];
        !           138:        int green[gdMaxColors];
        !           139:        int blue[gdMaxColors]; 
        !           140:        int open[gdMaxColors];
        !           141:        int transparent;
        !           142:        int *polyInts;
        !           143:        int polyAllocated;
        !           144:        int lineWidth; const char* lineStyle;
        !           145:        int interlace;
        !           146: 
        !           147: private: // read gif
        !           148: 
        !           149:        int GetDataBlock(FILE *fd, unsigned char *buf);
        !           150:        int LWZReadByte(FILE *fd, int flag, int input_code_size);
        !           151:        void ReadImage(FILE *fd, int len, int height, unsigned char(*cmap)[256], int interlace, int ignore);
        !           152:        int DoExtension(FILE *fd, int label, int *Transparent);
        !           153:        int GetCode(FILE *fd, int code_size, int flag);
        !           154: 
        !           155: private: // read gif
        !           156: 
        !           157:        int ZeroDataBlock;
        !           158:        
        !           159: };
        !           160: 
        !           161: ///    used by gdImage::Gif to produce buffer with bytes in GIF format
        !           162: class gdGifEncoder: public PA_Object {
        !           163: public:
        !           164: 
        !           165:        gdGifEncoder(gdImage& aim);
        !           166: 
        !           167:        gdBuf encode( 
        !           168:                int GWidth, int GHeight, 
        !           169:                int GInterlace, int Background, 
        !           170:                int Transparent, int BitsPerPixel, 
        !           171:                int *Red, int *Green, int *Blue);
        !           172: 
        !           173: private:
        !           174: 
        !           175:        /// a code_int must be able to hold 2**GIFBITS values of type int, and also -1
        !           176:        typedef int             code_int;
        !           177: #ifdef SIGNED_COMPARE_SLOW
        !           178:        typedef unsigned long int count_int;
        !           179:        typedef unsigned short int count_short;
        !           180: #else
        !           181:        typedef long int          count_int;
        !           182: #endif
        !           183: 
        !           184: private:
        !           185: 
        !           186:        void Putbyte(unsigned char c);
        !           187:        void Putword(int w);
        !           188:        void Write(void *buf, size_t size);
        !           189: 
        !           190:        void prepare_encoder(void);
        !           191:        void BumpPixel(void);
        !           192:        int GIFNextPixel();
        !           193:        void compress(int init_bits);
        !           194:        void output(code_int code);
        !           195:        void cl_block(void);
        !           196:        void cl_hash(count_int hsize);
        !           197:        void char_init(void);
        !           198:        void char_out(int c);
        !           199:        void flush_char(void);
        !           200: 
        !           201: private:
        !           202:        
        !           203:        gdImage& im;
        !           204:        gdGrowingBuf buf;
        !           205: 
        !           206:        int Width, Height;
        !           207:        int curx, cury;
        !           208:        long CountDown;
        !           209:        int Pass;
        !           210:        int Interlace;
        !           211: 
        !           212:        int g_init_bits;
        !           213: 
        !           214:        int ClearCode;
        !           215:        int EOFCode;
        !           216: 
        !           217:        int n_bits;                        /* number of bits/code */
        !           218:        int maxbits;                /* user settable max # bits/code */
        !           219:        
        !           220:        code_int maxcode;                  /* maximum code, given n_bits */
        !           221:        code_int maxmaxcode; /* should NEVER generate this code */
        !           222: 
        !           223:        count_int htab [HSIZE];
        !           224:        unsigned short codetab [HSIZE];
        !           225:        code_int hsize;                 /* for dynamic table sizing */
        !           226:        
        !           227:        code_int free_ent;                  /* first unused entry */
        !           228:        
        !           229:        /*
        !           230:        * block compression parameters -- after all codes are used up,
        !           231:        * and compression rate changes, start over.
        !           232:        */
        !           233:        int clear_flg;
        !           234:        
        !           235:        int offset;
        !           236:        long int in_count;            /* length of input */
        !           237:        long int out_count;           /* # of codes output(for debugging) */
        !           238:        
        !           239:        unsigned long cur_accum;
        !           240:        int cur_bits;
        !           241: 
        !           242:        /*
        !           243:         * Number of characters so far in this 'packet'
        !           244:         */
        !           245:        int a_count;
        !           246: 
        !           247:        /*
        !           248:         * Define the storage for the packet accumulator
        !           249:         */
        !           250:        char accum[ 256 ];
        !           251: 
        !           252: };
        !           253: 
        !           254: inline int gdImage::BoundsSafe(int x, int y){
        !           255:     return(!(((y < 0) ||(y >= sy)) ||((x < 0) ||(x >= sx))));
        !           256: }
        !           257: 
        !           258: inline /*paf int*/void gdImage::DoSetPixel(int x, int y, int color){
        !           259:     if(BoundsSafe(x, y)) pixels[x][y] = (unsigned char)color;
        !           260: }
        !           261: 
        !           262: #endif

E-mail: