]> granicus.if.org Git - php/commitdiff
Convert GD Resources to objects
authorMark <mrandall@digitellinc.com>
Fri, 27 Sep 2019 17:47:24 +0000 (19:47 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Mon, 30 Sep 2019 13:14:02 +0000 (15:14 +0200)
39 files changed:
NEWS
UPGRADING
ext/gd/CREDITS
ext/gd/gd.c
ext/gd/gd.stub.php
ext/gd/gd_arginfo.h
ext/gd/gd_ctx.c [deleted file]
ext/gd/tests/bug41442.phpt
ext/gd/tests/bug66356.phpt
ext/gd/tests/bug70976.phpt
ext/gd/tests/bug73968.phpt
ext/gd/tests/bug74435.phpt
ext/gd/tests/bug77269.phpt
ext/gd/tests/bug77391.phpt
ext/gd/tests/gdimage_prevent_cloning.phpt [new file with mode: 0644]
ext/gd/tests/gdimage_prevent_serialization.phpt [new file with mode: 0644]
ext/gd/tests/imageantialias_error1.phpt [deleted file]
ext/gd/tests/imagechar_error2.phpt [deleted file]
ext/gd/tests/imagecharup_error2.phpt [deleted file]
ext/gd/tests/imagecolorallocatealpha_error1.phpt [deleted file]
ext/gd/tests/imagecolordeallocate_error1.phpt [deleted file]
ext/gd/tests/imagecolordeallocate_error3.phpt
ext/gd/tests/imagecolordeallocate_error4.phpt
ext/gd/tests/imagecolorstotal_error.phpt [deleted file]
ext/gd/tests/imageellipse_error7.phpt [deleted file]
ext/gd/tests/imagefilltoborder_error6.phpt [deleted file]
ext/gd/tests/imagefilter_error10.phpt [deleted file]
ext/gd/tests/imagegammacorrect_error2.phpt [deleted file]
ext/gd/tests/imageinterlace_error2.phpt [deleted file]
ext/gd/tests/imageistruecolor_error1.phpt [deleted file]
ext/gd/tests/imagelayereffect_error3.phpt [deleted file]
ext/gd/tests/imagepalettetotruecolor_basic.phpt
ext/gd/tests/imagepalettetotruecolor_error3.phpt [deleted file]
ext/gd/tests/imagerectangle_error2.phpt [deleted file]
ext/gd/tests/imagesetthickness_error1.phpt [deleted file]
ext/gd/tests/imagestring_error2.phpt [deleted file]
ext/gd/tests/imagestringup_error2.phpt [deleted file]
ext/gd/tests/imagetruecolortopalette_error1.phpt [deleted file]
ext/posix/tests/posix_ttyname_error_wrongparams.phpt

diff --git a/NEWS b/NEWS
index b5ecac86c15dd64cb88100551d6d1f0247e79855..050f9e93d74b3ec8ce8ceb0b27f030249787c88b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,7 @@ PHP                                                                        NEWS
   . Fixed bug #69044 (discrepency between time and microtime). (krakjoe)
 
 - GD:
+  . Replaced gd resources with objects. (Mark Randall)
   . Removed deprecated image2wbmp(). (cmb)
   . Removed deprecated png2wbmp() and jpeg2wbmp(). (cmb)
 
index 0a2b00db59a1dee983be20ef833e6ec6c7a07f5f..fd3c04ab726a98e99ddef2943b6b85ce63d10ba1 100644 (file)
--- a/UPGRADING
+++ b/UPGRADING
@@ -136,6 +136,9 @@ PHP 8.0 UPGRADE NOTES
     warning.
 
 - GD:
+  . The GD extension now uses objects as the underlying data structure for
+    images, rather than resources. These objects are completely opaque, i.e.
+    they don't have any methods.
   . The deprecated function image2wbmp() has been removed.
     RFC: https://wiki.php.net/rfc/image2wbmp
   . The deprecated functions png2wbmp() and jpeg2wbmp() have been removed.
index 2393a9f8fc3e3d87d2334e6229813304919bcbd4..b9ca3bdaacb0da371cdde94d0ccba1e139e54048 100644 (file)
@@ -1,2 +1,2 @@
 GD imaging
-Rasmus Lerdorf, Stig Bakken, Jim Winstead, Jouni Ahto, Ilia Alshanetsky, Pierre-Alain Joye, Marcus Boerger
+Rasmus Lerdorf, Stig Bakken, Jim Winstead, Jouni Ahto, Ilia Alshanetsky, Pierre-Alain Joye, Marcus Boerger, Mark Randall
index 555b182eb18855207a3e5896045dbfc1818a537b..4f0df799fd7654b6831981ee79d46b1252d2bb28 100644 (file)
@@ -33,7 +33,8 @@
 #include "php_gd.h"
 #include "ext/standard/info.h"
 #include "php_open_temporary_file.h"
-
+#include "zend_object_handlers.h"
+#include "zend_interfaces.h"
 
 #ifdef HAVE_SYS_WAIT_H
 # include <sys/wait.h>
 # include <X11/xpm.h>
 #endif
 
-# include "gd_compat.h"
 
+#include "gd_compat.h"
 
-static int le_gd, le_gd_font;
+static int le_gd_font;
 
 #include <gd.h>
 #include <gd_errors.h>
@@ -83,7 +84,6 @@ static int le_gd, le_gd_font;
 static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int, int);
 #endif
 
-#include "gd_ctx.c"
 #include "gd_arginfo.h"
 
 /* as it is not really public, duplicate declaration here to avoid
@@ -132,6 +132,112 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type,
 static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)());
 static int _php_image_type(char data[12]);
 
+/* output streaming (formerly gd_ctx.c) */
+static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)());
+
+/*********************************************************
+ *
+ * GD Object Representation
+ *
+ ********************************************************/
+
+zend_class_entry *gd_image_ce;
+
+typedef struct _gd_ext_image_object {
+       gdImagePtr image;
+       zend_object std;
+} php_gd_image_object;
+
+static zend_object_handlers php_gd_image_object_handlers;
+
+static const zend_function_entry gd_image_object_methods[] = {
+       PHP_FE_END
+};
+
+static zend_function *php_gd_image_object_get_constructor(zend_object *object)
+{
+       zend_throw_error(NULL, "You cannot initialize a GdImage object except through helper functions");
+       return NULL;
+}
+
+/**
+ * Returns the underlying php_gd_image_object from a zend_object
+ */
+
+static zend_always_inline php_gd_image_object* php_gd_exgdimage_from_zobj_p(zend_object* obj)
+{
+       return (php_gd_image_object *) ((char *) (obj) - XtOffsetOf(php_gd_image_object, std));
+}
+
+/**
+ * Converts an extension GdImage instance contained within a zval into the gdImagePtr
+ * for use with library APIs
+ */
+static zend_always_inline gdImagePtr php_gd_libgdimageptr_from_zval_p(zval* zp)
+{
+       return php_gd_exgdimage_from_zobj_p(Z_OBJ_P(zp))->image;
+}
+
+
+zend_object *php_gd_image_object_create(zend_class_entry *class_type)
+{
+       size_t block_len = sizeof(php_gd_image_object) + zend_object_properties_size(class_type);
+       php_gd_image_object *intern = emalloc(block_len);
+       memset(intern, 0, block_len);
+
+       zend_object_std_init(&intern->std, class_type);
+       object_properties_init(&intern->std, class_type);
+       intern->std.handlers = &php_gd_image_object_handlers;
+
+       return &intern->std;
+};
+
+static void php_gd_image_object_free(zend_object *intern)
+{
+       php_gd_image_object *img_obj_ptr = php_gd_exgdimage_from_zobj_p(intern);
+       gdImageDestroy(img_obj_ptr->image);
+       img_obj_ptr->image = NULL;
+
+       zend_object_std_dtor(intern);
+};
+
+/**
+ * Creates a new GdImage object wrapping the gdImagePtr and attaches it
+ * to the zval (usually return_value).
+ *
+ * This function must only be called once per valid gdImagePtr
+ */
+void php_gd_assign_libgdimageptr_as_extgdimage(zval *val, gdImagePtr image)
+{
+       object_init_ex(val, gd_image_ce);
+       php_gd_exgdimage_from_zobj_p(Z_OBJ_P(val))->image = image;
+}
+
+static void php_gd_object_minit_helper()
+{
+       zend_class_entry ce;
+       INIT_CLASS_ENTRY(ce, "GdImage", gd_image_object_methods);
+       gd_image_ce = zend_register_internal_class(&ce);
+       gd_image_ce->ce_flags |= ZEND_ACC_FINAL;
+       gd_image_ce->create_object = php_gd_image_object_create;
+       gd_image_ce->serialize = zend_class_serialize_deny;
+       gd_image_ce->unserialize = zend_class_unserialize_deny;
+
+       /* setting up the object handlers for the GdImage class */
+       memcpy(&php_gd_image_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+       php_gd_image_object_handlers.clone_obj = NULL;
+       php_gd_image_object_handlers.free_obj = php_gd_image_object_free;
+       php_gd_image_object_handlers.get_constructor = php_gd_image_object_get_constructor;
+       php_gd_image_object_handlers.offset = XtOffsetOf(php_gd_image_object, std);
+}
+
+
+/*********************************************************
+ *
+ * Extension Implementation
+ *
+ ********************************************************/
+
 /* {{{ gd_functions[]
  */
 static const zend_function_entry gd_functions[] = {
@@ -178,7 +284,7 @@ static const zend_function_entry gd_functions[] = {
        PHP_FE(imagegrabscreen,                                                 arginfo_imagegrabscreen)
 #endif
 
-       PHP_FE(imagerotate,                                                     arginfo_imagerotate)
+       PHP_FE(imagerotate,                                                             arginfo_imagerotate)
        PHP_FE(imageflip,                                                               arginfo_imageflip)
 
        PHP_FE(imageantialias,                                                  arginfo_imageantialias)
@@ -188,7 +294,7 @@ static const zend_function_entry gd_functions[] = {
        PHP_FE(imageaffine,                                                             arginfo_imageaffine)
        PHP_FE(imageaffinematrixconcat,                                 arginfo_imageaffinematrixconcat)
        PHP_FE(imageaffinematrixget,                                    arginfo_imageaffinematrixget)
-       PHP_FE(imagesetinterpolation,                   arginfo_imagesetinterpolation)
+       PHP_FE(imagesetinterpolation,                                   arginfo_imagesetinterpolation)
        PHP_FE(imagesettile,                                                    arginfo_imagesettile)
        PHP_FE(imagesetbrush,                                                   arginfo_imagesetbrush)
        PHP_FE(imagesetstyle,                                                   arginfo_imagesetstyle)
@@ -227,7 +333,7 @@ static const zend_function_entry gd_functions[] = {
 #ifdef HAVE_GD_JPG
        PHP_FE(imagejpeg,                                                               arginfo_imagejpeg)
 #endif
-       PHP_FE(imagewbmp,                               arginfo_imagewbmp)
+       PHP_FE(imagewbmp,                                                               arginfo_imagewbmp)
        PHP_FE(imagegd,                                                                 arginfo_imagegd)
        PHP_FE(imagegd2,                                                                arginfo_imagegd2)
 #ifdef HAVE_GD_BMP
@@ -267,12 +373,12 @@ static const zend_function_entry gd_functions[] = {
        PHP_FE(imagetypes,                                                              arginfo_imagetypes)
 
        PHP_FE(imagelayereffect,                                                arginfo_imagelayereffect)
-       PHP_FE(imagexbm,                                arginfo_imagexbm)
+       PHP_FE(imagexbm,                                                                arginfo_imagexbm)
 
        PHP_FE(imagecolormatch,                                                 arginfo_imagecolormatch)
 
 /* gd filters */
-       PHP_FE(imagefilter,                                                     arginfo_imagefilter)
+       PHP_FE(imagefilter,                                                             arginfo_imagefilter)
        PHP_FE(imageconvolution,                                                arginfo_imageconvolution)
 
        PHP_FE(imageresolution,                                                 arginfo_imageresolution)
@@ -304,14 +410,6 @@ PHP_INI_BEGIN()
 PHP_INI_END()
 /* }}} */
 
-/* {{{ php_free_gd_image
- */
-static void php_free_gd_image(zend_resource *rsrc)
-{
-       gdImageDestroy((gdImagePtr) rsrc->ptr);
-}
-/* }}} */
-
 /* {{{ php_free_gd_font
  */
 static void php_free_gd_font(zend_resource *rsrc)
@@ -330,7 +428,6 @@ static void php_free_gd_font(zend_resource *rsrc)
  */
 void php_gd_error_method(int type, const char *format, va_list args)
 {
-
        switch (type) {
 #ifndef PHP_WIN32
                case GD_DEBUG:
@@ -353,8 +450,8 @@ void php_gd_error_method(int type, const char *format, va_list args)
  */
 PHP_MINIT_FUNCTION(gd)
 {
-       le_gd = zend_register_list_destructors_ex(php_free_gd_image, NULL, "gd", module_number);
        le_gd_font = zend_register_list_destructors_ex(php_free_gd_font, NULL, "gd font", module_number);
+       php_gd_object_minit_helper();
 
 #if defined(HAVE_GD_FREETYPE) && defined(HAVE_GD_BUNDLED)
        gdFontCacheMutexSetup();
@@ -387,7 +484,7 @@ PHP_MINIT_FUNCTION(gd)
        REGISTER_LONG_CONSTANT("IMG_ARC_NOFILL", gdNoFill, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("IMG_ARC_EDGED", gdEdged, CONST_CS | CONST_PERSISTENT);
 
-    /* GD2 image format types */
+       /* GD2 image format types */
        REGISTER_LONG_CONSTANT("IMG_GD2_RAW", GD2_FMT_RAW, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("IMG_GD2_COMPRESSED", GD2_FMT_COMPRESSED, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("IMG_FLIP_HORIZONTAL", GD_FLIP_HORINZONTAL, CONST_CS | CONST_PERSISTENT);
@@ -663,13 +760,6 @@ PHP_FUNCTION(gd_info)
 }
 /* }}} */
 
-/* Need this for cpdf. See also comment in file.c php3i_get_le_fp() */
-PHP_GD_API int phpi_get_le_gd(void)
-{
-       return le_gd;
-}
-/* }}} */
-
 #define FLIPWORD(a) (((a & 0xff000000) >> 24) | ((a & 0x00ff0000) >> 8) | ((a & 0x0000ff00) << 8) | ((a & 0x000000ff) << 24))
 
 /* {{{ proto int imageloadfont(string filename)
@@ -784,22 +874,20 @@ PHP_FUNCTION(imagesetstyle)
        gdImagePtr im;
        int *stylearr;
        int index = 0;
-    uint32_t num_styles;
+       uint32_t num_styles;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "ra", &IM, &styles) == FAILURE)  {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oa", &IM, gd_image_ce, &styles) == FAILURE)  {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
+       im = php_gd_libgdimageptr_from_zval_p(IM);
+
+       num_styles = zend_hash_num_elements(Z_ARRVAL_P(styles));
+       if (num_styles == 0) {
+               zend_value_error("Styles array must not be empty");
                return;
        }
 
-    num_styles = zend_hash_num_elements(Z_ARRVAL_P(styles));
-    if (num_styles == 0) {
-        zend_value_error("Styles array must not be empty");
-        return;
-    }
-
        /* copy the style values in the stylearr */
        stylearr = safe_emalloc(sizeof(int), num_styles, 0);
 
@@ -842,7 +930,7 @@ PHP_FUNCTION(imagecreatetruecolor)
                RETURN_FALSE;
        }
 
-       RETURN_RES(zend_register_resource(im, le_gd));
+       php_gd_assign_libgdimageptr_as_extgdimage(return_value, im);
 }
 /* }}} */
 
@@ -853,13 +941,11 @@ PHP_FUNCTION(imageistruecolor)
        zval *IM;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &IM) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &IM, gd_image_ce) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        RETURN_BOOL(im->trueColor);
 }
@@ -874,13 +960,11 @@ PHP_FUNCTION(imagetruecolortopalette)
        zend_long ncolors;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rbl", &IM, &dither, &ncolors) == FAILURE)  {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Obl", &IM, gd_image_ce, &dither, &ncolors) == FAILURE)  {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        if (ncolors <= 0 || ZEND_LONG_INT_OVFL(ncolors)) {
                zend_value_error("Number of colors has to be greater than zero and no more than %d", INT_MAX);
@@ -903,13 +987,11 @@ PHP_FUNCTION(imagepalettetotruecolor)
        zval *IM;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &IM) == FAILURE)  {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &IM, gd_image_ce) == FAILURE)  {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        if (gdImagePaletteToTrueColor(im) == 0) {
                RETURN_FALSE;
@@ -927,16 +1009,12 @@ PHP_FUNCTION(imagecolormatch)
        gdImagePtr im1, im2;
        int result;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &IM1, &IM2) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &IM1, gd_image_ce, &IM2, gd_image_ce) == FAILURE) {
                return;
        }
 
-       if ((im1 = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM1), "Image", le_gd)) == NULL) {
-               return;
-       }
-       if ((im2 = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM2), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im1 = php_gd_libgdimageptr_from_zval_p(IM1);
+       im2 = php_gd_libgdimageptr_from_zval_p(IM2);
 
        result = gdImageColorMatch(im1, im2);
        switch (result) {
@@ -970,13 +1048,11 @@ PHP_FUNCTION(imagesetthickness)
        zend_long thick;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &IM, &thick) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &IM, gd_image_ce, &thick) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        gdImageSetThickness(im, thick);
 
