summaryrefslogtreecommitdiff
path: root/ext/gd
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2003-02-02 01:34:54 +0000
committerMarcus Boerger <helly@php.net>2003-02-02 01:34:54 +0000
commit1d9477f386bb1cdf84d2bc397a572e108b72d425 (patch)
treef6c500bcd8815ca057c231e356e51d4acc6d7206 /ext/gd
parent28f76a2a4d48a959a875804867ad077144dc7888 (diff)
downloadphp-git-1d9477f386bb1cdf84d2bc397a572e108b72d425.tar.gz
- new xbm support
@Added XBM support for bundled gd library. (marcus) # It was enabled by the last commit and fixed by this one.
Diffstat (limited to 'ext/gd')
-rw-r--r--ext/gd/config.m43
-rw-r--r--ext/gd/libgd/gd.c2
-rw-r--r--ext/gd/libgd/xbm.c150
-rw-r--r--ext/gd/tests/conv_test.xbm4
-rw-r--r--ext/gd/tests/xbm2png.phpt26
5 files changed, 184 insertions, 1 deletions
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 <helly@php.net> |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#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--
+<?php
+ if (!extension_loaded('gd')) {
+ die("skip gd extension not avaliable.");
+ }
+ if (!function_exists("imagepng")) {
+ die("skip png support unavailable");
+ }
+ if (!function_exists("imagecreatefromxbm")) {
+ die("skip xbm read support unavailable");
+ }
+?>
+--FILE--
+<?php
+ $cwd = dirname(__FILE__);
+
+ echo "XBM to PNG conversion: ";
+ echo imagepng(imagecreatefromxbm($cwd . "/conv_test.xbm"), $cwd . "/test_xbm.png") ? 'ok' : 'failed';
+ echo "\n";
+
+ @unlink($cwd . "/test_xbm.png");
+?>
+--EXPECT--
+XBM to PNG conversion: ok