Annotation of embedaddon/php/ext/gd/libgd/xbm.c, revision 1.1.1.1
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
5: | Copyright (c) 1997-2010 The PHP Group |
6: +----------------------------------------------------------------------+
7: | This source file is subject to version 3.01 of the PHP license, |
8: | that is bundled with this package in the file LICENSE, and is |
9: | available through the world-wide-web at the following url: |
10: | http://www.php.net/license/3_01.txt |
11: | If you did not receive a copy of the PHP license and are unable to |
12: | obtain it through the world-wide-web, please send a note to |
13: | license@php.net so we can mail you a copy immediately. |
14: +----------------------------------------------------------------------+
15: | Author: Marcus Boerger <helly@php.net> |
16: +----------------------------------------------------------------------+
17: */
18:
19: /* $Id: xbm.c 293036 2010-01-03 09:23:27Z sebastian $ */
20:
21: #include <stdio.h>
22: #include <math.h>
23: #include <string.h>
24: #include <stdlib.h>
25: #include "gd.h"
26: #include "gdhelpers.h"
27:
28: #include "php.h"
29:
30: #define MAX_XBM_LINE_SIZE 255
31:
32: /* {{{ gdImagePtr gdImageCreateFromXbm */
33: gdImagePtr gdImageCreateFromXbm(FILE * fd)
34: {
35: char fline[MAX_XBM_LINE_SIZE];
36: char iname[MAX_XBM_LINE_SIZE];
37: char *type;
38: int value;
39: unsigned int width = 0, height = 0;
40: int fail = 0;
41: int max_bit = 0;
42:
43: gdImagePtr im;
44: int bytes = 0, i;
45: int bit, x = 0, y = 0;
46: int ch;
47: char h[8];
48: unsigned int b;
49:
50: rewind(fd);
51: while (fgets(fline, MAX_XBM_LINE_SIZE, fd)) {
52: fline[MAX_XBM_LINE_SIZE-1] = '\0';
53: if (strlen(fline) == MAX_XBM_LINE_SIZE-1) {
54: return 0;
55: }
56: if (sscanf(fline, "#define %s %d", iname, &value) == 2) {
57: if (!(type = strrchr(iname, '_'))) {
58: type = iname;
59: } else {
60: type++;
61: }
62:
63: if (!strcmp("width", type)) {
64: width = (unsigned int) value;
65: }
66: if (!strcmp("height", type)) {
67: height = (unsigned int) value;
68: }
69: } else {
70: if ( sscanf(fline, "static unsigned char %s = {", iname) == 1
71: || sscanf(fline, "static char %s = {", iname) == 1)
72: {
73: max_bit = 128;
74: } else if (sscanf(fline, "static unsigned short %s = {", iname) == 1
75: || sscanf(fline, "static short %s = {", iname) == 1)
76: {
77: max_bit = 32768;
78: }
79: if (max_bit) {
80: bytes = (width * height / 8) + 1;
81: if (!bytes) {
82: return 0;
83: }
84: if (!(type = strrchr(iname, '_'))) {
85: type = iname;
86: } else {
87: type++;
88: }
89: if (!strcmp("bits[]", type)) {
90: break;
91: }
92: }
93: }
94: }
95: if (!bytes || !max_bit) {
96: return 0;
97: }
98:
99: if(!(im = gdImageCreate(width, height))) {
100: return 0;
101: }
102: gdImageColorAllocate(im, 255, 255, 255);
103: gdImageColorAllocate(im, 0, 0, 0);
104: h[2] = '\0';
105: h[4] = '\0';
106: for (i = 0; i < bytes; i++) {
107: while (1) {
108: if ((ch=getc(fd)) == EOF) {
109: fail = 1;
110: break;
111: }
112: if (ch == 'x') {
113: break;
114: }
115: }
116: if (fail) {
117: break;
118: }
119: /* Get hex value */
120: if ((ch=getc(fd)) == EOF) {
121: break;
122: }
123: h[0] = ch;
124: if ((ch=getc(fd)) == EOF) {
125: break;
126: }
127: h[1] = ch;
128: if (max_bit == 32768) {
129: if ((ch=getc(fd)) == EOF) {
130: break;
131: }
132: h[2] = ch;
133: if ((ch=getc(fd)) == EOF) {
134: break;
135: }
136: h[3] = ch;
137: }
138: sscanf(h, "%x", &b);
139: for (bit = 1; bit <= max_bit; bit = bit << 1) {
140: gdImageSetPixel(im, x++, y, (b & bit) ? 1 : 0);
141: if (x == im->sx) {
142: x = 0;
143: y++;
144: if (y == im->sy) {
145: return im;
146: }
147: break;
148: }
149: }
150: }
151:
152: php_gd_error("EOF before image was complete");
153: gdImageDestroy(im);
154: return 0;
155: }
156: /* }}} */
157:
158: /* {{{ gdCtxPrintf */
159: void gdCtxPrintf(gdIOCtx * out, const char *format, ...)
160: {
161: char *buf;
162: int len;
163: va_list args;
164:
165: va_start(args, format);
166: len = vspprintf(&buf, 0, format, args);
167: va_end(args);
168: out->putBuf(out, buf, len);
169: efree(buf);
170: }
171: /* }}} */
172:
173: /* {{{ gdImageXbmCtx */
174: void gdImageXbmCtx(gdImagePtr image, char* file_name, int fg, gdIOCtx * out)
175: {
176: int x, y, c, b, sx, sy, p;
177: char *name, *f;
178: size_t i, l;
179:
180: name = file_name;
181: if ((f = strrchr(name, '/')) != NULL) name = f+1;
182: if ((f = strrchr(name, '\\')) != NULL) name = f+1;
183: name = estrdup(name);
184: if ((f = strrchr(name, '.')) != NULL && !strcasecmp(f, ".XBM")) *f = '\0';
185: if ((l = strlen(name)) == 0) {
186: efree(name);
187: name = estrdup("image");
188: } else {
189: for (i=0; i<l; i++) {
190: /* only in C-locale isalnum() would work */
191: if (!isupper(name[i]) && !islower(name[i]) && !isdigit(name[i])) {
192: name[i] = '_';
193: }
194: }
195: }
196:
197: gdCtxPrintf(out, "#define %s_width %d\n", name, gdImageSX(image));
198: gdCtxPrintf(out, "#define %s_height %d\n", name, gdImageSY(image));
199: gdCtxPrintf(out, "static unsigned char %s_bits[] = {\n ", name);
200:
201: efree(name);
202:
203: b = 1;
204: p = 0;
205: c = 0;
206: sx = gdImageSX(image);
207: sy = gdImageSY(image);
208: for (y = 0; y < sy; y++) {
209: for (x = 0; x < sx; x++) {
210: if (gdImageGetPixel(image, x, y) == fg) {
211: c |= b;
212: }
213: if ((b == 128) || (x == sx && y == sy)) {
214: b = 1;
215: if (p) {
216: gdCtxPrintf(out, ", ");
217: if (!(p%12)) {
218: gdCtxPrintf(out, "\n ");
219: p = 12;
220: }
221: }
222: p++;
223: gdCtxPrintf(out, "0x%02X", c);
224: c = 0;
225: } else {
226: b <<= 1;
227: }
228: }
229: }
230: gdCtxPrintf(out, "};\n");
231: }
232: /* }}} */
233:
234: /*
235: * Local variables:
236: * tab-width: 4
237: * c-basic-offset: 4
238: * End:
239: * vim600: sw=4 ts=4 fdm=marker
240: * vim<600: sw=4 ts=4
241: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>