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