@@ -992,16 +1068,13 @@ PHP_FUNCTION(imagefilledellipse)
        zend_long cx, cy, w, h, color;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlllll", &IM, &cx, &cy, &w, &h, &color) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olllll", &IM, gd_image_ce, &cx, &cy, &w, &h, &color) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        gdImageFilledEllipse(im, cx, cy, w, h, color);
-
        RETURN_TRUE;
 }
 /* }}} */
@@ -1015,13 +1088,11 @@ PHP_FUNCTION(imagefilledarc)
        gdImagePtr im;
        int e, st;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rllllllll", &IM, &cx, &cy, &w, &h, &ST, &E, &col, &style) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ollllllll", &IM, gd_image_ce, &cx, &cy, &w, &h, &ST, &E, &col, &style) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        e = E;
        if (e < 0) {
@@ -1047,13 +1118,11 @@ PHP_FUNCTION(imagealphablending)
        zend_bool blend;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rb", &IM, &blend) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ob", &IM, gd_image_ce, &blend) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        gdImageAlphaBlending(im, blend);
 
@@ -1069,13 +1138,11 @@ PHP_FUNCTION(imagesavealpha)
        zend_bool save;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rb", &IM, &save) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ob", &IM, gd_image_ce, &save) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        gdImageSaveAlpha(im, save);
 
@@ -1091,13 +1158,11 @@ PHP_FUNCTION(imagelayereffect)
        zend_long effect;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &IM, &effect) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &IM, gd_image_ce, &effect) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        gdImageAlphaBlending(im, effect);
 
@@ -1120,13 +1185,11 @@ PHP_FUNCTION(imagecolorallocatealpha)
        gdImagePtr im;
        int ct = (-1);
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rllll", &IM, &red, &green, &blue, &alpha) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ollll", &IM, gd_image_ce, &red, &green, &blue, &alpha) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        CHECK_RGBA_RANGE(red, Red);
        CHECK_RGBA_RANGE(green, Green);
@@ -1149,13 +1212,11 @@ PHP_FUNCTION(imagecolorresolvealpha)
        zend_long red, green, blue, alpha;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rllll", &IM, &red, &green, &blue, &alpha) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ollll", &IM, gd_image_ce, &red, &green, &blue, &alpha) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        CHECK_RGBA_RANGE(red, Red);
        CHECK_RGBA_RANGE(green, Green);
@@ -1174,13 +1235,11 @@ PHP_FUNCTION(imagecolorclosestalpha)
        zend_long red, green, blue, alpha;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rllll", &IM, &red, &green, &blue, &alpha) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ollll", &IM, gd_image_ce, &red, &green, &blue, &alpha) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        CHECK_RGBA_RANGE(red, Red);
        CHECK_RGBA_RANGE(green, Green);
@@ -1199,13 +1258,11 @@ PHP_FUNCTION(imagecolorexactalpha)
        zend_long red, green, blue, alpha;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rllll", &IM, &red, &green, &blue, &alpha) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ollll", &IM, gd_image_ce,  &red, &green, &blue, &alpha) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        CHECK_RGBA_RANGE(red, Red);
        CHECK_RGBA_RANGE(green, Green);
@@ -1225,17 +1282,12 @@ PHP_FUNCTION(imagecopyresampled)
        gdImagePtr im_dst, im_src;
        int srcH, srcW, dstH, dstW, srcY, srcX, dstY, dstX;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrllllllll", &DIM, &SIM, &DX, &DY, &SX, &SY, &DW, &DH, &SW, &SH) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "OOllllllll", &DIM, gd_image_ce, &SIM, gd_image_ce, &DX, &DY, &SX, &SY, &DW, &DH, &SW, &SH) == FAILURE) {
                return;
        }
 
-       if ((im_dst = (gdImagePtr)zend_fetch_resource(Z_RES_P(DIM), "Image", le_gd)) == NULL) {
-               return;
-       }
-
-       if ((im_src = (gdImagePtr)zend_fetch_resource(Z_RES_P(SIM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im_src = php_gd_libgdimageptr_from_zval_p(SIM);
+       im_dst = php_gd_libgdimageptr_from_zval_p(DIM);
 
        srcX = SX;
        srcY = SY;
@@ -1317,9 +1369,9 @@ PHP_FUNCTION(imagegrabwindow)
 
        if (!im) {
                RETURN_FALSE;
-       } else {
-               RETURN_RES(zend_register_resource(im, le_gd));
        }
+
+       php_gd_assign_libgdimageptr_as_extgdimage(return_value, im);
 }
 /* }}} */
 
@@ -1374,9 +1426,9 @@ PHP_FUNCTION(imagegrabscreen)
 
        if (!im) {
                RETURN_FALSE;
-       } else {
-               RETURN_RES(zend_register_resource(im, le_gd));
        }
+
+       php_gd_assign_libgdimageptr_as_extgdimage(return_value, im);
 }
 /* }}} */
 #endif /* PHP_WIN32 */
@@ -1391,21 +1443,18 @@ PHP_FUNCTION(imagerotate)
        zend_long color;
        zend_long ignoretransparent = 0;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rdl|l", &SIM, &degrees, &color, &ignoretransparent) == FAILURE) {
-               return;
-       }
-
-       if ((im_src = (gdImagePtr)zend_fetch_resource(Z_RES_P(SIM), "Image", le_gd)) == NULL) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Odl|l", &SIM, gd_image_ce,  &degrees, &color, &ignoretransparent) == FAILURE) {
                return;
        }
 
+       im_src = php_gd_libgdimageptr_from_zval_p(SIM);
        im_dst = gdImageRotateInterpolated(im_src, (const float)degrees, color);
 
-       if (im_dst != NULL) {
-               RETURN_RES(zend_register_resource(im_dst, le_gd));
-       } else {
+       if (im_dst == NULL) {
                RETURN_FALSE;
        }
+
+       php_gd_assign_libgdimageptr_as_extgdimage(return_value, im_dst);
 }
 /* }}} */
 
@@ -1416,17 +1465,12 @@ PHP_FUNCTION(imagesettile)
        zval *IM, *TILE;
        gdImagePtr im, tile;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &IM, &TILE) == FAILURE) {
-               return;
-       }
-
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &IM, gd_image_ce, &TILE, gd_image_ce) == FAILURE) {
                return;
        }
 
-       if ((tile = (gdImagePtr)zend_fetch_resource(Z_RES_P(TILE), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
+       tile = php_gd_libgdimageptr_from_zval_p(TILE);
 
        gdImageSetTile(im, tile);
 
@@ -1441,17 +1485,12 @@ PHP_FUNCTION(imagesetbrush)
        zval *IM, *TILE;
        gdImagePtr im, tile;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &IM, &TILE) == FAILURE) {
-               return;
-       }
-
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &IM, gd_image_ce, &TILE, gd_image_ce) == FAILURE) {
                return;
        }
 
-       if ((tile = (gdImagePtr)zend_fetch_resource(Z_RES_P(TILE), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
+       tile = php_gd_libgdimageptr_from_zval_p(TILE);
 
        gdImageSetBrush(im, tile);
 
@@ -1486,7 +1525,7 @@ PHP_FUNCTION(imagecreate)
                RETURN_FALSE;
        }
 
-       RETURN_RES(zend_register_resource(im, le_gd));
+       php_gd_assign_libgdimageptr_as_extgdimage(return_value, im);
 }
 /* }}} */
 
@@ -1686,7 +1725,7 @@ PHP_FUNCTION(imagecreatefromstring)
                RETURN_FALSE;
        }
 
-       RETURN_RES(zend_register_resource(im, le_gd));
+       php_gd_assign_libgdimageptr_as_extgdimage(return_value, im);
 }
 /* }}} */
 
@@ -1803,8 +1842,8 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type,
 
 /* register_im: */
        if (im) {
-               RETVAL_RES(zend_register_resource(im, le_gd));
                php_stream_close(stream);
+               php_gd_assign_libgdimageptr_as_extgdimage(return_value, im);
                return;
        }
 
@@ -1940,13 +1979,11 @@ static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char
 
        /* The quality parameter for gd2 stands for chunk size */
 
-       if (zend_parse_parameters(argc, "r|pll", &imgind, &file, &file_len, &quality, &type) == FAILURE) {
+       if (zend_parse_parameters(argc, "O|pll", &imgind, gd_image_ce, &file, &file_len, &quality, &type) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(imgind), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(imgind);
 
        if (argc > 1) {
                fn = file;
@@ -2123,22 +2160,16 @@ PHP_FUNCTION(imagebmp)
 #endif
 
 /* {{{ proto bool imagedestroy(resource im)
-   Destroy an image */
+   Destroy an image - No effect as of PHP 8.0 */
 PHP_FUNCTION(imagedestroy)
 {
+       /* This function used to free the resource, as resources are no longer used, it does nothing */
        zval *IM;
-       gdImagePtr im;
-
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &IM) == FAILURE) {
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &IM, gd_image_ce) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
-
-       zend_list_close(Z_RES_P(IM));
-
        RETURN_TRUE;
 }
 /* }}} */
@@ -2152,13 +2183,11 @@ PHP_FUNCTION(imagecolorallocate)
        gdImagePtr im;
        int ct = (-1);
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlll", &IM, &red, &green, &blue) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olll", &IM, gd_image_ce, &red, &green, &blue) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        CHECK_RGBA_RANGE(red, Red);
        CHECK_RGBA_RANGE(green, Green);
@@ -2179,17 +2208,12 @@ PHP_FUNCTION(imagepalettecopy)
        zval *dstim, *srcim;
        gdImagePtr dst, src;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &dstim, &srcim) == FAILURE) {
-               return;
-       }
-
-       if ((dst = (gdImagePtr)zend_fetch_resource(Z_RES_P(dstim), "Image", le_gd)) == NULL) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &dstim, gd_image_ce, &srcim, gd_image_ce) == FAILURE) {
                return;
        }
 
-       if ((src = (gdImagePtr)zend_fetch_resource(Z_RES_P(srcim), "Image", le_gd)) == NULL) {
-               return;
-       }
+       src = php_gd_libgdimageptr_from_zval_p(srcim);
+       dst = php_gd_libgdimageptr_from_zval_p(dstim);
 
        gdImagePaletteCopy(dst, src);
 }
@@ -2204,14 +2228,12 @@ PHP_FUNCTION(imagecolorat)
        gdImagePtr im;
 
        ZEND_PARSE_PARAMETERS_START(3, 3)
-               Z_PARAM_RESOURCE(IM)
+               Z_PARAM_OBJECT_OF_CLASS(IM, gd_image_ce)
                Z_PARAM_LONG(x)
                Z_PARAM_LONG(y)
        ZEND_PARSE_PARAMETERS_END();
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        if (gdImageTrueColor(im)) {
                if (im->tpixels && gdImageBoundsSafe(im, x, y)) {
@@ -2239,13 +2261,11 @@ PHP_FUNCTION(imagecolorclosest)
        zend_long red, green, blue;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlll", &IM, &red, &green, &blue) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olll", &IM, gd_image_ce, &red, &green, &blue) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        CHECK_RGBA_RANGE(red, Red);
        CHECK_RGBA_RANGE(green, Green);
@@ -2263,13 +2283,11 @@ PHP_FUNCTION(imagecolorclosesthwb)
        zend_long red, green, blue;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlll", &IM, &red, &green, &blue) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olll", &IM, gd_image_ce, &red, &green, &blue) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        CHECK_RGBA_RANGE(red, Red);
        CHECK_RGBA_RANGE(green, Green);
@@ -2288,13 +2306,11 @@ PHP_FUNCTION(imagecolordeallocate)
        int col;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &IM, &index) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &IM, gd_image_ce, &index) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        /* We can return right away for a truecolor image as deallocating colours is meaningless here */
        if (gdImageTrueColor(im)) {
@@ -2307,8 +2323,8 @@ PHP_FUNCTION(imagecolordeallocate)
                gdImageColorDeallocate(im, col);
                RETURN_TRUE;
        } else {
-               php_error_docref(NULL, E_WARNING, "Color index %d out of range",        col);
-               RETURN_FALSE;
+               zend_value_error("Color index %d out of range", col);
+               return;
        }
 }
 /* }}} */
@@ -2321,13 +2337,11 @@ PHP_FUNCTION(imagecolorresolve)
        zend_long red, green, blue;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlll", &IM, &red, &green, &blue) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olll", &IM, gd_image_ce, &red, &green, &blue) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        CHECK_RGBA_RANGE(red, Red);
        CHECK_RGBA_RANGE(green, Green);
@@ -2345,13 +2359,11 @@ PHP_FUNCTION(imagecolorexact)
        zend_long red, green, blue;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlll", &IM, &red, &green, &blue) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olll", &IM, gd_image_ce, &red, &green, &blue) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        CHECK_RGBA_RANGE(red, Red);
        CHECK_RGBA_RANGE(green, Green);
