cvs: php4 /ext/gd gd.c php_gd.h
| From: | Mathieu Kooiman | 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