Annotation of embedaddon/php/ext/gd/libgd/gdxpm.c, revision 1.1
1.1 ! misho 1:
! 2: /*
! 3: add ability to load xpm files to gd, requires the xpm
! 4: library.
! 5: Caolan.McNamara@ul.ie
! 6: http://www.csn.ul.ie/~caolan
! 7: */
! 8: #include <stdio.h>
! 9: #include <stdlib.h>
! 10: #include <string.h>
! 11: #include "gd.h"
! 12: #include "gdhelpers.h"
! 13:
! 14: #ifdef HAVE_XPM
! 15:
! 16: #include <X11/xpm.h>
! 17:
! 18: gdImagePtr gdImageCreateFromXpm (char *filename)
! 19: {
! 20: XpmInfo info;
! 21: XpmImage image;
! 22: int i, j, k, number;
! 23: char buf[5];
! 24: gdImagePtr im = 0;
! 25: int *pointer;
! 26: int red = 0, green = 0, blue = 0;
! 27: int *colors;
! 28: int ret;
! 29:
! 30: ret = XpmReadFileToXpmImage(filename, &image, &info);
! 31: if (ret != XpmSuccess) {
! 32: return 0;
! 33: }
! 34:
! 35: if (!(im = gdImageCreate(image.width, image.height))) {
! 36: goto done;
! 37: }
! 38:
! 39: number = image.ncolors;
! 40: colors = (int *) safe_emalloc(number, sizeof(int), 0);
! 41: for (i = 0; i < number; i++) {
! 42: switch (strlen (image.colorTable[i].c_color)) {
! 43: case 4:
! 44: buf[1] = '\0';
! 45: buf[0] = image.colorTable[i].c_color[1];
! 46: red = strtol(buf, NULL, 16);
! 47:
! 48: buf[0] = image.colorTable[i].c_color[2];
! 49: green = strtol(buf, NULL, 16);
! 50:
! 51: buf[0] = image.colorTable[i].c_color[3];
! 52: blue = strtol(buf, NULL, 16);
! 53: break;
! 54:
! 55: case 7:
! 56: buf[2] = '\0';
! 57: buf[0] = image.colorTable[i].c_color[1];
! 58: buf[1] = image.colorTable[i].c_color[2];
! 59: red = strtol(buf, NULL, 16);
! 60:
! 61: buf[0] = image.colorTable[i].c_color[3];
! 62: buf[1] = image.colorTable[i].c_color[4];
! 63: green = strtol(buf, NULL, 16);
! 64:
! 65: buf[0] = image.colorTable[i].c_color[5];
! 66: buf[1] = image.colorTable[i].c_color[6];
! 67: blue = strtol(buf, NULL, 16);
! 68: break;
! 69:
! 70: case 10:
! 71: buf[3] = '\0';
! 72: buf[0] = image.colorTable[i].c_color[1];
! 73: buf[1] = image.colorTable[i].c_color[2];
! 74: buf[2] = image.colorTable[i].c_color[3];
! 75: red = strtol(buf, NULL, 16);
! 76: red /= 64;
! 77:
! 78: buf[0] = image.colorTable[i].c_color[4];
! 79: buf[1] = image.colorTable[i].c_color[5];
! 80: buf[2] = image.colorTable[i].c_color[6];
! 81: green = strtol(buf, NULL, 16);
! 82: green /= 64;
! 83:
! 84: buf[0] = image.colorTable[i].c_color[7];
! 85: buf[1] = image.colorTable[i].c_color[8];
! 86: buf[2] = image.colorTable[i].c_color[9];
! 87: blue = strtol(buf, NULL, 16);
! 88: blue /= 64;
! 89: break;
! 90:
! 91: case 13:
! 92: buf[4] = '\0';
! 93: buf[0] = image.colorTable[i].c_color[1];
! 94: buf[1] = image.colorTable[i].c_color[2];
! 95: buf[2] = image.colorTable[i].c_color[3];
! 96: buf[3] = image.colorTable[i].c_color[4];
! 97: red = strtol(buf, NULL, 16);
! 98: red /= 256;
! 99:
! 100: buf[0] = image.colorTable[i].c_color[5];
! 101: buf[1] = image.colorTable[i].c_color[6];
! 102: buf[2] = image.colorTable[i].c_color[7];
! 103: buf[3] = image.colorTable[i].c_color[8];
! 104: green = strtol(buf, NULL, 16);
! 105: green /= 256;
! 106:
! 107: buf[0] = image.colorTable[i].c_color[9];
! 108: buf[1] = image.colorTable[i].c_color[10];
! 109: buf[2] = image.colorTable[i].c_color[11];
! 110: buf[3] = image.colorTable[i].c_color[12];
! 111: blue = strtol(buf, NULL, 16);
! 112: blue /= 256;
! 113: break;
! 114: }
! 115:
! 116:
! 117: colors[i] = gdImageColorResolve(im, red, green, blue);
! 118: }
! 119:
! 120: pointer = (int *) image.data;
! 121: for (i = 0; i < image.height; i++) {
! 122: for (j = 0; j < image.width; j++) {
! 123: k = *pointer++;
! 124: gdImageSetPixel(im, j, i, colors[k]);
! 125: }
! 126: }
! 127:
! 128: gdFree(colors);
! 129: done:
! 130: XpmFreeXpmImage(&image);
! 131: XpmFreeXpmInfo(&info);
! 132: return im;
! 133: }
! 134: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>