Annotation of embedaddon/php/ext/gd/libgd/gd_gd.c, revision 1.1.1.1

1.1       misho       1: #include <stdio.h>
                      2: #include <math.h>
                      3: #include <string.h>
                      4: #include <stdlib.h>
                      5: #include "gd.h"
                      6: 
                      7: #define TRUE 1
                      8: #define FALSE 0
                      9: 
                     10: /* Exported functions: */
                     11: extern void gdImageGd (gdImagePtr im, FILE * out);
                     12: 
                     13: 
                     14: /* Use this for commenting out debug-print statements. */
                     15: /* Just use the first '#define' to allow all the prints... */
                     16: /*#define GD2_DBG(s) (s) */
                     17: #define GD2_DBG(s)
                     18: 
                     19: /* */
                     20: /* Shared code to read color tables from gd file. */
                     21: /* */
                     22: int _gdGetColors (gdIOCtx * in, gdImagePtr im, int gd2xFlag)
                     23: {
                     24:        int i;
                     25:        if (gd2xFlag) {
                     26:                int trueColorFlag;
                     27:                if (!gdGetByte(&trueColorFlag, in)) {
                     28:                        goto fail1;
                     29:                }
                     30:                /* 2.0.12: detect bad truecolor .gd files created by pre-2.0.12.
                     31:                 * Beginning in 2.0.12 truecolor is indicated by the initial 2-byte
                     32:                 * signature.
                     33:                 */
                     34:                if (trueColorFlag != im->trueColor) {
                     35:                        goto fail1;
                     36:                }
                     37:                /* This should have been a word all along */
                     38:                if (!im->trueColor) {
                     39:                        if (!gdGetWord(&im->colorsTotal, in)) {
                     40:                                goto fail1;
                     41:                        }
                     42:                        if (im->colorsTotal > gdMaxColors) {
                     43:                                goto fail1;
                     44:                        }
                     45:                }
                     46:                /* Int to accommodate truecolor single-color transparency */
                     47:                if (!gdGetInt(&im->transparent, in)) {
                     48:                        goto fail1;
                     49:                }
                     50:        } else {
                     51:                if (!gdGetByte(&im->colorsTotal, in)) {
                     52:                        goto fail1;
                     53:                }
                     54:                if (!gdGetWord(&im->transparent, in)) {
                     55:                        goto fail1;
                     56:                }
                     57:                if (im->transparent == 257) {
                     58:                        im->transparent = (-1);
                     59:                }
                     60:        }
                     61: 
                     62:        GD2_DBG(printf("Pallette had %d colours (T=%d)\n", im->colorsTotal, im->transparent));
                     63: 
                     64:        if (im->trueColor) {
                     65:                return TRUE;
                     66:        }
                     67: 
                     68:        for (i = 0; i < gdMaxColors; i++) {
                     69:                if (!gdGetByte(&im->red[i], in)) {
                     70:                        goto fail1;
                     71:                }
                     72:                if (!gdGetByte(&im->green[i], in)) {
                     73:                        goto fail1;
                     74:                }
                     75:                if (!gdGetByte(&im->blue[i], in)) {
                     76:                        goto fail1;
                     77:                }
                     78:                if (gd2xFlag) {
                     79:                        if (!gdGetByte(&im->alpha[i], in)) {
                     80:                                goto fail1;
                     81:                        }
                     82:                }
                     83:        }
                     84: 
                     85:        for (i = 0; i < im->colorsTotal; i++) {
                     86:                im->open[i] = 0;
                     87:        }
                     88: 
                     89:        return TRUE;
                     90: fail1:
                     91:        return FALSE;
                     92: }
                     93: 
                     94: /* */
                     95: /* Use the common basic header info to make the image object. */
                     96: /* */
                     97: static gdImagePtr _gdCreateFromFile (gdIOCtx * in, int *sx, int *sy)
                     98: {
                     99:        gdImagePtr im;
                    100:        int gd2xFlag = 0;
                    101:        int trueColorFlag = 0;
                    102: 
                    103:        if (!gdGetWord(sx, in)) {
                    104:                goto fail1;
                    105:        }
                    106:        if (*sx == 65535 || *sx == 65534) {
                    107:                /* This is a gd 2.0 .gd file */
                    108:                gd2xFlag = 1;
                    109:                /* 2.0.12: 65534 signals a truecolor .gd file. There is a slight redundancy here but we can live with it. */
                    110:                if (*sx == 65534) {
                    111:                        trueColorFlag = 1;
                    112:                }
                    113:                if (!gdGetWord(sx, in)) {
                    114:                        goto fail1;
                    115:                }
                    116:        }
                    117:        if (!gdGetWord(sy, in)) {
                    118:                goto fail1;
                    119:        }
                    120: 
                    121:        GD2_DBG(printf("Image is %dx%d\n", *sx, *sy));
                    122: 
                    123:        if (trueColorFlag) {
                    124:                im = gdImageCreateTrueColor(*sx, *sy);
                    125:        } else {
                    126:                im = gdImageCreate(*sx, *sy);
                    127:        }
                    128:        if(!im) {
                    129:                goto fail1;
                    130:        }
                    131:        if (!_gdGetColors(in, im, gd2xFlag)) {
                    132:                goto fail2;
                    133:        }
                    134: 
                    135:        return im;
                    136: fail2:
                    137:        gdImageDestroy(im);
                    138: fail1:
                    139:        return 0;
                    140: }
                    141: 
                    142: gdImagePtr gdImageCreateFromGd (FILE * inFile)
                    143: {
                    144:        gdImagePtr im;
                    145:        gdIOCtx *in;
                    146: 
                    147:        in = gdNewFileCtx(inFile);
                    148:        im = gdImageCreateFromGdCtx(in);
                    149: 
                    150:        in->gd_free(in);
                    151: 
                    152:        return im;
                    153: }
                    154: 
                    155: gdImagePtr gdImageCreateFromGdPtr (int size, void *data)
                    156: {
                    157:        gdImagePtr im;
                    158:        gdIOCtx *in = gdNewDynamicCtxEx(size, data, 0);
                    159:        im = gdImageCreateFromGdCtx(in);
                    160:        in->gd_free(in);
                    161: 
                    162:        return im;
                    163: }
                    164: 
                    165: gdImagePtr gdImageCreateFromGdCtx (gdIOCtxPtr in)
                    166: {
                    167:        int sx, sy;
                    168:        int x, y;
                    169:        gdImagePtr im;
                    170: 
                    171:        /* Read the header */
                    172:        im = _gdCreateFromFile(in, &sx, &sy);
                    173: 
                    174:        if (im == NULL) {
                    175:                goto fail1;
                    176:        }
                    177: 
                    178:        /* Then the data... */
                    179:        /* 2.0.12: support truecolor properly in .gd as well as in .gd2. Problem reported by Andreas Pfaller. */
                    180:        if (im->trueColor) {
                    181:                for (y = 0; y < sy; y++) {
                    182:                        for (x = 0; x < sx; x++) {
                    183:                                int pix;
                    184:                                if (!gdGetInt(&pix, in)) {
                    185:                                        goto fail2;
                    186:                                }
                    187:                                im->tpixels[y][x] = pix;
                    188:                        }
                    189:                }
                    190:        } else {
                    191:                for (y = 0; y < sy; y++) {
                    192:                        for (x = 0; x < sx; x++) {
                    193:                                int ch;
                    194:                                ch = gdGetC(in);
                    195:                                if (ch == EOF) {
                    196:                                        goto fail2;
                    197:                                }
                    198:                                /* ROW-MAJOR IN GD 1.3 */
                    199:                                im->pixels[y][x] = ch;
                    200:                        }
                    201:                }
                    202:        }
                    203: 
                    204:        return im;
                    205: 
                    206: fail2:
                    207:        gdImageDestroy (im);
                    208: fail1:
                    209:        return 0;
                    210: }
                    211: 
                    212: void _gdPutColors (gdImagePtr im, gdIOCtx * out)
                    213: {
                    214:        int i;
                    215: 
                    216:        gdPutC(im->trueColor, out);
                    217:        if (!im->trueColor) {
                    218:                gdPutWord(im->colorsTotal, out);
                    219:        }
                    220:        gdPutInt(im->transparent, out);
                    221:        if (!im->trueColor) {
                    222:                for (i = 0; i < gdMaxColors; i++) {
                    223:                        gdPutC((unsigned char) im->red[i], out);
                    224:                        gdPutC((unsigned char) im->green[i], out);
                    225:                        gdPutC((unsigned char) im->blue[i], out);
                    226:                        gdPutC((unsigned char) im->alpha[i], out);
                    227:                }
                    228:        }
                    229: }
                    230: 
                    231: static void _gdPutHeader (gdImagePtr im, gdIOCtx * out)
                    232: {
                    233:        /* 65535 indicates this is a gd 2.x .gd file.
                    234:         * 2.0.12: 65534 indicates truecolor.
                    235:         */
                    236:        if (im->trueColor) {
                    237:                gdPutWord(65534, out);
                    238:        } else {
                    239:                gdPutWord(65535, out);
                    240:        }
                    241:        gdPutWord(im->sx, out);
                    242:        gdPutWord(im->sy, out);
                    243: 
                    244:        _gdPutColors(im, out);
                    245: }
                    246: 
                    247: static void _gdImageGd (gdImagePtr im, gdIOCtx * out)
                    248: {
                    249:        int x, y;
                    250: 
                    251:        _gdPutHeader(im, out);
                    252: 
                    253:        for (y = 0; y < im->sy; y++) {
                    254:                for (x = 0; x < im->sx; x++) {
                    255:                        /* ROW-MAJOR IN GD 1.3 */
                    256:                        if (im->trueColor) {
                    257:                                gdPutInt(im->tpixels[y][x], out);
                    258:                        } else {
                    259:                                gdPutC((unsigned char) im->pixels[y][x], out);
                    260:                        }
                    261:                }
                    262:        }
                    263: }
                    264: 
                    265: void gdImageGd (gdImagePtr im, FILE * outFile)
                    266: {
                    267:        gdIOCtx *out = gdNewFileCtx(outFile);
                    268:        _gdImageGd(im, out);
                    269:        out->gd_free(out);
                    270: }
                    271: 
                    272: void *gdImageGdPtr (gdImagePtr im, int *size)
                    273: {
                    274:        void *rv;
                    275:        gdIOCtx *out = gdNewDynamicCtx(2048, NULL);
                    276:        _gdImageGd(im, out);
                    277:        rv = gdDPExtractData(out, size);
                    278:        out->gd_free(out);
                    279:        return rv;
                    280: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>