From 1d9477f386bb1cdf84d2bc397a572e108b72d425 Mon Sep 17 00:00:00 2001 From: Marcus Boerger Date: Sun, 2 Feb 2003 01:34:54 +0000 Subject: [PATCH] - new xbm support @Added XBM support for bundled gd library. (marcus) # It was enabled by the last commit and fixed by this one. --- ext/gd/config.m4 | 3 +- ext/gd/libgd/gd.c | 2 + ext/gd/libgd/xbm.c | 150 +++++++++++++++++++++++++++++++++++++ ext/gd/tests/conv_test.xbm | 4 + ext/gd/tests/xbm2png.phpt | 26 +++++++ 5 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 ext/gd/libgd/xbm.c create mode 100644 ext/gd/tests/conv_test.xbm create mode 100644 ext/gd/tests/xbm2png.phpt diff --git a/ext/gd/config.m4 b/ext/gd/config.m4 index cbebee088b..deba71ee16 100644 --- a/ext/gd/config.m4 +++ b/ext/gd/config.m4 @@ -257,7 +257,8 @@ if test "$PHP_GD" = "yes"; then libgd/gd_io_file.c libgd/gd_ss.c libgd/gd_io_ss.c libgd/gd_png.c libgd/gd_jpeg.c \ libgd/gdxpm.c libgd/gdfontt.c libgd/gdfonts.c libgd/gdfontmb.c libgd/gdfontl.c \ libgd/gdfontg.c libgd/gdtables.c libgd/gdft.c libgd/gdcache.c libgd/gdkanji.c \ - libgd/wbmp.c libgd/gd_wbmp.c libgd/gdhelpers.c libgd/gd_topal.c libgd/gd_gif_in.c" + libgd/wbmp.c libgd/gd_wbmp.c libgd/gdhelpers.c libgd/gd_topal.c libgd/gd_gif_in.c \ + libgd/xbm.c" dnl check for fabsf and floorf which are available since C99 AC_CHECK_FUNCS(fabsf floorf) diff --git a/ext/gd/libgd/gd.c b/ext/gd/libgd/gd.c index 7eddeb7240..9867df0e9e 100644 --- a/ext/gd/libgd/gd.c +++ b/ext/gd/libgd/gd.c @@ -2777,6 +2777,7 @@ gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack) } /* End Rotate function */ +#if MBO_0 gdImagePtr gdImageCreateFromXbm (FILE * fd) { @@ -2902,6 +2903,7 @@ fail: gdImageDestroy (im); return 0; } +#endif /* MBO_0 */ void gdImagePolygon (gdImagePtr im, gdPointPtr p, int n, int c) diff --git a/ext/gd/libgd/xbm.c b/ext/gd/libgd/xbm.c new file mode 100644 index 0000000000..b873c51c1e --- /dev/null +++ b/ext/gd/libgd/xbm.c @@ -0,0 +1,150 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 4 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2003 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Marcus Boerger | + +----------------------------------------------------------------------+ + */ + +/* $Id$ */ + +#include +#include +#include +#include +#include "gd.h" +#include "gdhelpers.h" + +#include "php.h" + +#define MAX_XBM_LINE_SIZE 255 + +gdImagePtr +gdImageCreateFromXbm (FILE * fd) +{ + char fline[MAX_XBM_LINE_SIZE]; + char iname[MAX_XBM_LINE_SIZE]; + char *type; + int value; + unsigned int width = 0, height = 0; + int fail = 0; + int max_bit = 0; + + gdImagePtr im; + int bytes = 0, i; + int bit, x = 0, y = 0; + int ch; + char h[8]; + unsigned int b; + + rewind(fd); + while (fgets(fline, MAX_XBM_LINE_SIZE, fd)) { + fline[MAX_XBM_LINE_SIZE-1] = '\0'; + if (strlen(fline) == MAX_XBM_LINE_SIZE-1) { + return 0; + } + if (sscanf(fline, "#define %s %d", iname, &value) == 2) { + if (!(type = strrchr(iname, '_'))) { + type = iname; + } else { + type++; + } + + if (!strcmp("width", type)) { + width = (unsigned int) value; + } + if (!strcmp("height", type)) { + height = (unsigned int) value; + } + } else { + if ( sscanf(fline, "static unsigned char %s = {", iname) == 1 + || sscanf(fline, "static char %s = {", iname) == 1) + { + max_bit = 128; + } else if (sscanf(fline, "static unsigned short %s = {", iname) == 1 + || sscanf(fline, "static short %s = {", iname) == 1) + { + max_bit = 32768; + } + if (max_bit) { + bytes = (width * height / 8) + 1; + if (!bytes) { + return 0; + } + if (!(type = strrchr(iname, '_'))) { + type = iname; + } else { + type++; + } + if (!strcmp("bits[]", type)) { + break; + } + } + } + } + if (!bytes || !max_bit) { + return 0; + } + + im = gdImageCreate(width, height); + gdImageColorAllocate(im, 255, 255, 255); + gdImageColorAllocate(im, 0, 0, 0); + h[2] = '\0'; + h[4] = '\0'; + for (i = 0; i < bytes; i++) { + while (1) { + ch = getc(fd); + if (ch == EOF) + { + fail = 1; + break; + } + if (ch == 'x') + { + break; + } + } + if (fail) { + break; + } + /* Get hex value */ + if ((ch=getc(fd)) == EOF) break; + h[0] = ch; + if ((ch=getc(fd)) == EOF) break; + h[1] = ch; + if (max_bit == 32768) { + if ((ch=getc(fd)) == EOF) break; + h[2] = ch; + if ((ch=getc(fd)) == EOF) break; + h[3] = ch; + } + sscanf(h, "%x", &b); + for (bit = 1; bit <= max_bit; bit = bit << 1) { + gdImageSetPixel (im, x++, y, (b & bit) ? 1 : 0); + if (x == im->sx) + { + x = 0; + y++; + if (y == im->sy) + { + return im; + } + break; + } + } + } + + php_gd_error("EOF before image was complete\n"); + gdImageDestroy(im); + return 0; +} diff --git a/ext/gd/tests/conv_test.xbm b/ext/gd/tests/conv_test.xbm new file mode 100644 index 0000000000..85cbe366ec --- /dev/null +++ b/ext/gd/tests/conv_test.xbm @@ -0,0 +1,4 @@ +#define conv_test.xbm_width 16 +#define conv_test.xbm_height 5 +static unsigned char conv_test.xbm_bits[] = { + 0x4c, 0x0d, 0x54, 0x15, 0xcc, 0x0d, 0x44, 0x05, 0x44, 0x05}; \ No newline at end of file diff --git a/ext/gd/tests/xbm2png.phpt b/ext/gd/tests/xbm2png.phpt new file mode 100644 index 0000000000..5c51226093 --- /dev/null +++ b/ext/gd/tests/xbm2png.phpt @@ -0,0 +1,26 @@ +--TEST-- +xbm --> png conversion test +--SKIPIF-- + +--FILE-- + +--EXPECT-- +XBM to PNG conversion: ok -- 2.50.1