]> granicus.if.org Git - php/commitdiff
- Introduced ImageCreateFromString() function,
authorMathieu Kooiman <mathieu@php.net>
Fri, 3 Nov 2000 19:53:42 +0000 (19:53 +0000)
committerMathieu Kooiman <mathieu@php.net>
Fri, 3 Nov 2000 19:53:42 +0000 (19:53 +0000)
  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)

ext/gd/gd.c
ext/gd/php_gd.h

index db45af3cc97137c55f6967e240dbbdf45857cd04..be1fa342043aa6037b2c98127101d7733acc2f6e 100644 (file)
@@ -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;
index d6e0b904b149ac8d7d1521d2676396e063ce115d..5444cfb68de091459e19a9129e106b2dfd2bbf2a 100644 (file)
@@ -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