From: Mathieu Kooiman Date: Fri, 3 Nov 2000 19:53:42 +0000 (+0000) Subject: - Introduced ImageCreateFromString() function, X-Git-Tag: php-4.0.4RC3~337 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f391eb742343b75350375dc07762b978b407ffc9;p=php - 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) --- diff --git a/ext/gd/gd.c b/ext/gd/gd.c index db45af3cc9..be1fa34204 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -128,6 +128,7 @@ function_entry gd_functions[] = { 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) @@ -477,6 +478,118 @@ PHP_FUNCTION(imagetypes) 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)()) { zval **file; gdImagePtr im; diff --git a/ext/gd/php_gd.h b/ext/gd/php_gd.h index d6e0b904b1..5444cfb68d 100644 --- a/ext/gd/php_gd.h +++ b/ext/gd/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(imagecopymerge); 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(imagepstext); 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