helly           Sat Feb  1 20:34:54 2003 EDT

  Added files:                 
    /php4/ext/gd/tests  conv_test.xbm xbm2png.phpt 
    /php4/ext/gd/libgd  xbm.c 

  Modified files:              
    /php4/ext/gd        config.m4 
    /php4/ext/gd/libgd  gd.c 
  Log:
  - new xbm support
  @Added XBM support for bundled gd library. (marcus)
  
  # It was enabled by the last commit and fixed by this one.
  
Index: php4/ext/gd/config.m4
diff -u php4/ext/gd/config.m4:1.129 php4/ext/gd/config.m4:1.130
--- php4/ext/gd/config.m4:1.129 Sat Feb  1 18:25:14 2003
+++ php4/ext/gd/config.m4       Sat Feb  1 20:34:54 2003
@@ -1,5 +1,5 @@
 dnl
-dnl $Id: config.m4,v 1.129 2003/02/01 23:25:14 helly Exp $
+dnl $Id: config.m4,v 1.130 2003/02/02 01:34:54 helly Exp $
 dnl
 
 dnl
@@ -257,7 +257,8 @@
                  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)
Index: php4/ext/gd/libgd/gd.c
diff -u php4/ext/gd/libgd/gd.c:1.43 php4/ext/gd/libgd/gd.c:1.44
--- php4/ext/gd/libgd/gd.c:1.43 Mon Jan 20 21:10:19 2003
+++ php4/ext/gd/libgd/gd.c      Sat Feb  1 20:34:54 2003
@@ -2777,6 +2777,7 @@
 }
 /* End Rotate function */
 
+#if MBO_0
 gdImagePtr
 gdImageCreateFromXbm (FILE * fd)
 {
@@ -2902,6 +2903,7 @@
   gdImageDestroy (im);
   return 0;
 }
+#endif /* MBO_0 */
 
 void
 gdImagePolygon (gdImagePtr im, gdPointPtr p, int n, int c)

Index: php4/ext/gd/tests/conv_test.xbm
+++ php4/ext/gd/tests/conv_test.xbm
#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};
Index: php4/ext/gd/tests/xbm2png.phpt
+++ php4/ext/gd/tests/xbm2png.phpt
--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

Index: php4/ext/gd/libgd/xbm.c
+++ php4/ext/gd/libgd/xbm.c
/*
   +----------------------------------------------------------------------+
   | 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          |
   | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
   +----------------------------------------------------------------------+
   | Author: Marcus Boerger <[EMAIL PROTECTED]>                               |
   +----------------------------------------------------------------------+
 */

/* $Id: xbm.c,v 1.1 2003/02/02 01:34:54 helly Exp $ */

#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;
}



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to