@@ -2370,13 +2382,11 @@ PHP_FUNCTION(imagecolorset)
        int col;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rllll|l", &IM, &color, &red, &green, &blue, &alpha) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ollll|l", &IM, gd_image_ce, &color, &red, &green, &blue, &alpha) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        CHECK_RGBA_RANGE(red, Red);
        CHECK_RGBA_RANGE(green, Green);
@@ -2405,13 +2415,11 @@ PHP_FUNCTION(imagecolorsforindex)
        int col;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &IM, &index) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &IM, gd_image_ce, &index) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        col = index;
 
@@ -2438,7 +2446,7 @@ PHP_FUNCTION(imagegammacorrect)
        int i;
        double input, output, gamma;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rdd", &IM, &input, &output) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Odd", &IM, gd_image_ce, &input, &output) == FAILURE) {
                return;
        }
 
@@ -2449,9 +2457,7 @@ PHP_FUNCTION(imagegammacorrect)
 
        gamma = input / output;
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        if (gdImageTrueColor(im))       {
                int x, y, c;
@@ -2491,15 +2497,13 @@ PHP_FUNCTION(imagesetpixel)
        gdImagePtr im;
 
        ZEND_PARSE_PARAMETERS_START(4, 4)
-               Z_PARAM_RESOURCE(IM)
+               Z_PARAM_OBJECT_OF_CLASS(IM, gd_image_ce)
                Z_PARAM_LONG(x)
                Z_PARAM_LONG(y)
                Z_PARAM_LONG(col)
        ZEND_PARSE_PARAMETERS_END();
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        gdImageSetPixel(im, x, y, col);
        RETURN_TRUE;
@@ -2514,13 +2518,11 @@ PHP_FUNCTION(imageline)
        zend_long x1, y1, x2, y2, col;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlllll", &IM, &x1, &y1, &x2, &y2, &col) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olllll", &IM, gd_image_ce,  &x1, &y1, &x2, &y2, &col) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        if (im->AA) {
                gdImageSetAntiAliased(im, col);
@@ -2539,13 +2541,11 @@ PHP_FUNCTION(imagedashedline)
        zend_long x1, y1, x2, y2, col;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlllll", &IM, &x1, &y1, &x2, &y2, &col) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olllll", &IM, gd_image_ce, &x1, &y1, &x2, &y2, &col) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        gdImageDashedLine(im, x1, y1, x2, y2, col);
        RETURN_TRUE;
@@ -2560,13 +2560,11 @@ PHP_FUNCTION(imagerectangle)
        zend_long x1, y1, x2, y2, col;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlllll", &IM, &x1, &y1, &x2, &y2, &col) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olllll", &IM, gd_image_ce, &x1, &y1, &x2, &y2, &col) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        gdImageRectangle(im, x1, y1, x2, y2, col);
        RETURN_TRUE;
@@ -2581,13 +2579,11 @@ PHP_FUNCTION(imagefilledrectangle)
        zend_long x1, y1, x2, y2, col;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlllll", &IM, &x1, &y1, &x2, &y2, &col) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olllll", &IM, gd_image_ce, &x1, &y1, &x2, &y2, &col) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
        gdImageFilledRectangle(im, x1, y1, x2, y2, col);
        RETURN_TRUE;
 }
@@ -2602,13 +2598,11 @@ PHP_FUNCTION(imagearc)
        gdImagePtr im;
        int e, st;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlllllll", &IM, &cx, &cy, &w, &h, &ST, &E, &col) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olllllll", &IM, gd_image_ce, &cx, &cy, &w, &h, &ST, &E, &col) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        e = E;
        if (e < 0) {
@@ -2633,13 +2627,11 @@ PHP_FUNCTION(imageellipse)
        zend_long cx, cy, w, h, color;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlllll", &IM, &cx, &cy, &w, &h, &color) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olllll", &IM, gd_image_ce,  &cx, &cy, &w, &h, &color) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        gdImageEllipse(im, cx, cy, w, h, color);
        RETURN_TRUE;
@@ -2654,13 +2646,11 @@ PHP_FUNCTION(imagefilltoborder)
        zend_long x, y, border, col;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rllll", &IM, &x, &y, &border, &col) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ollll", &IM, gd_image_ce,  &x, &y, &border, &col) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        gdImageFillToBorder(im, x, y, border, col);
        RETURN_TRUE;
@@ -2675,13 +2665,11 @@ PHP_FUNCTION(imagefill)
        zend_long x, y, col;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlll", &IM, &x, &y, &col) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olll", &IM, gd_image_ce, &x, &y, &col) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        gdImageFill(im, x, y, col);
        RETURN_TRUE;
@@ -2695,13 +2683,11 @@ PHP_FUNCTION(imagecolorstotal)
        zval *IM;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &IM) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &IM, gd_image_ce) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        RETURN_LONG(gdImageColorsTotal(im));
 }
@@ -2716,13 +2702,11 @@ PHP_FUNCTION(imagecolortransparent)
        gdImagePtr im;
        int argc = ZEND_NUM_ARGS();
 
-       if (zend_parse_parameters(argc, "r|l", &IM, &COL) == FAILURE) {
+       if (zend_parse_parameters(argc, "O|l", &IM, gd_image_ce, &COL) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        if (argc > 1) {
                gdImageColorTransparent(im, COL);
@@ -2741,13 +2725,11 @@ PHP_FUNCTION(imageinterlace)
        zend_long INT = 0;
        gdImagePtr im;
 
-       if (zend_parse_parameters(argc, "r|l", &IM, &INT) == FAILURE) {
+       if (zend_parse_parameters(argc, "O|l", &IM, gd_image_ce, &INT) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        if (argc > 1) {
                gdImageInterlace(im, INT);
@@ -2771,13 +2753,11 @@ static void php_imagepolygon(INTERNAL_FUNCTION_PARAMETERS, int filled)
        gdPointPtr points;
        int npoints, col, nelem, i;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rall", &IM, &POINTS, &NPOINTS, &COL) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oall", &IM, gd_image_ce, &POINTS, &NPOINTS, &COL) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        npoints = NPOINTS;
        col = COL;
@@ -2972,13 +2952,11 @@ static void php_imagechar(INTERNAL_FUNCTION_PARAMETERS, int mode)
        unsigned char *str = NULL;
        gdFontPtr font;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlllsl", &IM, &SIZE, &X, &Y, &C, &C_len, &COL) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olllsl", &IM, gd_image_ce, &SIZE, &X, &Y, &C, &C_len, &COL) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        col = COL;
 
@@ -3065,17 +3043,12 @@ PHP_FUNCTION(imagecopy)
        gdImagePtr im_dst, im_src;
        int srcH, srcW, srcY, srcX, dstY, dstX;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrllllll", &DIM, &SIM, &DX, &DY, &SX, &SY, &SW, &SH) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "OOllllll", &DIM, gd_image_ce, &SIM, gd_image_ce, &DX, &DY, &SX, &SY, &SW, &SH) == FAILURE) {
                return;
        }
 
-       if ((im_dst = (gdImagePtr)zend_fetch_resource(Z_RES_P(DIM), "Image", le_gd)) == NULL) {
-               return;
-       }
-
-       if ((im_src = (gdImagePtr)zend_fetch_resource(Z_RES_P(SIM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im_dst = php_gd_libgdimageptr_from_zval_p(DIM);
+       im_src = php_gd_libgdimageptr_from_zval_p(SIM);
 
        srcX = SX;
        srcY = SY;
@@ -3098,17 +3071,12 @@ PHP_FUNCTION(imagecopymerge)
        gdImagePtr im_dst, im_src;
        int srcH, srcW, srcY, srcX, dstY, dstX, pct;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrlllllll", &DIM, &SIM, &DX, &DY, &SX, &SY, &SW, &SH, &PCT) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "OOlllllll", &DIM, gd_image_ce, &SIM, gd_image_ce, &DX, &DY, &SX, &SY, &SW, &SH, &PCT) == FAILURE) {
                return;
        }
 
-       if ((im_dst = (gdImagePtr)zend_fetch_resource(Z_RES_P(DIM), "Image", le_gd)) == NULL) {
-               return;
-       }
-
-       if ((im_src = (gdImagePtr)zend_fetch_resource(Z_RES_P(SIM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im_src = php_gd_libgdimageptr_from_zval_p(SIM);
+       im_dst = php_gd_libgdimageptr_from_zval_p(DIM);
 
        srcX = SX;
        srcY = SY;
@@ -3132,17 +3100,12 @@ PHP_FUNCTION(imagecopymergegray)
        gdImagePtr im_dst, im_src;
        int srcH, srcW, srcY, srcX, dstY, dstX, pct;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrlllllll", &DIM, &SIM, &DX, &DY, &SX, &SY, &SW, &SH, &PCT) == FAILURE) {
-               return;
-       }
-
-       if ((im_dst = (gdImagePtr)zend_fetch_resource(Z_RES_P(DIM), "Image", le_gd)) == NULL) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "OOlllllll", &DIM, gd_image_ce, &SIM, gd_image_ce, &DX, &DY, &SX, &SY, &SW, &SH, &PCT) == FAILURE) {
                return;
        }
 
-       if ((im_src = (gdImagePtr)zend_fetch_resource(Z_RES_P(SIM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im_src = php_gd_libgdimageptr_from_zval_p(SIM);
+       im_dst = php_gd_libgdimageptr_from_zval_p(DIM);
 
        srcX = SX;
        srcY = SY;
@@ -3166,18 +3129,13 @@ PHP_FUNCTION(imagecopyresized)
        gdImagePtr im_dst, im_src;
        int srcH, srcW, dstH, dstW, srcY, srcX, dstY, dstX;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrllllllll", &DIM, &SIM, &DX, &DY, &SX, &SY, &DW, &DH, &SW, &SH) == FAILURE) {
-               return;
-       }
-
-       if ((im_dst = (gdImagePtr)zend_fetch_resource(Z_RES_P(DIM), "Image", le_gd)) == NULL) {
-               return;
-       }
-
-       if ((im_src = (gdImagePtr)zend_fetch_resource(Z_RES_P(SIM), "Image", le_gd)) == NULL) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "OOllllllll", &DIM, gd_image_ce, &SIM, gd_image_ce, &DX, &DY, &SX, &SY, &DW, &DH, &SW, &SH) == FAILURE) {
                return;
        }
 
+       im_src = php_gd_libgdimageptr_from_zval_p(SIM);
+       im_dst = php_gd_libgdimageptr_from_zval_p(DIM);
+       
        srcX = SX;
        srcY = SY;
        srcH = SH;
@@ -3188,7 +3146,7 @@ PHP_FUNCTION(imagecopyresized)
        dstW = DW;
 
        if (dstW <= 0 || dstH <= 0 || srcW <= 0 || srcH <= 0) {
-               php_error_docref(NULL, E_WARNING, "Invalid image dimensions");
+               zend_value_error("Invalid image dimensions");
                RETURN_FALSE;
        }
 
@@ -3204,13 +3162,11 @@ PHP_FUNCTION(imagesx)
        zval *IM;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &IM) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &IM, gd_image_ce) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        RETURN_LONG(gdImageSX(im));
 }
@@ -3223,13 +3179,11 @@ PHP_FUNCTION(imagesy)
        zval *IM;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &IM) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &IM, gd_image_ce) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        RETURN_LONG(gdImageSY(im));
 }
@@ -3243,13 +3197,11 @@ PHP_FUNCTION(imagesetclip)
        gdImagePtr im;
        zend_long x1, y1, x2, y2;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rllll", &im_zval, &x1, &y1, &x2, &y2) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ollll", &im_zval, gd_image_ce, &x1, &y1, &x2, &y2) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(im_zval), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(im_zval);
 
        gdImageSetClip(im, x1, y1, x2, y2);
        RETURN_TRUE;
@@ -3264,13 +3216,11 @@ PHP_FUNCTION(imagegetclip)
        gdImagePtr im;
        int x1, y1, x2, y2;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &im_zval) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &im_zval, gd_image_ce) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(im_zval), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(im_zval);
 
        gdImageGetClip(im, &x1, &y1, &x2, &y2);
 
@@ -3342,12 +3292,10 @@ static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int mode, int
        } else {
                if (argc < 8 || argc > ((extended) ? 9 : 8)) {
                        ZEND_WRONG_PARAM_COUNT();
-               } else if (zend_parse_parameters(argc, "rddlllss|a", &IM, &ptsize, &angle, &x, &y, &col, &fontname, &fontname_len, &str, &str_len, &EXT) == FAILURE) {
-                       return;
-               }
-               if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
+               } else if (zend_parse_parameters(argc, "Oddlllss|a", &IM, gd_image_ce, &ptsize, &angle, &x, &y, &col, &fontname, &fontname_len, &str, &str_len, &EXT) == FAILURE) {
                        return;
                }
+               im = php_gd_libgdimageptr_from_zval_p(IM);
        }
 
        /* convert angle to radians */
@@ -3406,12 +3354,10 @@ static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int mode, int
 #define PHP_GD_SINGLE_RES      \
        zval *SIM;      \
        gdImagePtr im_src;      \
-       if (zend_parse_parameters(1, "r", &SIM) == FAILURE) {   \
+       if (zend_parse_parameters(1, "O", &SIM, gd_image_ce) == FAILURE) {      \
                return; \
        }       \
-       if ((im_src = (gdImagePtr)zend_fetch_resource(Z_RES_P(SIM), "Image", le_gd)) == NULL) { \
-               return; \
-       }
+       im_src = php_gd_libgdimageptr_from_zval_p(SIM);
 
 static void php_image_filter_negate(INTERNAL_FUNCTION_PARAMETERS)
 {
@@ -3441,13 +3387,11 @@ static void php_image_filter_brightness(INTERNAL_FUNCTION_PARAMETERS)
        gdImagePtr im_src;
        zend_long brightness, tmp;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "zll", &SIM, &tmp, &brightness) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oll", &SIM, gd_image_ce, &tmp, &brightness) == FAILURE) {
                return;
        }
 
