Annotation of embedaddon/php/ext/gd/libgd/gd_gd.c, revision 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>