cvs: php4 /ext/gd gd.c php_gd.h

From: Date: Fri, 03 Nov 2000 19:53:43 +0000
Subject: cvs: php4 /ext/gd gd.c php_gd.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-2463@lists.php.net to get a copy of this message
mathieu Fri Nov 3 11:53:43 2000 EDT Modified files: /php4/ext/gd gd.c php_gd.h Log: - Introduced ImageCreateFromString() function, works for GIF/JPEG/PNG and WBMP .. (Note: This built with the latest snapshot I grabbed tonight; Derick seemed to have trouble though..) @-Introduced ImageCreateFromString(), creates an image @ stream out of eg a MySQL blob. (Mathieu) Index: php4/ext/gd/gd.c diff -u php4/ext/gd/gd.c:1.94 php4/ext/gd/gd.c:1.95 --- php4/ext/gd/gd.c:1.94 Tue Oct 31 20:38:28 2000 +++ php4/ext/gd/gd.c Fri Nov 3 11:53:42 2000 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: gd.c,v 1.94 2000/11/01 04:38:28 sniper Exp $ */ +/* $Id: gd.c,v 1.95 2000/11/03 19:53:42 mathieu Exp $ */ /* gd 1.2 is copyright 1994, 1995, Quest Protein Database Center, Cold Spring Harbor Labs. */ @@ -128,6 +128,7 @@ PHP_FE(imagecopymerge, NULL) PHP_FE(imagecopyresized, NULL) PHP_FE(imagecreate, NULL) + PHP_FE(imagecreatefromstring, NULL) PHP_FE(imagecreatefrompng, NULL) PHP_FE(imagepng, NULL) PHP_FE(imagecreatefromgif, NULL) @@ -475,6 +476,118 @@ ret |= 8; #endif RETURN_LONG(ret); +} + +static int _php_image_type ( char data[8] ) +{ + /* Based on ext/standard/images.c */ + + if (data == NULL) + return -1; + + if (!memcmp(data, php_sig_jpg, 3)) + return PHP_GDIMG_TYPE_JPG; + else if (!memcmp(data, php_sig_png, 3)) { + if (!memcmp(data, php_sig_png, 8)) + return PHP_GDIMG_TYPE_PNG; + } else if (!memcmp(data, php_sig_gif, 3)) + return PHP_GDIMG_TYPE_GIF; + else { + gdIOCtx *io_ctx; + io_ctx = gdNewDynamicCtx ( 8, data ); + if (io_ctx) { + if (getmbi(gdGetC, io_ctx) == 0 && skipheader(gdGetC, io_ctx) == 0 ) { + io_ctx->free(io_ctx); + return PHP_GDIMG_TYPE_WBM; + } else + io_ctx->free(io_ctx); + } + } + return -1; +} + +gdImagePtr _php_image_create_from_string ( zval **Data, char *tn, gdImagePtr (*ioctx_func_p)() ) { + gdImagePtr im; + gdIOCtx *io_ctx; + + io_ctx = gdNewDynamicCtx ( (*Data)->value.str.len , + (*Data)->value.str.val ); + + if(!io_ctx) { + return NULL; + } + + im = (*ioctx_func_p)(io_ctx); + if (!im) { + php_error(E_WARNING, "%s: Passed data is not in '%s' format", get_active_function_name(), tn); + return NULL; + } + + return im; +} + +PHP_FUNCTION (imagecreatefromstring) +{ + zval **Data; + gdImagePtr im; + int imtype; + char sig[8]; + + if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &Data) == FAILURE) + WRONG_PARAM_COUNT; + + convert_to_string_ex( Data ); + memcpy(sig, (*Data)->value.str.val, 8); + + imtype = _php_image_type ( sig ); + + switch ( imtype ) { + case PHP_GDIMG_TYPE_JPG: { + #ifdef HAVE_GD_JPG + im = _php_image_create_from_string ( Data, "JPEG", gdImageCreateFromJpegCtx); + #else + php_error(E_WARNING, "No JPEG support in this PHP build"); + #endif + break; + } + + case PHP_GDIMG_TYPE_PNG: { + #ifdef HAVE_GD_PNG + im = _php_image_create_from_string ( Data, "PNG", gdImageCreateFromPngCtx); + #else + php_error(E_WARNING, "No PNG support in this PHP build"); + #endif + break; + } + + case PHP_GDIMG_TYPE_GIF: { + #ifdef HAVE_GD_GIF + im = _php_image_create_from_string ( Data, "GIF", gdImageCreateFromGifCtx); + #else + php_error(E_WARNING, "No GIF support in this PHP build"); + #endif + break; + } + case PHP_GDIMG_TYPE_WBM: { + #ifdef HAVE_GD_WBMP + im = _php_image_create_from_string ( Data, "WBMP",gdImageCreateFromWBMPCtx ); + #else + php_error(E_WARNING, "No WBMP support in this PHP build"); + #endif + break; + } + + default: + php_error(E_WARNING, "Data is not in a recognized format."); + RETURN_FALSE; + + } + if (!im) { + php_error(E_WARNING, "Couldn't create GD Image Stream out of Data"); + RETURN_FALSE; + } + + ZEND_REGISTER_RESOURCE(return_value, im, GDG (le_gd)); } static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(), gdImagePtr (*ioctx_func_p)()) { Index: php4/ext/gd/php_gd.h diff -u php4/ext/gd/php_gd.h:1.17 php4/ext/gd/php_gd.h:1.18 --- php4/ext/gd/php_gd.h:1.17 Tue Sep 26 02:08:02 2000 +++ php4/ext/gd/php_gd.h Fri Nov 3 11:53:42 2000 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_gd.h,v 1.17 2000/09/26 09:08:02 stas Exp $ */ +/* $Id: php_gd.h,v 1.18 2000/11/03 19:53:42 mathieu Exp $ */ #ifndef PHP_GD_H #define PHP_GD_H @@ -43,6 +43,9 @@ #define PHP_GDIMG_TYPE_XBM 5 #define PHP_GDIMG_TYPE_XPM 6 +extern const char php_sig_gif[3]; +extern const char php_sig_jpg[3]; +extern const char php_sig_png[3]; extern zend_module_entry gd_module_entry; #define phpext_gd_ptr &gd_module_entry @@ -84,6 +87,7 @@ PHP_FUNCTION(imagecopyresized); PHP_FUNCTION(imagetypes); PHP_FUNCTION(imagecreate); +PHP_FUNCTION(imagecreatefromstring); PHP_FUNCTION(imagecreatefromgif); PHP_FUNCTION(imagecreatefromjpeg); PHP_FUNCTION(imagecreatefromxbm); @@ -128,9 +132,11 @@ PHP_FUNCTION(imagepsbbox); PHPAPI int phpi_get_le_gd(void); +gdImagePtr _php_image_create_from_string ( zval **Data, char *tn, gdImagePtr (*ioctx_func_p)() ); static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(), gdImagePtr (*ioctx_func_p)()); static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)()); static void _php_image_output_wbmp(gdImagePtr im, FILE *fp); +static int _php_image_type ( char data[8] ); #ifdef ZTS #define GDLS_D php_gd_globals *gd_globals

« previous php.cvs (#2463) next »