-       if ((im_src = (gdImagePtr)zend_fetch_resource(Z_RES_P(SIM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im_src = php_gd_libgdimageptr_from_zval_p(SIM);
 
        if (gdImageBrightness(im_src, (int)brightness) == 1) {
                RETURN_TRUE;
@@ -3462,13 +3406,11 @@ static void php_image_filter_contrast(INTERNAL_FUNCTION_PARAMETERS)
        gdImagePtr im_src;
        zend_long contrast, tmp;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rll", &SIM, &tmp, &contrast) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oll", &SIM, gd_image_ce, &tmp, &contrast) == FAILURE) {
                return;
        }
 
-       if ((im_src = (gdImagePtr)zend_fetch_resource(Z_RES_P(SIM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im_src = php_gd_libgdimageptr_from_zval_p(SIM);
 
        if (gdImageContrast(im_src, (int)contrast) == 1) {
                RETURN_TRUE;
@@ -3484,13 +3426,11 @@ static void php_image_filter_colorize(INTERNAL_FUNCTION_PARAMETERS)
        zend_long r,g,b,tmp;
        zend_long a = 0;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rllll|l", &SIM, &tmp, &r, &g, &b, &a) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ollll|l", &SIM, gd_image_ce, &tmp, &r, &g, &b, &a) == FAILURE) {
                return;
        }
 
-       if ((im_src = (gdImagePtr)zend_fetch_resource(Z_RES_P(SIM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im_src = php_gd_libgdimageptr_from_zval_p(SIM);
 
        if (gdImageColor(im_src, (int) r, (int) g, (int) b, (int) a) == 1) {
                RETURN_TRUE;
@@ -3561,13 +3501,11 @@ static void php_image_filter_smooth(INTERNAL_FUNCTION_PARAMETERS)
        gdImagePtr im_src;
        double weight;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rld", &SIM, &tmp, &weight) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Old", &SIM, gd_image_ce, &tmp, &weight) == FAILURE) {
                return;
        }
 
-       if ((im_src = (gdImagePtr)zend_fetch_resource(Z_RES_P(SIM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im_src = php_gd_libgdimageptr_from_zval_p(SIM);
 
        if (gdImageSmooth(im_src, (float)weight)==1) {
                RETURN_TRUE;
@@ -3583,13 +3521,11 @@ static void php_image_filter_pixelate(INTERNAL_FUNCTION_PARAMETERS)
        zend_long tmp, blocksize;
        zend_bool mode = 0;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rll|b", &IM, &tmp, &blocksize, &mode) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oll|b", &IM, gd_image_ce, &tmp, &blocksize, &mode) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        if (gdImagePixelate(im, (int) blocksize, (const unsigned int) mode)) {
                RETURN_TRUE;
@@ -3606,13 +3542,11 @@ static void php_image_filter_scatter(INTERNAL_FUNCTION_PARAMETERS)
        zend_long tmp;
        zend_long scatter_sub, scatter_plus;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlll|a", &IM, &tmp, &scatter_sub, &scatter_plus, &hash_colors) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olll|a", &IM, gd_image_ce, &tmp, &scatter_sub, &scatter_plus, &hash_colors) == FAILURE) {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        if (hash_colors) {
                uint32_t i = 0;
@@ -3665,7 +3599,7 @@ PHP_FUNCTION(imagefilter)
 
        if (ZEND_NUM_ARGS() < 2 || ZEND_NUM_ARGS() > IMAGE_FILTER_MAX_ARGS) {
                WRONG_PARAM_COUNT;
-       } else if (zend_parse_parameters(2, "rl", &tmp, &filtertype) == FAILURE) {
+       } else if (zend_parse_parameters(2, "Ol", &tmp, gd_image_ce, &filtertype) == FAILURE) {
                return;
        }
 
@@ -3686,13 +3620,11 @@ PHP_FUNCTION(imageconvolution)
        int nelem, i, j, res;
        float matrix[3][3] = {{0,0,0}, {0,0,0}, {0,0,0}};
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "radd", &SIM, &hash_matrix, &div, &offset) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oadd", &SIM, gd_image_ce, &hash_matrix, &div, &offset) == FAILURE) {
                return;
        }
 
-       if ((im_src = (gdImagePtr)zend_fetch_resource(Z_RES_P(SIM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im_src = php_gd_libgdimageptr_from_zval_p(SIM);
 
        nelem = zend_hash_num_elements(Z_ARRVAL_P(hash_matrix));
        if (nelem != 3) {
@@ -3736,13 +3668,11 @@ PHP_FUNCTION(imageflip)
        zend_long mode;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &IM, &mode) == FAILURE)  {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &IM, gd_image_ce, &mode) == FAILURE)  {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        switch (mode) {
                case GD_FLIP_VERTICAL:
@@ -3758,7 +3688,7 @@ PHP_FUNCTION(imageflip)
                        break;
 
                default:
-                       php_error_docref(NULL, E_WARNING, "Unknown flip mode");
+                       zend_value_error("Unknown flip mode");
                        RETURN_FALSE;
        }
 
@@ -3774,14 +3704,11 @@ PHP_FUNCTION(imageantialias)
        zend_bool alias;
        gdImagePtr im;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rb", &IM, &alias) == FAILURE) {
-               return;
-       }
-
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ob", &IM, gd_image_ce, &alias) == FAILURE) {
                return;
        }
 
+       im = php_gd_libgdimageptr_from_zval_p(IM);
        if (im->trueColor) {
                im->AA = alias;
        }
@@ -3801,13 +3728,11 @@ PHP_FUNCTION(imagecrop)
        zval *z_rect;
        zval *tmp;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "ra", &IM, &z_rect) == FAILURE)  {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oa", &IM, gd_image_ce, &z_rect) == FAILURE)  {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        if ((tmp = zend_hash_str_find(Z_ARRVAL_P(z_rect), "x", sizeof("x") -1)) != NULL) {
                rect.x = zval_get_long(tmp);
@@ -3841,9 +3766,9 @@ PHP_FUNCTION(imagecrop)
 
        if (im_crop == NULL) {
                RETURN_FALSE;
-       } else {
-               RETURN_RES(zend_register_resource(im_crop, le_gd));
        }
+
+       php_gd_assign_libgdimageptr_as_extgdimage(return_value, im_crop);
 }
 /* }}} */
 
@@ -3858,13 +3783,11 @@ PHP_FUNCTION(imagecropauto)
        gdImagePtr im;
        gdImagePtr im_crop;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|ldl", &IM, &mode, &threshold, &color) == FAILURE)  {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|ldl", &IM, gd_image_ce, &mode, &threshold, &color) == FAILURE)  {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        switch (mode) {
                case GD_CROP_DEFAULT:
@@ -3890,9 +3813,9 @@ PHP_FUNCTION(imagecropauto)
 
        if (im_crop == NULL) {
                RETURN_FALSE;
-       } else {
-               RETURN_RES(zend_register_resource(im_crop, le_gd));
        }
+
+       php_gd_assign_libgdimageptr_as_extgdimage(return_value, im_crop);
 }
 /* }}} */
 
@@ -3907,14 +3830,12 @@ PHP_FUNCTION(imagescale)
        zend_long tmp_w, tmp_h=-1, tmp_m = GD_BILINEAR_FIXED;
        gdInterpolationMethod method, old_method;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|ll", &IM, &tmp_w, &tmp_h, &tmp_m) == FAILURE)  {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol|ll", &IM, gd_image_ce, &tmp_w, &tmp_h, &tmp_m) == FAILURE)  {
                return;
        }
        method = tmp_m;
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        if (tmp_h < 0 || tmp_w < 0) {
                /* preserve ratio */
@@ -3947,9 +3868,9 @@ PHP_FUNCTION(imagescale)
 
        if (im_scaled == NULL) {
                RETURN_FALSE;
-       } else {
-               RETURN_RES(zend_register_resource(im_scaled, le_gd));
        }
+
+       php_gd_assign_libgdimageptr_as_extgdimage(return_value, im_scaled);
 }
 /* }}} */
 
@@ -3969,13 +3890,11 @@ PHP_FUNCTION(imageaffine)
        int i, nelems;
        zval *zval_affine_elem = NULL;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "ra|a", &IM, &z_affine, &z_rect) == FAILURE)  {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oa|a", &IM, gd_image_ce, &z_affine, &z_rect) == FAILURE)  {
                return;
        }
 
-       if ((src = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       src = php_gd_libgdimageptr_from_zval_p(IM);
 
        if ((nelems = zend_hash_num_elements(Z_ARRVAL_P(z_affine))) != 6) {
                zend_value_error("Affine array must have six elements");
@@ -4044,9 +3963,9 @@ PHP_FUNCTION(imageaffine)
 
        if (dst == NULL) {
                RETURN_FALSE;
-       } else {
-               RETURN_RES(zend_register_resource(dst, le_gd));
        }
+
+       php_gd_assign_libgdimageptr_as_extgdimage(return_value, dst);
 }
 /* }}} */
 
@@ -4208,13 +4127,11 @@ PHP_FUNCTION(imagesetinterpolation)
        gdImagePtr im;
        zend_long method = GD_BILINEAR_FIXED;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|l", &IM, &method) == FAILURE)  {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|l", &IM, gd_image_ce, &method) == FAILURE)  {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        if (method == -1) {
                 method = GD_BILINEAR_FIXED;
@@ -4231,13 +4148,11 @@ PHP_FUNCTION(imageresolution)
        gdImagePtr im;
        zend_long res_x = GD_RESOLUTION, res_y = GD_RESOLUTION;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|ll", &IM, &res_x, &res_y) == FAILURE)  {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|ll", &IM, gd_image_ce, &res_x, &res_y) == FAILURE)  {
                return;
        }
 
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
-               return;
-       }
+       im = php_gd_libgdimageptr_from_zval_p(IM);
 
        switch (ZEND_NUM_ARGS()) {
                case 3:
@@ -4253,3 +4168,208 @@ PHP_FUNCTION(imageresolution)
        }
 }
 /* }}} */
+
+
+/*********************************************************
+ *
+ * Stream Handling
+ * Formerly contained within ext/gd/gd_ctx.c and included
+ * at the the top of this file
+ *
+ ********************************************************/
+
+#define CTX_PUTC(c,ctx) ctx->putC(ctx, c)
+
+static void _php_image_output_putc(struct gdIOCtx *ctx, int c) /* {{{ */
+{
+       /* without the following downcast, the write will fail
+        * (i.e., will write a zero byte) for all
+        * big endian architectures:
+        */
+       unsigned char ch = (unsigned char) c;
+       php_write(&ch, 1);
+} /* }}} */
+
+static int _php_image_output_putbuf(struct gdIOCtx *ctx, const void* buf, int l) /* {{{ */
+{
+       return php_write((void *)buf, l);
+} /* }}} */
+
+static void _php_image_output_ctxfree(struct gdIOCtx *ctx) /* {{{ */
+{
+       if(ctx) {
+               efree(ctx);
+       }
+} /* }}} */
+
+static void _php_image_stream_putc(struct gdIOCtx *ctx, int c) /* {{{ */ {
+       char ch = (char) c;
+       php_stream * stream = (php_stream *)ctx->data;
+       php_stream_write(stream, &ch, 1);
+} /* }}} */
+
+static int _php_image_stream_putbuf(struct gdIOCtx *ctx, const void* buf, int l) /* {{{ */
+{
+       php_stream * stream = (php_stream *)ctx->data;
+       return php_stream_write(stream, (void *)buf, l);
+} /* }}} */
+
+static void _php_image_stream_ctxfree(struct gdIOCtx *ctx) /* {{{ */
+{
+       if(ctx->data) {
+               ctx->data = NULL;
+       }
+       if(ctx) {
+               efree(ctx);
+       }
+} /* }}} */
+
+static void _php_image_stream_ctxfreeandclose(struct gdIOCtx *ctx) /* {{{ */
+{
+
+       if(ctx->data) {
+               php_stream_close((php_stream *) ctx->data);
+               ctx->data = NULL;
+       }
+       if(ctx) {
+               efree(ctx);
+       }
+} /* }}} */
+
+/* {{{ _php_image_output_ctx */
+static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)())
+{
+       zval *imgind;
+       char *file = NULL;
+       size_t file_len = 0;
+       zend_long quality, basefilter;
+       zend_bool compressed = 1;
+       gdImagePtr im;
+       int argc = ZEND_NUM_ARGS();
+       int q = -1, i;
+       int f = -1;
+       gdIOCtx *ctx = NULL;
+       zval *to_zval = NULL;
+       php_stream *stream;
+       int close_stream = 1;
+
+       /* The third (quality) parameter for Wbmp and Xbm stands for the foreground color index when called
+        * from imagey<type>().
+        */
+       switch (image_type) {
+               case PHP_GDIMG_TYPE_XBM:
+                       if (zend_parse_parameters(argc, "Op!|ll", &imgind, gd_image_ce, &file, &file_len, &quality, &basefilter) == FAILURE) {
+                               return;
+                       }
+                       break;
+               case PHP_GDIMG_TYPE_BMP:
+                       if (zend_parse_parameters(argc, "O|z!b", &imgind, gd_image_ce, &to_zval, &compressed) == FAILURE) {
+                               return;
+                       }
+                       break;
+               default:
+                       /* PHP_GDIMG_TYPE_GIF
+                        * PHP_GDIMG_TYPE_PNG
+                        * PHP_GDIMG_TYPE_JPG
+                        * PHP_GDIMG_TYPE_WBM
+                        * PHP_GDIMG_TYPE_WEBP
+                        * */
+                       if (zend_parse_parameters(argc, "O|z!ll", &imgind, gd_image_ce, &to_zval, &quality, &basefilter) == FAILURE) {
+                               return;
+                       }
+       }
+
+       im = php_gd_libgdimageptr_from_zval_p(imgind);
+
+       if (image_type != PHP_GDIMG_TYPE_BMP && argc >= 3) {
+               q = quality; /* or colorindex for foreground of BW images (defaults to black) */
+               if (argc == 4) {
+                       f = basefilter;
+               }
+       }
+
+       if (argc > 1 && to_zval != NULL) {
+               if (Z_TYPE_P(to_zval) == IS_RESOURCE) {
+                       php_stream_from_zval_no_verify(stream, to_zval);
+                       if (stream == NULL) {
+                               RETURN_FALSE;
+                       }
+                       close_stream = 0;
+               } else if (Z_TYPE_P(to_zval) == IS_STRING) {
+                       if (CHECK_ZVAL_NULL_PATH(to_zval)) {
+                               zend_type_error("Invalid 2nd parameter, filename must not contain null bytes");
+                               return;
+                       }
+
+                       stream = php_stream_open_wrapper(Z_STRVAL_P(to_zval), "wb", REPORT_ERRORS|IGNORE_PATH|IGNORE_URL_WIN, NULL);
+                       if (stream == NULL) {
+                               RETURN_FALSE;
+                       }
+               } else {
+                       php_error_docref(NULL, E_WARNING, "Invalid 2nd parameter, it must a filename or a stream");
+                       RETURN_FALSE;
+               }
+       } else if (argc > 1 && file != NULL) {
+               stream = php_stream_open_wrapper(file, "wb", REPORT_ERRORS|IGNORE_PATH|IGNORE_URL_WIN, NULL);
+               if (stream == NULL) {
+                       RETURN_FALSE;
+               }
+       } else {
+               ctx = ecalloc(1, sizeof(gdIOCtx));
+               ctx->putC = _php_image_output_putc;
+               ctx->putBuf = _php_image_output_putbuf;
+               ctx->gd_free = _php_image_output_ctxfree;
+       }
+
+       if (!ctx)       {
+               ctx = ecalloc(1, sizeof(gdIOCtx));
+               ctx->putC = _php_image_stream_putc;
+               ctx->putBuf = _php_image_stream_putbuf;
+               if (close_stream) {
+                       ctx->gd_free = _php_image_stream_ctxfreeandclose;
+               } else {
+                       ctx->gd_free = _php_image_stream_ctxfree;
+               }
+               ctx->data = (void *)stream;
+       }
+
+       switch(image_type) {
+               case PHP_GDIMG_TYPE_JPG:
+                       (*func_p)(im, ctx, q);
+                       break;
+               case PHP_GDIMG_TYPE_WEBP:
+                       if (q == -1) {
+                               q = 80;
+                       }
+                       (*func_p)(im, ctx, q);
+                       break;
+               case PHP_GDIMG_TYPE_PNG:
+                       (*func_p)(im, ctx, q, f);
+                       break;
+               case PHP_GDIMG_TYPE_XBM:
+               case PHP_GDIMG_TYPE_WBM:
+                       if (argc < 3) {
+                               for(i=0; i < gdImageColorsTotal(im); i++) {
+                                       if(!gdImageRed(im, i) && !gdImageGreen(im, i) && !gdImageBlue(im, i)) break;
+                               }
+                               q = i;
+                       }
+                       if (image_type == PHP_GDIMG_TYPE_XBM) {
+                               (*func_p)(im, file ? file : "", q, ctx);
+                       } else {
+                               (*func_p)(im, q, ctx);
+                       }
+                       break;
+               case PHP_GDIMG_TYPE_BMP:
+                       (*func_p)(im, ctx, (int) compressed);
+                       break;
+               default:
+                       (*func_p)(im, ctx);
+                       break;
+       }
+
+       ctx->gd_free(ctx);
+
+       RETURN_TRUE;
+}
+/* }}} */
\ No newline at end of file
index 75d0916751bcd6903c15595bd0cfb52ceb9b85ac..7b639f9371037d9d5be500d27865b24affd38878 100644 (file)
@@ -7,262 +7,262 @@ function imageloadfont(string $filename) {}
 
 function imagesetstyle($im, array $styles): bool {}
 
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreatetruecolor(int $x_size, int $y_size) {}
 
-function imageistruecolor($im): bool {}
+function imageistruecolor(GdImage $im): bool {}
 
-function imagetruecolortopalette($im, bool $ditherFlag, int $colorWanted): bool {}
+function imagetruecolortopalette(GdImage $im, bool $ditherFlag, int $colorWanted): bool {}
 
-function imagepalettetotruecolor($im): bool {}
+function imagepalettetotruecolor(GdImage $im): bool {}
 
 function imagecolormatch($im1, $im2): bool {}
 
-function imagesetthickness($im, int $thickness): bool {}
+function imagesetthickness(GdImage $im, int $thickness): bool {}
 
-function imagefilledellipse($im, int $cx, int $cy, int $w, int $h, int $color): bool {}
+function imagefilledellipse(GdImage $im, int $cx, int $cy, int $w, int $h, int $color): bool {}
 
-function imagefilledarc($im, int $cx, int $cy, int $w, int $h, int $s, int $e, int $col, int $style): bool {}
+function imagefilledarc(GdImage $im, int $cx, int $cy, int $w, int $h, int $s, int $e, int $col, int $style): bool {}
 
-function imagealphablending($im, bool $blend): bool {}
+function imagealphablending(GdImage $im, bool $blend): bool {}
 
-function imagesavealpha($im, bool $save): bool {}
+function imagesavealpha(GdImage $im, bool $save): bool {}
 
-function imagelayereffect($im, int $effect): bool {}
+function imagelayereffect(GdImage $im, int $effect): bool {}
 
 /** @return int|false */
-function imagecolorallocatealpha($im, int $red, int $green, int $blue, int $alpha) {}
+function imagecolorallocatealpha(GdImage $im, int $red, int $green, int $blue, int $alpha) {}
 
 /** @return int|false */
-function imagecolorresolvealpha($im, int $red, int $green, int $blue, int $alpha) {}
+function imagecolorresolvealpha(GdImage $im, int $red, int $green, int $blue, int $alpha) {}
 
 /** @return int|false */
-function imagecolorclosestalpha($im, int $red, int $green, int $blue, int $alpha) {}
+function imagecolorclosestalpha(GdImage $im, int $red, int $green, int $blue, int $alpha) {}
 
 /** @return int|false */
-function imagecolorexactalpha($im, int $red, int $green, int $blue, int $alpha) {}
+function imagecolorexactalpha(GdImage $im, int $red, int $green, int $blue, int $alpha) {}
 
-function imagecopyresampled($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h): bool {}
+function imagecopyresampled(GdImage $dst_im, GdImage $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h): bool {}
 
 #ifdef PHP_WIN32
 
-/** @return resource|false */
+/** @return GdImage|false */
 function imagegrabwindow(int $handle, int $client_area = 0) {}
 
-/** @return resource|false */
+/** @return GdImage|false */
 function imagegrabscreen() {}
 
 #endif
 
-/** @return resource|false */
-function imagerotate($im, float $angle, int $bgdcolor, int $ignoretransparent = 0) {}
+/** @return GdImage|false */
+function imagerotate(GdImage $im, float $angle, int $bgdcolor, int $ignoretransparent = 0) {}
 
-function imagesettile($im, $tile): bool {}
+function imagesettile(GdImage $im, $tile): bool {}
 
-function imagesetbrush($im, $brush): bool {}
+function imagesetbrush(GdImage $im, $brush): bool {}
 
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreate(int $x_size, int $y_size) {}
 
 function imagetypes(): int {}
 
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreatefromstring(string $image) {}
 
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreatefromgif(string $filename) {}
 
 #ifdef HAVE_GD_JPG
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreatefromjpeg(string $filename) {}
 #endif
 
 #ifdef HAVE_GD_PNG
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreatefrompng(string $filename) {}
 #endif
 
 #ifdef HAVE_GD_WEBP
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreatefromwebp(string $filename) {}
 #endif
 
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreatefromxbm(string $filename) {}
 
 #ifdef HAVE_GD_XPM
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreatefromxpm(string $filename) {}
 #endif
 
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreatefromwbmp(string $filename) {}
 
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreatefromgd(string $filename) {}
 
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreatefromgd2(string $filename) {}
 
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreatefromgd2part(string $filename, int $srcX, int $srcY, int $width, int $height) {}
 
 #ifdef HAVE_GD_BMP
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreatefrombmp(string $filename) {}
 #endif
     
 #ifdef HAVE_GD_TGA
-/** @return resource|false */
+/** @return GdImage|false */
 function imagecreatefromtga(string $filename) {}
 #endif
 
-function imagexbm($im, ?string $filename, int $foreground = UNKNOWN): bool {}
+function imagexbm(GdImage $im, ?string $filename, int $foreground = UNKNOWN): bool {}
 
-function imagegif($im, $to = NULL): bool {}
+function imagegif(GdImage $im, $to = NULL): bool {}
 
 #ifdef HAVE_GD_PNG
-function imagepng($im, $to = NULL, int $quality = UNKNOWN, int $filters = UNKNOWN): bool {}
+function imagepng(GdImage $im, $to = NULL, int $quality = UNKNOWN, int $filters = UNKNOWN): bool {}
 #endif
 
 #ifdef HAVE_GD_WEBP
-function imagewebp($im, $to = NULL, int $quality = UNKNOWN): bool {}
+function imagewebp(GdImage $im, $to = NULL, int $quality = UNKNOWN): bool {}
 #endif
 
 #ifdef HAVE_GD_JPG
-function imagejpeg($im, $to = NULL, int $quality = UNKNOWN): bool {}
+function imagejpeg(GdImage $im, $to = NULL, int $quality = UNKNOWN): bool {}
 #endif
 
-function imagewbmp($im, $to = NULL, int $foreground = UNKNOWN): bool {}
+function imagewbmp(GdImage $im, $to = NULL, int $foreground = UNKNOWN): bool {}
 
-function imagegd($im, $to = UNKNOWN): bool {}
+function imagegd(GdImage $im, $to = UNKNOWN): bool {}
 
-function imagegd2($im, $to = UNKNOWN, int $chunk_size = UNKNOWN, int $type = UNKNOWN): bool {}
+function imagegd2(GdImage $im, $to = UNKNOWN, int $chunk_size = UNKNOWN, int $type = UNKNOWN): bool {}
 
 #ifdef HAVE_GD_BMP
-function imagebmp($im, $to = NULL, int $compressed = 1): bool {}
+function imagebmp(GdImage $im, $to = NULL, int $compressed = 1): bool {}
 #endif
 
-function imagedestroy($im): bool {}
+function imagedestroy(GdImage $im): bool {}
 
 /** @return int|false */
-function imagecolorallocate($im, int $red, int $green, int $blue) {}
+function imagecolorallocate(GdImage $im, int $red, int $green, int $blue) {}
 
-function imagepalettecopy($dst, $src): void {}
+function imagepalettecopy(GdImage $dst, GdImage $src): void {}
 
 /** @return int|false */
-function imagecolorat($im, int $x, int $y) {}
+function imagecolorat(GdImage $im, int $x, int $y) {}
 
 /** @return int|false */
-function imagecolorclosest($im, int $red, int $green, int $blue) {}
+function imagecolorclosest(GdImage $im, int $red, int $green, int $blue) {}
 
 /** @return int|false */
-function imagecolorclosesthwb($im, int $red, int $green, int $blue) {}
+function imagecolorclosesthwb(GdImage $im, int $red, int $green, int $blue) {}
 
-function imagecolordeallocate($im, int $index): bool {}
+function imagecolordeallocate(GdImage $im, int $index): bool {}
 
 /** @return int|false */
-function imagecolorresolve($im, int $red, int $green, int $blue) {}
+function imagecolorresolve(GdImage $im, int $red, int $green, int $blue) {}
 
 /** @return int|false */
-function imagecolorexact($im, int $red, int $green, int $blue) {}
+function imagecolorexact(GdImage $im, int $red, int $green, int $blue) {}
 
 /** @return ?false */
-function imagecolorset($im, int $color, int $red, int $green, int $blue, int $alpha = 0) {}
+function imagecolorset(GdImage $im, int $color, int $red, int $green, int $blue, int $alpha = 0) {}
 
 /** @return array|false */
-function imagecolorsforindex($im, int $index) {}
+function imagecolorsforindex(GdImage $im, int $index) {}
 
-function imagegammacorrect($im, float $inputgamma, float $outputgamma): bool {}
+function imagegammacorrect(GdImage $im, float $inputgamma, float $outputgamma): bool {}
 
-function imagesetpixel($im, int $x, int $y, int $col): bool {}
+function imagesetpixel(GdImage $im, int $x, int $y, int $col): bool {}
 
-function imageline($im, int $x1, int $y1, int $x2, int $y2, int $col): bool {}
+function imageline(GdImage $im, int $x1, int $y1, int $x2, int $y2, int $col): bool {}
 
-function imagedashedline($im, int $x1, int $y1, int $x2, int $y2, int $col): bool {}
+function imagedashedline(GdImage $im, int $x1, int $y1, int $x2, int $y2, int $col): bool {}
 
-function imagerectangle($im, int $x1, int $y1, int $x2, int $y2, int $col): bool {}
+function imagerectangle(GdImage $im, int $x1, int $y1, int $x2, int $y2, int $col): bool {}
 
-function imagefilledrectangle($im, int $x1, int $y1, int $x2, int $y2, int $col): bool {}
+function imagefilledrectangle(GdImage $im, int $x1, int $y1, int $x2, int $y2, int $col): bool {}
 
-function imagearc($im, int $cx, int $cy, int $w, int $h, int $s, int $e, int $col): bool {}
+function imagearc(GdImage $im, int $cx, int $cy, int $w, int $h, int $s, int $e, int $col): bool {}
 
-function imageellipse($im, int $cx, int $cy, int $w, int $h, int $color): bool {}
+function imageellipse(GdImage $im, int $cx, int $cy, int $w, int $h, int $color): bool {}
 
-function imagefilltoborder($im, int $x, int $y, int $border, int $col): bool {}
+function imagefilltoborder(GdImage $im, int $x, int $y, int $border, int $col): bool {}
 
-function imagefill($im, int $x, int $y, int $col): bool {}
+function imagefill(GdImage $im, int $x, int $y, int $col): bool {}
 
-function imagecolorstotal($im): int {}
+function imagecolorstotal(GdImage $im): int {}
 
-function imagecolortransparent($im, int $col = UNKNOWN): ?int {}
+function imagecolortransparent(GdImage $im, int $col = UNKNOWN): ?int {}
 
-function imageinterlace($im, int $interlace = UNKNOWN): ?int {}
+function imageinterlace(GdImage $im, int $interlace = UNKNOWN): ?int {}
 
-function imagepolygon($im, array $points, int $num_pos, int $col): bool {}
+function imagepolygon(GdImage $im, array $points, int $num_pos, int $col): bool {}
 
-function imageopenpolygon($im, array $points, int $num_pos, int $col): bool {}
+function imageopenpolygon(GdImage $im, array $points, int $num_pos, int $col): bool {}
 
-function imagefilledpolygon($im, array $points, int $num_pos, int $col): bool {}
+function imagefilledpolygon(GdImage $im, array $points, int $num_pos, int $col): bool {}
 
 function imagefontwidth(int $font): int {}
 
 function imagefontheight(int $font): int {}
 
-function imagechar($im, int $font, int $x, int $y, string $c, int $col): bool {}
+function imagechar(GdImage $im, int $font, int $x, int $y, string $c, int $col): bool {}
 
-function imagecharup($im, int $font, int $x, int $y, string $c, int $col): bool {}
+function imagecharup(GdImage $im, int $font, int $x, int $y, string $c, int $col): bool {}
 
-function imagestring($im, int $font, int $x, int $y, string $str, int $col): bool {}
+function imagestring(GdImage $im, int $font, int $x, int $y, string $str, int $col): bool {}
 
-function imagestringup($im, int $font, int $x, int $y, string $str, int $col): bool {}
+function imagestringup(GdImage $im, int $font, int $x, int $y, string $str, int $col): bool {}
 
-function imagecopy($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h): bool {}
+function imagecopy(GdImage $dst_im, GdImage $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h): bool {}
 
-function imagecopymerge($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h, int $pct): bool {}
+function imagecopymerge(GdImage $dst_im, GdImage $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h, int $pct): bool {}
 
-function imagecopymergegray($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h, int $pct): bool {}
+function imagecopymergegray(GdImage $dst_im, GdImage $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h, int $pct): bool {}
 
-function imagecopyresized($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h): bool {}
+function imagecopyresized(GdImage $dst_im, GdImage $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h): bool {}
 
-function imagesx($im): int {}
+function imagesx(GdImage $im): int {}
 
-function imagesy($im): int {}
+function imagesy(GdImage $im): int {}
 
-function imagesetclip($im, int $x1, int $x2, int $y1, int $y2): bool {}
+function imagesetclip(GdImage $im, int $x1, int $x2, int $y1, int $y2): bool {}
 
-function imagegetclip($im): array {}
+function imagegetclip(GdImage $im): array {}
 
 #ifdef HAVE_GD_FREETYPE
 /** @return array|false */
 function imageftbbox(float $size, float $angle, string $font_file, string $text, array $extrainfo = UNKNOWN) {}
 
-function imagefttext($im, float $size, float $angle, int $x, int $y, int $col, string $font_file, string $text, array $extrainfo = UNKNOWN) {}
+function imagefttext(GdImage $im, float $size, float $angle, int $x, int $y, int $col, string $font_file, string $text, array $extrainfo = UNKNOWN) {}
 
 function imagettfbbox(float $size, float $angle, string $font_file, string $text) {}
 
-function imagettftext($im, float $size, float $angle, int $x, int $y, int $col, string $font_file, string $text) {}
+function imagettftext(GdImage $im, float $size, float $angle, int $x, int $y, int $col, string $font_file, string $text) {}
 #endif
 
-function imagefilter($im, int $filtertype, $arg1 = UNKNOWN, $arg2 = UNKNOWN, $arg3 = UNKNOWN, $arg4 = UNKNOWN): bool {}
+function imagefilter(GdImage $im, int $filtertype, $arg1 = UNKNOWN, $arg2 = UNKNOWN, $arg3 = UNKNOWN, $arg4 = UNKNOWN): bool {}
 
-function imageconvolution($im, array $matrix3x3, float $div, float $offset): bool {}
+function imageconvolution(GdImage $im, array $matrix3x3, float $div, float $offset): bool {}
 
-function imageflip($im, int $mode): bool {}
+function imageflip(GdImage $im, int $mode): bool {}
 
-function imageantialias($im, bool $on): bool {}
+function imageantialias(GdImage $im, bool $on): bool {}
 
-/** @return resource|false */
-function imagecrop($im, array $rect) {}
+/** @return GdImage|false */
+function imagecrop(GdImage $im, array $rect) {}
 
-/** @return resource|false */
-function imagecropauto($im, int $mode = IMG_CROP_DEFAULT, float $threshold = 0.5, int $color = -1) {}
+/** @return GdImage|false */
+function imagecropauto(GdImage $im, int $mode = IMG_CROP_DEFAULT, float $threshold = 0.5, int $color = -1) {}
 
-/** @return resource|false */
-function imagescale($im, int $new_width, int $new_height = UNKNOWN, int $mode = IMG_BILINEAR_FIXED) {}
+/** @return GdImage|false */
+function imagescale(GdImage $im, int $new_width, int $new_height = UNKNOWN, int $mode = IMG_BILINEAR_FIXED) {}
 
-/** @return resource|false */
-function imageaffine($im, array $affine, array $clip = UNKNOWN) {}
+/** @return GdImage|false */
+function imageaffine(GdImage $im, array $affine, array $clip = UNKNOWN) {}
 
 /** @return array|false */
 function imageaffinematrixget(int $type, $options = UNKNOWN) {}
@@ -270,7 +270,7 @@ function imageaffinematrixget(int $type, $options = UNKNOWN) {}
 /** @return array|false */
 function imageaffinematrixconcat(array $m1, array $m2) {}
 
-function imagesetinterpolation($im, int $method = IMG_BILENEAR_FIXED): bool {}
+function imagesetinterpolation(GdImage $im, int $method = IMG_BILENEAR_FIXED): bool {}
 
 /** @return array|true */
-function imageresolution($im, int $res_x = UNKNOWN, int $res_y = UNKNOWN) {}
+function imageresolution(GdImage $im, int $res_x = UNKNOWN, int $res_y = UNKNOWN) {}
index 0544802c7ef3cd4aabff1a1a383854061da7b28f..1f036c8ea96b54182f051c1be62994166f245fca 100644 (file)
@@ -18,11 +18,11 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_imagecreatetruecolor, 0, 0, 2)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imageistruecolor, 0, 1, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagetruecolortopalette, 0, 3, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, ditherFlag, _IS_BOOL, 0)
        ZEND_ARG_TYPE_INFO(0, colorWanted, IS_LONG, 0)
 ZEND_END_ARG_INFO()
