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)
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;
#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
PHP_FUNCTION(imagecopyresized);
PHP_FUNCTION(imagetypes);
PHP_FUNCTION(imagecreate);
+PHP_FUNCTION(imagecreatefromstring);
PHP_FUNCTION(imagecreatefromgif);
PHP_FUNCTION(imagecreatefromjpeg);
PHP_FUNCTION(imagecreatefromxbm);
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