@@ -35,12 +35,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecolormatch, 0, 2, _IS_BOOL,
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagesetthickness, 0, 2, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, thickness, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagefilledellipse, 0, 6, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, cx, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, cy, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, w, IS_LONG, 0)
@@ -49,7 +49,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagefilledellipse, 0, 6, _IS_BO
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagefilledarc, 0, 9, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, cx, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, cy, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, w, IS_LONG, 0)
@@ -61,22 +61,22 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagefilledarc, 0, 9, _IS_BOOL,
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagealphablending, 0, 2, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, blend, _IS_BOOL, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagesavealpha, 0, 2, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, save, _IS_BOOL, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagelayereffect, 0, 2, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, effect, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_imagecolorallocatealpha, 0, 0, 5)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, red, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, green, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, blue, IS_LONG, 0)
@@ -90,8 +90,8 @@ ZEND_END_ARG_INFO()
 #define arginfo_imagecolorexactalpha arginfo_imagecolorallocatealpha
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecopyresampled, 0, 10, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, dst_im)
-       ZEND_ARG_INFO(0, src_im)
+       ZEND_ARG_OBJ_INFO(0, dst_im, GdImage, 0)
+       ZEND_ARG_OBJ_INFO(0, src_im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, dst_x, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, dst_y, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, src_x, IS_LONG, 0)
@@ -115,19 +115,19 @@ ZEND_END_ARG_INFO()
 #endif
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_imagerotate, 0, 0, 3)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, angle, IS_DOUBLE, 0)
        ZEND_ARG_TYPE_INFO(0, bgdcolor, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, ignoretransparent, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagesettile, 0, 2, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_INFO(0, tile)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagesetbrush, 0, 2, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_INFO(0, brush)
 ZEND_END_ARG_INFO()
 
@@ -195,19 +195,19 @@ ZEND_END_ARG_INFO()
 #endif
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagexbm, 0, 2, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 1)
        ZEND_ARG_TYPE_INFO(0, foreground, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagegif, 0, 1, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_INFO(0, to)
 ZEND_END_ARG_INFO()
 
 #if defined(HAVE_GD_PNG)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagepng, 0, 1, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_INFO(0, to)
        ZEND_ARG_TYPE_INFO(0, quality, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, filters, IS_LONG, 0)
@@ -216,7 +216,7 @@ ZEND_END_ARG_INFO()
 
 #if defined(HAVE_GD_WEBP)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagewebp, 0, 1, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_INFO(0, to)
        ZEND_ARG_TYPE_INFO(0, quality, IS_LONG, 0)
 ZEND_END_ARG_INFO()
@@ -224,14 +224,14 @@ ZEND_END_ARG_INFO()
 
 #if defined(HAVE_GD_JPG)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagejpeg, 0, 1, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_INFO(0, to)
        ZEND_ARG_TYPE_INFO(0, quality, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 #endif
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagewbmp, 0, 1, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_INFO(0, to)
        ZEND_ARG_TYPE_INFO(0, foreground, IS_LONG, 0)
 ZEND_END_ARG_INFO()
@@ -239,7 +239,7 @@ ZEND_END_ARG_INFO()
 #define arginfo_imagegd arginfo_imagegif
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagegd2, 0, 1, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_INFO(0, to)
        ZEND_ARG_TYPE_INFO(0, chunk_size, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, type, IS_LONG, 0)
@@ -247,7 +247,7 @@ ZEND_END_ARG_INFO()
 
 #if defined(HAVE_GD_BMP)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagebmp, 0, 1, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_INFO(0, to)
        ZEND_ARG_TYPE_INFO(0, compressed, IS_LONG, 0)
 ZEND_END_ARG_INFO()
@@ -256,19 +256,19 @@ ZEND_END_ARG_INFO()
 #define arginfo_imagedestroy arginfo_imageistruecolor
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_imagecolorallocate, 0, 0, 4)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, red, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, green, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, blue, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagepalettecopy, 0, 2, IS_VOID, 0)
-       ZEND_ARG_INFO(0, dst)
-       ZEND_ARG_INFO(0, src)
+       ZEND_ARG_OBJ_INFO(0, dst, GdImage, 0)
+       ZEND_ARG_OBJ_INFO(0, src, GdImage, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_imagecolorat, 0, 0, 3)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, x, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, y, IS_LONG, 0)
 ZEND_END_ARG_INFO()
@@ -278,7 +278,7 @@ ZEND_END_ARG_INFO()
 #define arginfo_imagecolorclosesthwb arginfo_imagecolorallocate
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecolordeallocate, 0, 2, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, index, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
@@ -287,7 +287,7 @@ ZEND_END_ARG_INFO()
 #define arginfo_imagecolorexact arginfo_imagecolorallocate
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_imagecolorset, 0, 0, 5)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, color, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, red, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, green, IS_LONG, 0)
@@ -296,25 +296,25 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_imagecolorset, 0, 0, 5)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_imagecolorsforindex, 0, 0, 2)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, index, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagegammacorrect, 0, 3, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, inputgamma, IS_DOUBLE, 0)
        ZEND_ARG_TYPE_INFO(0, outputgamma, IS_DOUBLE, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagesetpixel, 0, 4, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, x, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, y, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, col, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imageline, 0, 6, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, x1, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, y1, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, x2, IS_LONG, 0)
@@ -329,7 +329,7 @@ ZEND_END_ARG_INFO()
 #define arginfo_imagefilledrectangle arginfo_imageline
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagearc, 0, 8, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, cx, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, cy, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, w, IS_LONG, 0)
@@ -342,7 +342,7 @@ ZEND_END_ARG_INFO()
 #define arginfo_imageellipse arginfo_imagefilledellipse
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagefilltoborder, 0, 5, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, x, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, y, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, border, IS_LONG, 0)
@@ -352,21 +352,21 @@ ZEND_END_ARG_INFO()
 #define arginfo_imagefill arginfo_imagesetpixel
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecolorstotal, 0, 1, IS_LONG, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecolortransparent, 0, 1, IS_LONG, 1)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, col, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imageinterlace, 0, 1, IS_LONG, 1)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, interlace, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagepolygon, 0, 4, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, points, IS_ARRAY, 0)
        ZEND_ARG_TYPE_INFO(0, num_pos, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, col, IS_LONG, 0)
@@ -383,7 +383,7 @@ ZEND_END_ARG_INFO()
 #define arginfo_imagefontheight arginfo_imagefontwidth
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagechar, 0, 6, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, font, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, x, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, y, IS_LONG, 0)
@@ -394,7 +394,7 @@ ZEND_END_ARG_INFO()
 #define arginfo_imagecharup arginfo_imagechar
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagestring, 0, 6, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, font, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, x, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, y, IS_LONG, 0)
@@ -405,8 +405,8 @@ ZEND_END_ARG_INFO()
 #define arginfo_imagestringup arginfo_imagestring
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecopy, 0, 8, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, dst_im)
-       ZEND_ARG_INFO(0, src_im)
+       ZEND_ARG_OBJ_INFO(0, dst_im, GdImage, 0)
+       ZEND_ARG_OBJ_INFO(0, src_im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, dst_x, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, dst_y, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, src_x, IS_LONG, 0)
@@ -416,8 +416,8 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecopy, 0, 8, _IS_BOOL, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecopymerge, 0, 9, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, dst_im)
-       ZEND_ARG_INFO(0, src_im)
+       ZEND_ARG_OBJ_INFO(0, dst_im, GdImage, 0)
+       ZEND_ARG_OBJ_INFO(0, src_im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, dst_x, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, dst_y, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, src_x, IS_LONG, 0)
@@ -436,7 +436,7 @@ ZEND_END_ARG_INFO()
 #define arginfo_imagesy arginfo_imagecolorstotal
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagesetclip, 0, 5, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, x1, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, x2, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, y1, IS_LONG, 0)
@@ -444,7 +444,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagesetclip, 0, 5, _IS_BOOL, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagegetclip, 0, 1, IS_ARRAY, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
 ZEND_END_ARG_INFO()
 
 #if defined(HAVE_GD_FREETYPE)
@@ -459,7 +459,7 @@ ZEND_END_ARG_INFO()
 
 #if defined(HAVE_GD_FREETYPE)
 ZEND_BEGIN_ARG_INFO_EX(arginfo_imagefttext, 0, 0, 8)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, size, IS_DOUBLE, 0)
        ZEND_ARG_TYPE_INFO(0, angle, IS_DOUBLE, 0)
        ZEND_ARG_TYPE_INFO(0, x, IS_LONG, 0)
@@ -482,7 +482,7 @@ ZEND_END_ARG_INFO()
 
 #if defined(HAVE_GD_FREETYPE)
 ZEND_BEGIN_ARG_INFO_EX(arginfo_imagettftext, 0, 0, 8)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, size, IS_DOUBLE, 0)
        ZEND_ARG_TYPE_INFO(0, angle, IS_DOUBLE, 0)
        ZEND_ARG_TYPE_INFO(0, x, IS_LONG, 0)
@@ -494,7 +494,7 @@ ZEND_END_ARG_INFO()
 #endif
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagefilter, 0, 2, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, filtertype, IS_LONG, 0)
        ZEND_ARG_INFO(0, arg1)
        ZEND_ARG_INFO(0, arg2)
@@ -503,43 +503,43 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagefilter, 0, 2, _IS_BOOL, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imageconvolution, 0, 4, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, matrix3x3, IS_ARRAY, 0)
        ZEND_ARG_TYPE_INFO(0, div, IS_DOUBLE, 0)
        ZEND_ARG_TYPE_INFO(0, offset, IS_DOUBLE, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imageflip, 0, 2, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, mode, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imageantialias, 0, 2, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, on, _IS_BOOL, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_imagecrop, 0, 0, 2)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, rect, IS_ARRAY, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_imagecropauto, 0, 0, 1)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, mode, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, threshold, IS_DOUBLE, 0)
        ZEND_ARG_TYPE_INFO(0, color, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_imagescale, 0, 0, 2)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, new_width, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, new_height, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, mode, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_imageaffine, 0, 0, 2)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, affine, IS_ARRAY, 0)
        ZEND_ARG_TYPE_INFO(0, clip, IS_ARRAY, 0)
 ZEND_END_ARG_INFO()
@@ -555,12 +555,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_imageaffinematrixconcat, 0, 0, 2)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagesetinterpolation, 0, 1, _IS_BOOL, 0)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, method, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_imageresolution, 0, 0, 1)
-       ZEND_ARG_INFO(0, im)
+       ZEND_ARG_OBJ_INFO(0, im, GdImage, 0)
        ZEND_ARG_TYPE_INFO(0, res_x, IS_LONG, 0)
        ZEND_ARG_TYPE_INFO(0, res_y, IS_LONG, 0)
 ZEND_END_ARG_INFO()
diff --git a/ext/gd/gd_ctx.c b/ext/gd/gd_ctx.c
deleted file mode 100644 (file)
index 9bed0d0..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
-   +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
-   +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.php.net/license/3_01.txt                                  |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
-   +----------------------------------------------------------------------+
-   | Authors: Stanislav Malyshev <stas@php.net>                           |
-   +----------------------------------------------------------------------+
- */
-
-#include "php_gd.h"
-
-#define CTX_PUTC(c,ctx) ctx->putC(ctx, c)
-
-static void _php_image_output_putc(struct gdIOCtx *ctx, int c) /* {{{ */
-{
-       /* without the following downcast, the write will fail
-        * (i.e., will write a zero byte) for all
-        * big endian architectures:
-        */
-       unsigned char ch = (unsigned char) c;
-       php_write(&ch, 1);
-} /* }}} */
-
-static int _php_image_output_putbuf(struct gdIOCtx *ctx, const void* buf, int l) /* {{{ */
-{
-       return php_write((void *)buf, l);
-} /* }}} */
-
-static void _php_image_output_ctxfree(struct gdIOCtx *ctx) /* {{{ */
-{
-       if(ctx) {
-               efree(ctx);
-       }
-} /* }}} */
-
-static void _php_image_stream_putc(struct gdIOCtx *ctx, int c) /* {{{ */ {
-       char ch = (char) c;
-       php_stream * stream = (php_stream *)ctx->data;
-       php_stream_write(stream, &ch, 1);
-} /* }}} */
-
-static int _php_image_stream_putbuf(struct gdIOCtx *ctx, const void* buf, int l) /* {{{ */
-{
-       php_stream * stream = (php_stream *)ctx->data;
-       return php_stream_write(stream, (void *)buf, l);
-} /* }}} */
-
-static void _php_image_stream_ctxfree(struct gdIOCtx *ctx) /* {{{ */
-{
-       if(ctx->data) {
-               ctx->data = NULL;
-       }
-       if(ctx) {
-               efree(ctx);
-       }
-} /* }}} */
-
-static void _php_image_stream_ctxfreeandclose(struct gdIOCtx *ctx) /* {{{ */
-{
-
-       if(ctx->data) {
-               php_stream_close((php_stream *) ctx->data);
-               ctx->data = NULL;
-       }
-       if(ctx) {
-               efree(ctx);
-       }
-} /* }}} */
-
-/* {{{ _php_image_output_ctx */
-static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)())
-{
-       zval *imgind;
-       char *file = NULL;
-       size_t file_len = 0;
-       zend_long quality, basefilter;
-       zend_bool compressed = 1;
-       gdImagePtr im;
-       int argc = ZEND_NUM_ARGS();
-       int q = -1, i;
-       int f = -1;
-       gdIOCtx *ctx = NULL;
-       zval *to_zval = NULL;
-       php_stream *stream;
-       int close_stream = 1;
-
-       /* The third (quality) parameter for Wbmp and Xbm stands for the foreground color index when called
-        * from imagey<type>().
-        */
-       switch (image_type) {
-               case PHP_GDIMG_TYPE_XBM:
-                       if (zend_parse_parameters(argc, "rp!|ll", &imgind, &file, &file_len, &quality, &basefilter) == FAILURE) {
-                               return;
-                       }
-                       break;
-               case PHP_GDIMG_TYPE_BMP:
-                       if (zend_parse_parameters(argc, "r|z!b", &imgind, &to_zval, &compressed) == FAILURE) {
-                               return;
-                       }
-                       break;
-               default:
-                       /* PHP_GDIMG_TYPE_GIF
-                        * PHP_GDIMG_TYPE_PNG
-                        * PHP_GDIMG_TYPE_JPG
-                        * PHP_GDIMG_TYPE_WBM
-                        * PHP_GDIMG_TYPE_WEBP
-                        * */
-                       if (zend_parse_parameters(argc, "r|z!ll", &imgind, &to_zval, &quality, &basefilter) == FAILURE) {
-                               return;
-                       }
-       }
-
-       if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(imgind), "Image", phpi_get_le_gd())) == NULL) {
-               return;
-       }
-
-       if (image_type != PHP_GDIMG_TYPE_BMP && argc >= 3) {
-               q = quality; /* or colorindex for foreground of BW images (defaults to black) */
-               if (argc == 4) {
-                       f = basefilter;
-               }
-       }
-
-       if (argc > 1 && to_zval != NULL) {
-               if (Z_TYPE_P(to_zval) == IS_RESOURCE) {
-                       php_stream_from_zval_no_verify(stream, to_zval);
-                       if (stream == NULL) {
-                               RETURN_FALSE;
-                       }
-                       close_stream = 0;
-               } else if (Z_TYPE_P(to_zval) == IS_STRING) {
-                       if (CHECK_ZVAL_NULL_PATH(to_zval)) {
-                               zend_type_error("Invalid 2nd parameter, filename must not contain null bytes");
-                               return;
-                       }
-
-                       stream = php_stream_open_wrapper(Z_STRVAL_P(to_zval), "wb", REPORT_ERRORS|IGNORE_PATH|IGNORE_URL_WIN, NULL);
-                       if (stream == NULL) {
-                               RETURN_FALSE;
-                       }
-               } else {
-                       php_error_docref(NULL, E_WARNING, "Invalid 2nd parameter, it must a filename or a stream");
-                       RETURN_FALSE;
-               }
-       } else if (argc > 1 && file != NULL) {
-               stream = php_stream_open_wrapper(file, "wb", REPORT_ERRORS|IGNORE_PATH|IGNORE_URL_WIN, NULL);
-               if (stream == NULL) {
-                       RETURN_FALSE;
-               }
-       } else {
-               ctx = ecalloc(1, sizeof(gdIOCtx));
-               ctx->putC = _php_image_output_putc;
-               ctx->putBuf = _php_image_output_putbuf;
-               ctx->gd_free = _php_image_output_ctxfree;
-       }
-
-       if (!ctx)       {
-               ctx = ecalloc(1, sizeof(gdIOCtx));
-               ctx->putC = _php_image_stream_putc;
-               ctx->putBuf = _php_image_stream_putbuf;
-               if (close_stream) {
-                       ctx->gd_free = _php_image_stream_ctxfreeandclose;
-               } else {
-                       ctx->gd_free = _php_image_stream_ctxfree;
-               }
-               ctx->data = (void *)stream;
-       }
-
-       switch(image_type) {
-               case PHP_GDIMG_TYPE_JPG:
-                       (*func_p)(im, ctx, q);
-                       break;
-               case PHP_GDIMG_TYPE_WEBP:
-                       if (q == -1) {
-                               q = 80;
-                       }
-                       (*func_p)(im, ctx, q);
-                       break;
-               case PHP_GDIMG_TYPE_PNG:
-                       (*func_p)(im, ctx, q, f);
-                       break;
-               case PHP_GDIMG_TYPE_XBM:
-               case PHP_GDIMG_TYPE_WBM:
-                       if (argc < 3) {
-                               for(i=0; i < gdImageColorsTotal(im); i++) {
-                                       if(!gdImageRed(im, i) && !gdImageGreen(im, i) && !gdImageBlue(im, i)) break;
-                               }
-                               q = i;
-                       }
-                       if (image_type == PHP_GDIMG_TYPE_XBM) {
-                               (*func_p)(im, file ? file : "", q, ctx);
-                       } else {
-                               (*func_p)(im, q, ctx);
-                       }
-                       break;
-               case PHP_GDIMG_TYPE_BMP:
-                       (*func_p)(im, ctx, (int) compressed);
-                       break;
-               default:
-                       (*func_p)(im, ctx);
-                       break;
-       }
-
-       ctx->gd_free(ctx);
-
-       RETURN_TRUE;
-}
-/* }}} */
index 5c590deb77e3b27972b6fd962143e9a7e651b382..351734931acccdb28aec40fe7e9c75bb2cc6f092 100644 (file)
@@ -31,7 +31,9 @@ var_dump(imagecreatefromstring($str2));
 
 echo "Done\n";
 ?>
---EXPECTF--
-resource(%d) of type (gd)
-resource(%d) of type (gd)
+--EXPECT--
+object(GdImage)#2 (0) {
+}
+object(GdImage)#2 (0) {
+}
 Done
index 7dbfb1b40e177f946bea42b2af59451769417ce2..0e13bca9b39571f6636ca734711656124113c420 100644 (file)
@@ -28,8 +28,10 @@ var_dump(imagecrop($img, array("x" => 0x7fffff00, "y" => 0, "width" => 10, "heig
 var_dump(imagecrop($img, array("x" => 0, "y" => 0, "width" => 65535, "height" => 65535)));
 ?>
 --EXPECTF--
-resource(%d) of type (gd)
-resource(%d) of type (gd)
+object(GdImage)#2 (0) {
+}
+object(GdImage)#2 (0) {
+}
 Array
 (
     [x] => a
@@ -39,11 +41,13 @@ Array
 )
 
 Warning: imagecrop(): one parameter to a memory allocation multiplication is negative or zero, failing operation gracefully
- in %sbug66356.php on line %d
+ in %s on line %d
 bool(false)
-resource(%d) of type (gd)
-resource(%d) of type (gd)
+object(GdImage)#2 (0) {
+}
+object(GdImage)#2 (0) {
+}
 
 Warning: imagecrop(): product of memory allocation multiplication would exceed INT_MAX, failing operation gracefully
- in %sbug66356.php on line %d
+ in %s on line %d
 bool(false)
index b4f5c9b78b6b8c4f3556efdfd1f1c1daa2968367..cd10a8ffc03d8b59061d7c9189935e379f6cef11 100644 (file)
@@ -10,4 +10,5 @@ $img = imagerotate(imagecreate(10,10),45,0x7ffffff9);
 var_dump($img);
 ?>
 --EXPECT--
-resource(5) of type (gd)
+object(GdImage)#2 (0) {
+}
index 2211840f581b562017f3a5a37fd086dc48c9c627..c1101c61bf06a35e29f126c013e1c4a902434979 100644 (file)
@@ -9,7 +9,6 @@ if (!extension_loaded('gd')) die('skip gd extension not available');
 $im = imagecreatefromxbm(__DIR__ . DIRECTORY_SEPARATOR . 'bug73968.xbm');
 var_dump($im);
 ?>
-===DONE===
---EXPECTF--
-resource(%d) of type (gd)
-===DONE===
+--EXPECT--
+object(GdImage)#1 (0) {
+}
index 9d11eb3839f2dc50775e1f44ba1ad11863c757da..78f2103247a89b50721a245f76cad33d2b94e98d 100644 (file)
@@ -21,7 +21,6 @@ for ($i = 0; $i < $width; $i += 16) {
     }
 }
 ?>
-===DONE===
---EXPECTF--
-resource(%d) of type (gd)
-===DONE===
+--EXPECT--
+object(GdImage)#1 (0) {
+}
index c89f674b8a0e59396cc92ac2bfb9386380b70d8f..527f26c39704f472981613d8fb6b312961537370 100644 (file)
@@ -10,9 +10,8 @@ memory_limit=2G
 --FILE--
 <?php
 $im = imagecreate(2**28, 1);
-if(is_resource($im)) {
-       imagescale($im, 1, 1, IMG_TRIANGLE);
-}
+imagescale($im, 1, 1, IMG_TRIANGLE);
+
 ?>
 ===DONE===
 --EXPECTF--
index aa76c1470eeef0489e07e5df0841312d97bc5fc6..fbfa8a8026ebd6d8e815d93fc0d4c834fa877a8e 100644 (file)
@@ -9,7 +9,6 @@ if (!GD_BUNDLED && version_compare(GD_VERSION, '2.2.5', '<=')) die('skip upstrea
 <?php
 var_dump(imagecreatefrombmp(__DIR__ . '/bug77391.bmp'));
 ?>
-===DONE===
---EXPECTF--
-resource(%d) of type (gd)
-===DONE===
+--EXPECT--
+object(GdImage)#1 (0) {
+}
diff --git a/ext/gd/tests/gdimage_prevent_cloning.phpt b/ext/gd/tests/gdimage_prevent_cloning.phpt
new file mode 100644 (file)
index 0000000..0f5c198
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Checks that GdImage instances cannot be cloned
+--SKIPIF--
+<?php
+if(!extension_loaded('gd')) {
+    die('skip gd extension is not loaded');
+}
+?>
+--FILE--
+<?php
+
+    $img_src = imagecreatetruecolor(32, 32);
+    $img_dst = clone $img_src;
+
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Trying to clone an uncloneable object of class GdImage in %s:%d
+Stack trace:
+#0 {main}
+  thrown in %s on line %d
diff --git a/ext/gd/tests/gdimage_prevent_serialization.phpt b/ext/gd/tests/gdimage_prevent_serialization.phpt
new file mode 100644 (file)
index 0000000..ef08444
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+GdImage instances must not be serialized
+--SKIPIF--
+<?php
+if(!extension_loaded('gd')) {
+    die('skip gd extension is not loaded');
+}
+?>
+--FILE--
+<?php
+
+    $img_src = imagecreatetruecolor(32, 32);
+    var_dump(serialize($img_src));
+    
+?>
+--EXPECTF--
+Fatal error: Uncaught Exception: Serialization of 'GdImage' is not allowed in %s:%d
+Stack trace:
+#0 %s(%d): serialize(Object(GdImage))
+#1 {main}
+  thrown in %s on line %d
diff --git a/ext/gd/tests/imageantialias_error1.phpt b/ext/gd/tests/imageantialias_error1.phpt
deleted file mode 100644 (file)
index d74a2ad..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-Testing wrong parameter resource in imageantialias() of GD library
---CREDITS--
-Guilherme Blanco <guilhermeblanco [at] hotmail [dot] com>
-#testfest PHPSP on 2009-06-20
---SKIPIF--
-<?php
-if (!extension_loaded("gd")) die("skip GD not present");
-?>
---FILE--
-<?php
-$image = tmpfile();
-
-try {
-    var_dump(imageantialias($image, true));
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-?>
---EXPECT--
-imageantialias(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imagechar_error2.phpt b/ext/gd/tests/imagechar_error2.phpt
deleted file mode 100644 (file)
index a829282..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-Testing error on non-image resource parameter 1 of imagechar() of GD library
---CREDITS--
-Rafael Dohms <rdohms [at] gmail [dot] com>
-#testfest PHPSP on 2009-06-20
---SKIPIF--
-<?php
-       if (!extension_loaded("gd")) die("skip GD not present");
-?>
---FILE--
-<?php
-
-try {
-    $result = imagechar(tmpfile(), 1, 5, 5, 'C', 1);
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-
-?>
---EXPECT--
-imagechar(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imagecharup_error2.phpt b/ext/gd/tests/imagecharup_error2.phpt
deleted file mode 100644 (file)
index f8b0bc4..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-Testing error on non-image resource parameter 1 of imagecharup() of GD library
---CREDITS--
-Rafael Dohms <rdohms [at] gmail [dot] com>
-#testfest PHPSP on 2009-06-20
---SKIPIF--
-<?php
-       if (!extension_loaded("gd")) die("skip GD not present");
-?>
---FILE--
-<?php
-
-try {
-    $result = imagecharup(tmpfile(), 1, 5, 5, 'C', 1);
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-
-?>
---EXPECT--
-imagecharup(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imagecolorallocatealpha_error1.phpt b/ext/gd/tests/imagecolorallocatealpha_error1.phpt
deleted file mode 100644 (file)
index ea490dd..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
---TEST--
-Testing imagecolorallocatealpha(): Wrong types for parameter 1
---CREDITS--
-Rafael Dohms <rdohms [at] gmail [dot] com>
---SKIPIF--
-<?php
-       if (!extension_loaded("gd")) die("skip GD not present");
-?>
---FILE--
-<?php
-$resource = tmpfile();
-try {
-    imagecolorallocatealpha($resource, 255, 255, 255, 50);
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-?>
---EXPECT--
-imagecolorallocatealpha(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imagecolordeallocate_error1.phpt b/ext/gd/tests/imagecolordeallocate_error1.phpt
deleted file mode 100644 (file)
index 3c75055..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
---TEST--
-Testing imagecolordeallocate() of GD library with invalid resource type
---CREDITS--
-Rafael Dohms <rdohms [at] gmail [dot] com>
-#testfest PHPSP on 2009-06-20
---SKIPIF--
-<?php
-       if (!extension_loaded("gd")) die("skip GD not present");
-?>
---FILE--
-<?php
-
-$image = imagecreatetruecolor(180, 30);
-$white = imagecolorallocate($image, 255, 255, 255);
-
-$resource = tmpfile();
-
-try {
-    $result = imagecolordeallocate($resource, $white);
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-
-?>
---EXPECT--
-imagecolordeallocate(): supplied resource is not a valid Image resource
index e9be1ea66a2315c0f3985aff7071c58983bcffe2..f81b52192ad7e2aaf08e9e11478ec063a325c847 100644 (file)
@@ -9,14 +9,17 @@ Rafael Dohms <rdohms [at] gmail [dot] com>
 ?>
 --FILE--
 <?php
+require_once __DIR__ . '/func.inc';
+
 $image = imagecreate(180, 30);
 $white = imagecolorallocate($image, 255, 255, 255);
 
 $totalColors = imagecolorstotal($image);
 
-$result = imagecolordeallocate($image, $totalColors + 100);
-var_dump($result);
+trycatch_dump(
+    fn() => imagecolordeallocate($image, $totalColors + 100)
+);
+
 ?>
---EXPECTF--
-Warning: imagecolordeallocate(): Color index 101 out of range in %s on line %d
-bool(false)
+--EXPECT--
+!! [ValueError] Color index 101 out of range
index 22fc2fa3ef4103ee380740a717dd5ea20e3cb7f5..4d3009dcaef53f690197a7a9a2ac7589f7b32d15 100644 (file)
@@ -9,14 +9,17 @@ Rafael Dohms <rdohms [at] gmail [dot] com>
 ?>
 --FILE--
 <?php
+
+require_once __DIR__ . '/func.inc';
 $image = imagecreate(180, 30);
 $white = imagecolorallocate($image, 255, 255, 255);
 
 $totalColors = imagecolorstotal($image);
 
-$result = imagecolordeallocate($image, -1.0);
-var_dump($result);
+trycatch_dump(
+    fn() => imagecolordeallocate($image, -1.0)
+);
+
 ?>
---EXPECTF--
-Warning: imagecolordeallocate(): Color index -1 out of range in %s on line %d
-bool(false)
+--EXPECT--
+!! [ValueError] Color index -1 out of range
diff --git a/ext/gd/tests/imagecolorstotal_error.phpt b/ext/gd/tests/imagecolorstotal_error.phpt
deleted file mode 100644 (file)
index e05c689..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
---TEST--
-Test imagecolorstotal() function : error conditions - Pass invalid resource type
---SKIPIF--
-<?php
-if(!extension_loaded('gd')) {
-    die('skip gd extension is not loaded');
-}
-if(!function_exists('imagecolorstotal')) {
-    die('skip imagecolorstotal function is not available');
-}
-?>
---FILE--
-<?php
-/* Prototype  : int imagecolorstotal  ( resource $image  )
- * Description: Find out the number of colors in an image's palette
- * Source code: ext/gd/gd.c
- */
-
-echo "*** Testing imagecolorstotal() : error conditions ***\n";
-
-// Get a resource
-$im = fopen(__FILE__, 'r');
-
-echo "\n-- Testing imagecolorstotal() function with a invalid resource\n";
-try {
-    var_dump( imagecolorstotal($im) );
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-
-fclose($im);
-?>
-===DONE===
---EXPECT--
-*** Testing imagecolorstotal() : error conditions ***
-
--- Testing imagecolorstotal() function with a invalid resource
-imagecolorstotal(): supplied resource is not a valid Image resource
-===DONE===
diff --git a/ext/gd/tests/imageellipse_error7.phpt b/ext/gd/tests/imageellipse_error7.phpt
deleted file mode 100644 (file)
index bc78875..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
---TEST--
-Testing wrong param passing imageellipse() of GD library
---CREDITS--
-Ivan Rosolen <contato [at] ivanrosolen [dot] com>
-#testfest PHPSP on 2009-06-20
---SKIPIF--
-<?php
-if (!extension_loaded("gd")) die("skip GD not present");
-?>
---FILE--
-<?php
-
-// Create a resource
-$image = tmpfile();
-
-// try to draw a white ellipse
-try {
-    imageellipse($image, 200, 150, 300, 200, 16777215);
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-?>
---EXPECT--
-imageellipse(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imagefilltoborder_error6.phpt b/ext/gd/tests/imagefilltoborder_error6.phpt
deleted file mode 100644 (file)
index 5a77db7..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
---TEST--
-Testing wrong param passing imagefilltoborder() of GD library
---CREDITS--
-Ivan Rosolen <contato [at] ivanrosolen [dot] com>
-#testfest PHPSP on 2009-06-30
---SKIPIF--
-<?php
-if (!extension_loaded("gd")) die("skip GD not present");
-?>
---FILE--
-<?php
-// Create a image
-$image = imagecreatetruecolor( 100, 100 );
-
-// Draw a rectangle
-imagefilledrectangle( $image, 0, 0, 100, 100, imagecolorallocate( $image, 255, 255, 255 ) );
-
-// Draw an ellipse to fill with a black border
-imageellipse( $image, 50, 50, 50, 50, imagecolorallocate( $image, 0, 0, 0 ) );
-
-// Try to fill border
-$image_foo = tmpfile();
-try {
-    imagefilltoborder( $image_foo, 50, 50, imagecolorallocate( $image, 0, 0, 0 ), imagecolorallocate( $image, 255, 0, 0 ) );
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-
-?>
---EXPECT--
-imagefilltoborder(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imagefilter_error10.phpt b/ext/gd/tests/imagefilter_error10.phpt
deleted file mode 100644 (file)
index 07aecee..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-Testing wrong parameter resource of EMBOSS in imagefilter() of GD library
---CREDITS--
-Guilherme Blanco <guilhermeblanco [at] hotmail [dot] com>
-#testfest PHPSP on 2009-06-20
---SKIPIF--
-<?php
-if (!extension_loaded("gd")) die("skip GD not present");
-?>
---FILE--
-<?php
-$image = tmpfile();
-
-try {
-    var_dump(imagefilter($image, IMG_FILTER_EMBOSS));
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-?>
---EXPECT--
-imagefilter(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imagegammacorrect_error2.phpt b/ext/gd/tests/imagegammacorrect_error2.phpt
deleted file mode 100644 (file)
index 013dd67..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-Testing error with non-Image resource paramenter of imagegammacorrect() of GD library,
---CREDITS--
-Rafael Dohms <rdohms [at] gmail [dot] com>
-#testfest PHPSP on 2009-06-20
---SKIPIF--
-<?php
-       if (!extension_loaded("gd")) die("skip GD not present");
-?>
---FILE--
-<?php
-$image = tmpfile();
-try {
-    $gamma = imagegammacorrect($image, 1, 5);
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-
-?>
---EXPECT--
-imagegammacorrect(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imageinterlace_error2.phpt b/ext/gd/tests/imageinterlace_error2.phpt
deleted file mode 100644 (file)
index e906c61..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
---TEST--
-Testing resource that is not a image to imageinterlace() of GD library
---CREDITS--
-Edgar Ferreira da Silva <contato [at] edgarfs [dot] com [dot] br>
-#testfest PHPSP on 2009-06-20
---SKIPIF--
-<?php
-if (!extension_loaded("gd")) die("skip GD not present");
-?>
---FILE--
-<?php
-$image = fopen('php://stdin', 'r');
-try {
-    var_dump(imageinterlace($image));
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-?>
---EXPECT--
-imageinterlace(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imageistruecolor_error1.phpt b/ext/gd/tests/imageistruecolor_error1.phpt
deleted file mode 100644 (file)
index b99dd93..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
---TEST--
-Testing imageistruecolor(): wrong parameters
---CREDITS--
-Rafael Dohms <rdohms [at] gmail [dot] com>
---SKIPIF--
-<?php
-       if (!extension_loaded("gd")) die("skip GD not present");
-       if (!function_exists("imagecreatetruecolor")) die("skip GD Version not compatible");
-?>
---FILE--
-<?php
-$resource = tmpfile();
-try {
-    imageistruecolor($resource);
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-?>
---EXPECT--
-imageistruecolor(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imagelayereffect_error3.phpt b/ext/gd/tests/imagelayereffect_error3.phpt
deleted file mode 100644 (file)
index c3b793c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-Testing imagelayereffect() with invalid resource of GD library
---CREDITS--
-Rafael Dohms <rdohms [at] gmail [dot] com>
-#testfest PHPSP on 2009-06-20
---SKIPIF--
-<?php
-       if (!extension_loaded("gd")) die("skip GD not present");
-       if (!GD_BUNDLED) die('skip function only available in bundled, external GD detected');
-?>
---FILE--
-<?php
-$resource = tmpfile();
-try {
-    $layer = imagelayereffect($resource, IMG_EFFECT_REPLACE);
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-?>
---EXPECT--
-imagelayereffect(): supplied resource is not a valid Image resource
index 63a2b51e77d629be6da25f360f8908adab484d35..89fb514a5f4303e1b7919f76e2bc5d1bf39af29a 100644 (file)
@@ -9,7 +9,7 @@ Carlos AndrĂ© Ferrari <caferrari [at] gmail [dot] com>
 --FILE--
 <?php
 $im = imagecreate(100, 100);
-var_dump(is_resource($im));
+var_dump($im instanceof GdImage);
 var_dump(imageistruecolor($im));
 var_dump(imagepalettetotruecolor($im));
 var_dump(imageistruecolor($im));
diff --git a/ext/gd/tests/imagepalettetotruecolor_error3.phpt b/ext/gd/tests/imagepalettetotruecolor_error3.phpt
deleted file mode 100644 (file)
index 09a7d9a..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
---TEST--
-imagepalettetotruecollor must return an error if not an image resource is given
---CREDITS--
-Carlos AndrĂ© Ferrari <caferrari [at] gmail [dot] com>
---SKIPIF--
-<?php
-    if (!extension_loaded('gd')) die("skip gd extension not available.");
-?>
---FILE--
-<?php
-$im = fopen('php://memory', 'w');
-try {
-    imagepalettetotruecolor($im);
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-?>
---EXPECT--
-imagepalettetotruecolor(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imagerectangle_error2.phpt b/ext/gd/tests/imagerectangle_error2.phpt
deleted file mode 100644 (file)
index fdc4678..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
---TEST--
-Testing wrong param passing imagerectangle() of GD library
---CREDITS--
-Ivan Rosolen <contato [at] ivanrosolen [dot] com>
-#testfest PHPSP on 2009-06-30
---SKIPIF--
-<?php
-if ( ! extension_loaded('gd') ) die( 'skip GD not present; skipping test' );
-?>
---FILE--
-<?php
-// Create a resource
-$image = tmpfile();
-
-// Draw a rectangle
-try {
-    imagerectangle( $image, 0, 0, 50, 50, 2 );
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-?>
---EXPECT--
-imagerectangle(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imagesetthickness_error1.phpt b/ext/gd/tests/imagesetthickness_error1.phpt
deleted file mode 100644 (file)
index a9ee7f9..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
---TEST--
-Testing imagetruecolortopalette(): wrong types for first parameter
---CREDITS--
-Rafael Dohms <rdohms [at] gmail [dot] com>
---SKIPIF--
-<?php
-       if (!extension_loaded("gd")) die("skip GD not present");
-?>
---FILE--
-<?php
-$resource = tmpfile();
-try {
-    imagesetthickness($resource, 5);
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-?>
---EXPECT--
-imagesetthickness(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imagestring_error2.phpt b/ext/gd/tests/imagestring_error2.phpt
deleted file mode 100644 (file)
index ff9032a..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-Testing error on non-image resource parameter 1 of imagestring() of GD library
---CREDITS--
-Rafael Dohms <rdohms [at] gmail [dot] com>
-#testfest PHPSP on 2009-06-20
---SKIPIF--
-<?php
-       if (!extension_loaded("gd")) die("skip GD not present");
-?>
---FILE--
-<?php
-
-try {
-    $result = imagestring(tmpfile(), 1, 5, 5, 'String', 1);
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-
-?>
---EXPECT--
-imagestring(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imagestringup_error2.phpt b/ext/gd/tests/imagestringup_error2.phpt
deleted file mode 100644 (file)
index c09792c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-Testing error on non-image resource parameter 1 of imagestringup() of GD library
---CREDITS--
-Rafael Dohms <rdohms [at] gmail [dot] com>
-#testfest PHPSP on 2009-06-20
---SKIPIF--
-<?php
-       if (!extension_loaded("gd")) die("skip GD not present");
-?>
---FILE--
-<?php
-
-try {
-    $result = imagestringup(tmpfile(), 1, 5, 5, 'String', 1);
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-
-?>
---EXPECT--
-imagestringup(): supplied resource is not a valid Image resource
diff --git a/ext/gd/tests/imagetruecolortopalette_error1.phpt b/ext/gd/tests/imagetruecolortopalette_error1.phpt
deleted file mode 100644 (file)
index dcdcfae..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
---TEST--
-Testing imagetruecolortopalette(): wrong parameters for parameter 1
---CREDITS--
-Rafael Dohms <rdohms [at] gmail [dot] com>
---SKIPIF--
-<?php
-       if (!extension_loaded("gd")) die("skip GD not present");
-       if (!function_exists("imagecreatetruecolor")) die("skip GD Version not compatible");
-?>
---FILE--
-<?php
-$resource = tmpfile();
-try {
-    imagetruecolortopalette($resource, true, 2);
-} catch (TypeError $e) {
-    echo $e->getMessage(), "\n";
-}
-?>
---EXPECT--
-imagetruecolortopalette(): supplied resource is not a valid Image resource
index 6dcb1d324de22a45effd436c6c81191778e30c3b..4ff7aaf3fe2f70e88645ded534500a7b57f89533 100644 (file)
@@ -3,6 +3,7 @@ Test posix_ttyname() with wrong parameters
 --DESCRIPTION--
 Gets the absolute path to the current terminal device that is open on a given file descriptor.
 Source code: ext/posix/posix.c
+
 --CREDITS--
 Falko Menge, mail at falko-menge dot de
 PHP Testfest Berlin 2009-05-10
@@ -11,18 +12,16 @@ PHP Testfest Berlin 2009-05-10
        if (!extension_loaded('posix')) {
         die('SKIP - POSIX extension not available');
     }
-       if (!extension_loaded('gd')) {
-        die('SKIP - GD extension not available');
-    }
-    if (!function_exists('imagecreate')) {
-        die('SKIP - Function imagecreate() not available');
+    
+    if (!function_exists('curl_init')) {
+        die('SKIP - Function curl_init() not available');
     }
 ?>
 --FILE--
 <?php
 var_dump(posix_ttyname(0)); // param not a ressource
 try {
-    var_dump(posix_ttyname(imagecreate(1, 1))); // wrong resource type
+    var_dump(posix_ttyname(curl_init())); // wrong resource type
 } catch (TypeError $e) {
     echo $e->getMessage(), "\n";
 }