Annotation of embedaddon/php/ext/gd/gd.c, revision 1.1

1.1     ! misho       1: /*
        !             2:    +----------------------------------------------------------------------+
        !             3:    | PHP Version 5                                                        |
        !             4:    +----------------------------------------------------------------------+
        !             5:    | Copyright (c) 1997-2012 The PHP Group                                |
        !             6:    +----------------------------------------------------------------------+
        !             7:    | This source file is subject to version 3.01 of the PHP license,      |
        !             8:    | that is bundled with this package in the file LICENSE, and is        |
        !             9:    | available through the world-wide-web at the following url:           |
        !            10:    | http://www.php.net/license/3_01.txt                                  |
        !            11:    | If you did not receive a copy of the PHP license and are unable to   |
        !            12:    | obtain it through the world-wide-web, please send a note to          |
        !            13:    | license@php.net so we can mail you a copy immediately.               |
        !            14:    +----------------------------------------------------------------------+
        !            15:    | Authors: Rasmus Lerdorf <rasmus@php.net>                             |
        !            16:    |          Stig Bakken <ssb@php.net>                                   |
        !            17:    |          Jim Winstead <jimw@php.net>                                 |
        !            18:    +----------------------------------------------------------------------+
        !            19:  */
        !            20: 
        !            21: /* $Id: gd.c 321634 2012-01-01 13:15:04Z felipe $ */
        !            22: 
        !            23: /* gd 1.2 is copyright 1994, 1995, Quest Protein Database Center,
        !            24:    Cold Spring Harbor Labs. */
        !            25: 
        !            26: /* Note that there is no code from the gd package in this file */
        !            27: 
        !            28: #ifdef HAVE_CONFIG_H
        !            29: #include "config.h"
        !            30: #endif
        !            31: 
        !            32: #include "php.h"
        !            33: #include "php_ini.h"
        !            34: #include "ext/standard/head.h"
        !            35: #include <math.h>
        !            36: #include "SAPI.h"
        !            37: #include "php_gd.h"
        !            38: #include "ext/standard/info.h"
        !            39: #include "php_open_temporary_file.h"
        !            40: 
        !            41: 
        !            42: #if HAVE_SYS_WAIT_H
        !            43: # include <sys/wait.h>
        !            44: #endif
        !            45: #if HAVE_UNISTD_H
        !            46: # include <unistd.h>
        !            47: #endif
        !            48: #ifdef PHP_WIN32
        !            49: # include <io.h>
        !            50: # include <fcntl.h>
        !            51: # include <windows.h>
        !            52: # include <Winuser.h>
        !            53: # include <Wingdi.h>
        !            54: #endif
        !            55: 
        !            56: #if HAVE_LIBGD
        !            57: #if !HAVE_GD_BUNDLED
        !            58: # include "libgd/gd_compat.h"
        !            59: #endif
        !            60: 
        !            61: 
        !            62: static int le_gd, le_gd_font;
        !            63: #if HAVE_LIBT1
        !            64: #include <t1lib.h>
        !            65: static int le_ps_font, le_ps_enc;
        !            66: static void php_free_ps_font(zend_rsrc_list_entry *rsrc TSRMLS_DC);
        !            67: static void php_free_ps_enc(zend_rsrc_list_entry *rsrc TSRMLS_DC);
        !            68: #endif
        !            69: 
        !            70: #include <gd.h>
        !            71: #include <gdfontt.h>  /* 1 Tiny font */
        !            72: #include <gdfonts.h>  /* 2 Small font */
        !            73: #include <gdfontmb.h> /* 3 Medium bold font */
        !            74: #include <gdfontl.h>  /* 4 Large font */
        !            75: #include <gdfontg.h>  /* 5 Giant font */
        !            76: 
        !            77: #ifdef HAVE_GD_WBMP
        !            78: #include "libgd/wbmp.h"
        !            79: #endif
        !            80: #ifdef ENABLE_GD_TTF
        !            81: # ifdef HAVE_LIBFREETYPE
        !            82: #  include <ft2build.h>
        !            83: #  include FT_FREETYPE_H
        !            84: # endif
        !            85: #endif
        !            86: 
        !            87: #ifndef M_PI
        !            88: #define M_PI 3.14159265358979323846
        !            89: #endif
        !            90: 
        !            91: #ifdef ENABLE_GD_TTF
        !            92: static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int, int);
        !            93: #endif
        !            94: 
        !            95: #if HAVE_LIBGD15
        !            96: /* it's >= 1.5, i.e. has IOCtx */
        !            97: #define USE_GD_IOCTX 1
        !            98: #else
        !            99: #undef USE_GD_IOCTX
        !           100: #endif
        !           101: 
        !           102: #ifdef USE_GD_IOCTX
        !           103: #include "gd_ctx.c"
        !           104: #else
        !           105: #define gdImageCreateFromGdCtx      NULL
        !           106: #define gdImageCreateFromGd2Ctx     NULL
        !           107: #define gdImageCreateFromGd2partCtx NULL
        !           108: #define gdImageCreateFromGifCtx     NULL
        !           109: #define gdImageCreateFromJpegCtx    NULL
        !           110: #define gdImageCreateFromPngCtx     NULL
        !           111: #define gdImageCreateFromWBMPCtx    NULL
        !           112: typedef FILE gdIOCtx;
        !           113: #define CTX_PUTC(c, fp) fputc(c, fp)
        !           114: #endif
        !           115: 
        !           116: #ifndef HAVE_GDIMAGECOLORRESOLVE
        !           117: extern int gdImageColorResolve(gdImagePtr, int, int, int);
        !           118: #endif
        !           119: 
        !           120: #if HAVE_COLORCLOSESTHWB
        !           121: int gdImageColorClosestHWB(gdImagePtr im, int r, int g, int b);
        !           122: #endif
        !           123: 
        !           124: #ifndef HAVE_GD_DYNAMIC_CTX_EX
        !           125: #define gdNewDynamicCtxEx(len, data, val) gdNewDynamicCtx(len, data)
        !           126: #endif
        !           127: 
        !           128: /* Section Filters Declarations */
        !           129: /* IMPORTANT NOTE FOR NEW FILTER
        !           130:  * Do not forget to update:
        !           131:  * IMAGE_FILTER_MAX: define the last filter index
        !           132:  * IMAGE_FILTER_MAX_ARGS: define the biggest amout of arguments
        !           133:  * image_filter array in PHP_FUNCTION(imagefilter)
        !           134:  * */
        !           135: #define IMAGE_FILTER_NEGATE         0
        !           136: #define IMAGE_FILTER_GRAYSCALE      1
        !           137: #define IMAGE_FILTER_BRIGHTNESS     2
        !           138: #define IMAGE_FILTER_CONTRAST       3
        !           139: #define IMAGE_FILTER_COLORIZE       4
        !           140: #define IMAGE_FILTER_EDGEDETECT     5
        !           141: #define IMAGE_FILTER_EMBOSS         6
        !           142: #define IMAGE_FILTER_GAUSSIAN_BLUR  7
        !           143: #define IMAGE_FILTER_SELECTIVE_BLUR 8
        !           144: #define IMAGE_FILTER_MEAN_REMOVAL   9
        !           145: #define IMAGE_FILTER_SMOOTH         10
        !           146: #define IMAGE_FILTER_PIXELATE       11
        !           147: #define IMAGE_FILTER_MAX            11
        !           148: #define IMAGE_FILTER_MAX_ARGS       6
        !           149: static void php_image_filter_negate(INTERNAL_FUNCTION_PARAMETERS);
        !           150: static void php_image_filter_grayscale(INTERNAL_FUNCTION_PARAMETERS);
        !           151: static void php_image_filter_brightness(INTERNAL_FUNCTION_PARAMETERS);
        !           152: static void php_image_filter_contrast(INTERNAL_FUNCTION_PARAMETERS);
        !           153: static void php_image_filter_colorize(INTERNAL_FUNCTION_PARAMETERS);
        !           154: static void php_image_filter_edgedetect(INTERNAL_FUNCTION_PARAMETERS);
        !           155: static void php_image_filter_emboss(INTERNAL_FUNCTION_PARAMETERS);
        !           156: static void php_image_filter_gaussian_blur(INTERNAL_FUNCTION_PARAMETERS);
        !           157: static void php_image_filter_selective_blur(INTERNAL_FUNCTION_PARAMETERS);
        !           158: static void php_image_filter_mean_removal(INTERNAL_FUNCTION_PARAMETERS);
        !           159: static void php_image_filter_smooth(INTERNAL_FUNCTION_PARAMETERS);
        !           160: static void php_image_filter_pixelate(INTERNAL_FUNCTION_PARAMETERS);
        !           161: 
        !           162: /* End Section filters declarations */
        !           163: static gdImagePtr _php_image_create_from_string (zval **Data, char *tn, gdImagePtr (*ioctx_func_p)() TSRMLS_DC);
        !           164: static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(), gdImagePtr (*ioctx_func_p)());
        !           165: static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)());
        !           166: static int _php_image_type(char data[8]);
        !           167: static void _php_image_convert(INTERNAL_FUNCTION_PARAMETERS, int image_type);
        !           168: static void _php_image_bw_convert(gdImagePtr im_org, gdIOCtx *out, int threshold);
        !           169: 
        !           170: /* {{{ arginfo */
        !           171: ZEND_BEGIN_ARG_INFO(arginfo_gd_info, 0)
        !           172: ZEND_END_ARG_INFO()
        !           173: 
        !           174: ZEND_BEGIN_ARG_INFO(arginfo_imageloadfont, 0)
        !           175:        ZEND_ARG_INFO(0, filename)
        !           176: ZEND_END_ARG_INFO()
        !           177: 
        !           178: ZEND_BEGIN_ARG_INFO(arginfo_imagesetstyle, 0)
        !           179:        ZEND_ARG_INFO(0, im)
        !           180:        ZEND_ARG_INFO(0, styles) /* ARRAY_INFO(0, styles, 0) */
        !           181: ZEND_END_ARG_INFO()
        !           182: 
        !           183: ZEND_BEGIN_ARG_INFO(arginfo_imagecreatetruecolor, 0)
        !           184:        ZEND_ARG_INFO(0, x_size)
        !           185:        ZEND_ARG_INFO(0, y_size)
        !           186: ZEND_END_ARG_INFO()
        !           187: 
        !           188: ZEND_BEGIN_ARG_INFO(arginfo_imageistruecolor, 0)
        !           189:        ZEND_ARG_INFO(0, im)
        !           190: ZEND_END_ARG_INFO()
        !           191: 
        !           192: ZEND_BEGIN_ARG_INFO(arginfo_imagetruecolortopalette, 0)
        !           193:        ZEND_ARG_INFO(0, im)
        !           194:        ZEND_ARG_INFO(0, ditherFlag)
        !           195:        ZEND_ARG_INFO(0, colorsWanted)
        !           196: ZEND_END_ARG_INFO()
        !           197: 
        !           198: ZEND_BEGIN_ARG_INFO(arginfo_imagecolormatch, 0)
        !           199:        ZEND_ARG_INFO(0, im1)
        !           200:        ZEND_ARG_INFO(0, im2)
        !           201: ZEND_END_ARG_INFO()
        !           202: 
        !           203: ZEND_BEGIN_ARG_INFO(arginfo_imagesetthickness, 0)
        !           204:        ZEND_ARG_INFO(0, im)
        !           205:        ZEND_ARG_INFO(0, thickness)
        !           206: ZEND_END_ARG_INFO()
        !           207: 
        !           208: ZEND_BEGIN_ARG_INFO(arginfo_imagefilledellipse, 0)
        !           209:        ZEND_ARG_INFO(0, im)
        !           210:        ZEND_ARG_INFO(0, cx)
        !           211:        ZEND_ARG_INFO(0, cy)
        !           212:        ZEND_ARG_INFO(0, w)
        !           213:        ZEND_ARG_INFO(0, h)
        !           214:        ZEND_ARG_INFO(0, color)
        !           215: ZEND_END_ARG_INFO()
        !           216: 
        !           217: ZEND_BEGIN_ARG_INFO(arginfo_imagefilledarc, 0)
        !           218:        ZEND_ARG_INFO(0, im)
        !           219:        ZEND_ARG_INFO(0, cx)
        !           220:        ZEND_ARG_INFO(0, cy)
        !           221:        ZEND_ARG_INFO(0, w)
        !           222:        ZEND_ARG_INFO(0, h)
        !           223:        ZEND_ARG_INFO(0, s)
        !           224:        ZEND_ARG_INFO(0, e)
        !           225:        ZEND_ARG_INFO(0, col)
        !           226:        ZEND_ARG_INFO(0, style)
        !           227: ZEND_END_ARG_INFO()
        !           228: 
        !           229: ZEND_BEGIN_ARG_INFO(arginfo_imagealphablending, 0)
        !           230:        ZEND_ARG_INFO(0, im)
        !           231:        ZEND_ARG_INFO(0, blend)
        !           232: ZEND_END_ARG_INFO()
        !           233: 
        !           234: ZEND_BEGIN_ARG_INFO(arginfo_imagesavealpha, 0)
        !           235:        ZEND_ARG_INFO(0, im)
        !           236:        ZEND_ARG_INFO(0, save)
        !           237: ZEND_END_ARG_INFO()
        !           238: 
        !           239: #if HAVE_GD_BUNDLED
        !           240: ZEND_BEGIN_ARG_INFO(arginfo_imagelayereffect, 0)
        !           241:        ZEND_ARG_INFO(0, im)
        !           242:        ZEND_ARG_INFO(0, effect)
        !           243: ZEND_END_ARG_INFO()
        !           244: #endif
        !           245: 
        !           246: ZEND_BEGIN_ARG_INFO(arginfo_imagecolorallocatealpha, 0)
        !           247:        ZEND_ARG_INFO(0, im)
        !           248:        ZEND_ARG_INFO(0, red)
        !           249:        ZEND_ARG_INFO(0, green)
        !           250:        ZEND_ARG_INFO(0, blue)
        !           251:        ZEND_ARG_INFO(0, alpha)
        !           252: ZEND_END_ARG_INFO()
        !           253: 
        !           254: ZEND_BEGIN_ARG_INFO(arginfo_imagecolorresolvealpha, 0)
        !           255:        ZEND_ARG_INFO(0, im)
        !           256:        ZEND_ARG_INFO(0, red)
        !           257:        ZEND_ARG_INFO(0, green)
        !           258:        ZEND_ARG_INFO(0, blue)
        !           259:        ZEND_ARG_INFO(0, alpha)
        !           260: ZEND_END_ARG_INFO()
        !           261: 
        !           262: ZEND_BEGIN_ARG_INFO(arginfo_imagecolorclosestalpha, 0)
        !           263:        ZEND_ARG_INFO(0, im)
        !           264:        ZEND_ARG_INFO(0, red)
        !           265:        ZEND_ARG_INFO(0, green)
        !           266:        ZEND_ARG_INFO(0, blue)
        !           267:        ZEND_ARG_INFO(0, alpha)
        !           268: ZEND_END_ARG_INFO()
        !           269: 
        !           270: ZEND_BEGIN_ARG_INFO(arginfo_imagecolorexactalpha, 0)
        !           271:        ZEND_ARG_INFO(0, im)
        !           272:        ZEND_ARG_INFO(0, red)
        !           273:        ZEND_ARG_INFO(0, green)
        !           274:        ZEND_ARG_INFO(0, blue)
        !           275:        ZEND_ARG_INFO(0, alpha)
        !           276: ZEND_END_ARG_INFO()
        !           277: 
        !           278: ZEND_BEGIN_ARG_INFO(arginfo_imagecopyresampled, 0)
        !           279:        ZEND_ARG_INFO(0, dst_im)
        !           280:        ZEND_ARG_INFO(0, src_im)
        !           281:        ZEND_ARG_INFO(0, dst_x)
        !           282:        ZEND_ARG_INFO(0, dst_y)
        !           283:        ZEND_ARG_INFO(0, src_x)
        !           284:        ZEND_ARG_INFO(0, src_y)
        !           285:        ZEND_ARG_INFO(0, dst_w)
        !           286:        ZEND_ARG_INFO(0, dst_h)
        !           287:        ZEND_ARG_INFO(0, src_w)
        !           288:        ZEND_ARG_INFO(0, src_h)
        !           289: ZEND_END_ARG_INFO()
        !           290: 
        !           291: #ifdef PHP_WIN32
        !           292: ZEND_BEGIN_ARG_INFO_EX(arginfo_imagegrabwindow, 0, 0, 1)
        !           293:        ZEND_ARG_INFO(0, handle)
        !           294:        ZEND_ARG_INFO(0, client_area)
        !           295: ZEND_END_ARG_INFO()
        !           296: 
        !           297: ZEND_BEGIN_ARG_INFO(arginfo_imagegrabscreen, 0)
        !           298: ZEND_END_ARG_INFO()
        !           299: #endif
        !           300: 
        !           301: ZEND_BEGIN_ARG_INFO_EX(arginfo_imagerotate, 0, 0, 3)
        !           302:        ZEND_ARG_INFO(0, im)
        !           303:        ZEND_ARG_INFO(0, angle)
        !           304:        ZEND_ARG_INFO(0, bgdcolor)
        !           305:        ZEND_ARG_INFO(0, ignoretransparent)
        !           306: ZEND_END_ARG_INFO()
        !           307: 
        !           308: #if HAVE_GD_IMAGESETTILE
        !           309: ZEND_BEGIN_ARG_INFO(arginfo_imagesettile, 0)
        !           310:        ZEND_ARG_INFO(0, im)
        !           311:        ZEND_ARG_INFO(0, tile)
        !           312: ZEND_END_ARG_INFO()
        !           313: #endif
        !           314: 
        !           315: #if HAVE_GD_IMAGESETBRUSH
        !           316: ZEND_BEGIN_ARG_INFO(arginfo_imagesetbrush, 0)
        !           317:        ZEND_ARG_INFO(0, im)
        !           318:        ZEND_ARG_INFO(0, brush)
        !           319: ZEND_END_ARG_INFO()
        !           320: #endif
        !           321: 
        !           322: ZEND_BEGIN_ARG_INFO(arginfo_imagecreate, 0)
        !           323:        ZEND_ARG_INFO(0, x_size)
        !           324:        ZEND_ARG_INFO(0, y_size)
        !           325: ZEND_END_ARG_INFO()
        !           326: 
        !           327: ZEND_BEGIN_ARG_INFO(arginfo_imagetypes, 0)
        !           328: ZEND_END_ARG_INFO()
        !           329: 
        !           330: #if HAVE_LIBGD15
        !           331: ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromstring, 0)
        !           332:        ZEND_ARG_INFO(0, image)
        !           333: ZEND_END_ARG_INFO()
        !           334: #endif
        !           335: 
        !           336: #ifdef HAVE_GD_GIF_READ
        !           337: ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromgif, 0)
        !           338:        ZEND_ARG_INFO(0, filename)
        !           339: ZEND_END_ARG_INFO()
        !           340: #endif
        !           341: 
        !           342: #ifdef HAVE_GD_JPG
        !           343: ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromjpeg, 0)
        !           344:        ZEND_ARG_INFO(0, filename)
        !           345: ZEND_END_ARG_INFO()
        !           346: #endif
        !           347: 
        !           348: #ifdef HAVE_GD_PNG
        !           349: ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefrompng, 0)
        !           350:        ZEND_ARG_INFO(0, filename)
        !           351: ZEND_END_ARG_INFO()
        !           352: #endif
        !           353: 
        !           354: #ifdef HAVE_GD_XBM
        !           355: ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromxbm, 0)
        !           356:        ZEND_ARG_INFO(0, filename)
        !           357: ZEND_END_ARG_INFO()
        !           358: #endif
        !           359: 
        !           360: #if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED)
        !           361: ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromxpm, 0)
        !           362:        ZEND_ARG_INFO(0, filename)
        !           363: ZEND_END_ARG_INFO()
        !           364: #endif
        !           365: 
        !           366: #ifdef HAVE_GD_WBMP
        !           367: ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromwbmp, 0)
        !           368:        ZEND_ARG_INFO(0, filename)
        !           369: ZEND_END_ARG_INFO()
        !           370: #endif
        !           371: 
        !           372: ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromgd, 0)
        !           373:        ZEND_ARG_INFO(0, filename)
        !           374: ZEND_END_ARG_INFO()
        !           375: 
        !           376: #ifdef HAVE_GD_GD2
        !           377: ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromgd2, 0)
        !           378:        ZEND_ARG_INFO(0, filename)
        !           379: ZEND_END_ARG_INFO()
        !           380: 
        !           381: ZEND_BEGIN_ARG_INFO(arginfo_imagecreatefromgd2part, 0)
        !           382:        ZEND_ARG_INFO(0, filename)
        !           383:        ZEND_ARG_INFO(0, srcX)
        !           384:        ZEND_ARG_INFO(0, srcY)
        !           385:        ZEND_ARG_INFO(0, width)
        !           386:        ZEND_ARG_INFO(0, height)
        !           387: ZEND_END_ARG_INFO()
        !           388: #endif
        !           389: 
        !           390: #if HAVE_GD_BUNDLED
        !           391: ZEND_BEGIN_ARG_INFO_EX(arginfo_imagexbm, 0, 0, 2)
        !           392:        ZEND_ARG_INFO(0, im)
        !           393:        ZEND_ARG_INFO(0, filename)
        !           394:        ZEND_ARG_INFO(0, foreground)
        !           395: ZEND_END_ARG_INFO()
        !           396: #endif
        !           397: 
        !           398: #ifdef HAVE_GD_GIF_CREATE
        !           399: ZEND_BEGIN_ARG_INFO_EX(arginfo_imagegif, 0, 0, 1)
        !           400:        ZEND_ARG_INFO(0, im)
        !           401:        ZEND_ARG_INFO(0, filename)
        !           402: ZEND_END_ARG_INFO()
        !           403: #endif
        !           404: 
        !           405: #ifdef HAVE_GD_PNG
        !           406: ZEND_BEGIN_ARG_INFO_EX(arginfo_imagepng, 0, 0, 1)
        !           407:        ZEND_ARG_INFO(0, im)
        !           408:        ZEND_ARG_INFO(0, filename)
        !           409: ZEND_END_ARG_INFO()
        !           410: #endif
        !           411: 
        !           412: #ifdef HAVE_GD_JPG
        !           413: ZEND_BEGIN_ARG_INFO_EX(arginfo_imagejpeg, 0, 0, 1)
        !           414:        ZEND_ARG_INFO(0, im)
        !           415:        ZEND_ARG_INFO(0, filename)
        !           416:        ZEND_ARG_INFO(0, quality)
        !           417: ZEND_END_ARG_INFO()
        !           418: #endif
        !           419: 
        !           420: #ifdef HAVE_GD_WBMP
        !           421: ZEND_BEGIN_ARG_INFO_EX(arginfo_imagewbmp, 0, 0, 1)
        !           422:        ZEND_ARG_INFO(0, im)
        !           423:        ZEND_ARG_INFO(0, filename)
        !           424:        ZEND_ARG_INFO(0, foreground)
        !           425: ZEND_END_ARG_INFO()
        !           426: #endif
        !           427: 
        !           428: ZEND_BEGIN_ARG_INFO_EX(arginfo_imagegd, 0, 0, 1)
        !           429:        ZEND_ARG_INFO(0, im)
        !           430:        ZEND_ARG_INFO(0, filename)
        !           431: ZEND_END_ARG_INFO()
        !           432: 
        !           433: #ifdef HAVE_GD_GD2
        !           434: ZEND_BEGIN_ARG_INFO_EX(arginfo_imagegd2, 0, 0, 1)
        !           435:        ZEND_ARG_INFO(0, im)
        !           436:        ZEND_ARG_INFO(0, filename)
        !           437:        ZEND_ARG_INFO(0, chunk_size)
        !           438:        ZEND_ARG_INFO(0, type)
        !           439: ZEND_END_ARG_INFO()
        !           440: #endif
        !           441: 
        !           442: ZEND_BEGIN_ARG_INFO(arginfo_imagedestroy, 0)
        !           443:        ZEND_ARG_INFO(0, im)
        !           444: ZEND_END_ARG_INFO()
        !           445: 
        !           446: ZEND_BEGIN_ARG_INFO(arginfo_imagecolorallocate, 0)
        !           447:        ZEND_ARG_INFO(0, im)
        !           448:        ZEND_ARG_INFO(0, red)
        !           449:        ZEND_ARG_INFO(0, green)
        !           450:        ZEND_ARG_INFO(0, blue)
        !           451: ZEND_END_ARG_INFO()
        !           452: 
        !           453: #if HAVE_LIBGD15
        !           454: ZEND_BEGIN_ARG_INFO(arginfo_imagepalettecopy, 0)
        !           455:        ZEND_ARG_INFO(0, dst)
        !           456:        ZEND_ARG_INFO(0, src)
        !           457: ZEND_END_ARG_INFO()
        !           458: #endif
        !           459: 
        !           460: ZEND_BEGIN_ARG_INFO(arginfo_imagecolorat, 0)
        !           461:        ZEND_ARG_INFO(0, im)
        !           462:        ZEND_ARG_INFO(0, x)
        !           463:        ZEND_ARG_INFO(0, y)
        !           464: ZEND_END_ARG_INFO()
        !           465: 
        !           466: ZEND_BEGIN_ARG_INFO(arginfo_imagecolorclosest, 0)
        !           467:        ZEND_ARG_INFO(0, im)
        !           468:        ZEND_ARG_INFO(0, red)
        !           469:        ZEND_ARG_INFO(0, green)
        !           470:        ZEND_ARG_INFO(0, blue)
        !           471: ZEND_END_ARG_INFO()
        !           472: 
        !           473: #if HAVE_COLORCLOSESTHWB
        !           474: ZEND_BEGIN_ARG_INFO(arginfo_imagecolorclosesthwb, 0)
        !           475:        ZEND_ARG_INFO(0, im)
        !           476:        ZEND_ARG_INFO(0, red)
        !           477:        ZEND_ARG_INFO(0, green)
        !           478:        ZEND_ARG_INFO(0, blue)
        !           479: ZEND_END_ARG_INFO()
        !           480: #endif
        !           481: 
        !           482: ZEND_BEGIN_ARG_INFO(arginfo_imagecolordeallocate, 0)
        !           483:        ZEND_ARG_INFO(0, im)
        !           484:        ZEND_ARG_INFO(0, index)
        !           485: ZEND_END_ARG_INFO()
        !           486: 
        !           487: ZEND_BEGIN_ARG_INFO(arginfo_imagecolorresolve, 0)
        !           488:        ZEND_ARG_INFO(0, im)
        !           489:        ZEND_ARG_INFO(0, red)
        !           490:        ZEND_ARG_INFO(0, green)
        !           491:        ZEND_ARG_INFO(0, blue)
        !           492: ZEND_END_ARG_INFO()
        !           493: 
        !           494: ZEND_BEGIN_ARG_INFO(arginfo_imagecolorexact, 0)
        !           495:        ZEND_ARG_INFO(0, im)
        !           496:        ZEND_ARG_INFO(0, red)
        !           497:        ZEND_ARG_INFO(0, green)
        !           498:        ZEND_ARG_INFO(0, blue)
        !           499: ZEND_END_ARG_INFO()
        !           500: 
        !           501: ZEND_BEGIN_ARG_INFO(arginfo_imagecolorset, 0)
        !           502:        ZEND_ARG_INFO(0, im)
        !           503:        ZEND_ARG_INFO(0, color)
        !           504:        ZEND_ARG_INFO(0, red)
        !           505:        ZEND_ARG_INFO(0, green)
        !           506:        ZEND_ARG_INFO(0, blue)
        !           507: ZEND_END_ARG_INFO()
        !           508: 
        !           509: ZEND_BEGIN_ARG_INFO(arginfo_imagecolorsforindex, 0)
        !           510:        ZEND_ARG_INFO(0, im)
        !           511:        ZEND_ARG_INFO(0, index)
        !           512: ZEND_END_ARG_INFO()
        !           513: 
        !           514: ZEND_BEGIN_ARG_INFO(arginfo_imagegammacorrect, 0)
        !           515:        ZEND_ARG_INFO(0, im)
        !           516:        ZEND_ARG_INFO(0, inputgamma)
        !           517:        ZEND_ARG_INFO(0, outputgamma)
        !           518: ZEND_END_ARG_INFO()
        !           519: 
        !           520: ZEND_BEGIN_ARG_INFO(arginfo_imagesetpixel, 0)
        !           521:        ZEND_ARG_INFO(0, im)
        !           522:        ZEND_ARG_INFO(0, x)
        !           523:        ZEND_ARG_INFO(0, y)
        !           524:        ZEND_ARG_INFO(0, col)
        !           525: ZEND_END_ARG_INFO()
        !           526: 
        !           527: ZEND_BEGIN_ARG_INFO(arginfo_imageline, 0)
        !           528:        ZEND_ARG_INFO(0, im)
        !           529:        ZEND_ARG_INFO(0, x1)
        !           530:        ZEND_ARG_INFO(0, y1)
        !           531:        ZEND_ARG_INFO(0, x2)
        !           532:        ZEND_ARG_INFO(0, y2)
        !           533:        ZEND_ARG_INFO(0, col)
        !           534: ZEND_END_ARG_INFO()
        !           535: 
        !           536: ZEND_BEGIN_ARG_INFO(arginfo_imagedashedline, 0)
        !           537:        ZEND_ARG_INFO(0, im)
        !           538:        ZEND_ARG_INFO(0, x1)
        !           539:        ZEND_ARG_INFO(0, y1)
        !           540:        ZEND_ARG_INFO(0, x2)
        !           541:        ZEND_ARG_INFO(0, y2)
        !           542:        ZEND_ARG_INFO(0, col)
        !           543: ZEND_END_ARG_INFO()
        !           544: 
        !           545: ZEND_BEGIN_ARG_INFO(arginfo_imagerectangle, 0)
        !           546:        ZEND_ARG_INFO(0, im)
        !           547:        ZEND_ARG_INFO(0, x1)
        !           548:        ZEND_ARG_INFO(0, y1)
        !           549:        ZEND_ARG_INFO(0, x2)
        !           550:        ZEND_ARG_INFO(0, y2)
        !           551:        ZEND_ARG_INFO(0, col)
        !           552: ZEND_END_ARG_INFO()
        !           553: 
        !           554: ZEND_BEGIN_ARG_INFO(arginfo_imagefilledrectangle, 0)
        !           555:        ZEND_ARG_INFO(0, im)
        !           556:        ZEND_ARG_INFO(0, x1)
        !           557:        ZEND_ARG_INFO(0, y1)
        !           558:        ZEND_ARG_INFO(0, x2)
        !           559:        ZEND_ARG_INFO(0, y2)
        !           560:        ZEND_ARG_INFO(0, col)
        !           561: ZEND_END_ARG_INFO()
        !           562: 
        !           563: ZEND_BEGIN_ARG_INFO(arginfo_imagearc, 0)
        !           564:        ZEND_ARG_INFO(0, im)
        !           565:        ZEND_ARG_INFO(0, cx)
        !           566:        ZEND_ARG_INFO(0, cy)
        !           567:        ZEND_ARG_INFO(0, w)
        !           568:        ZEND_ARG_INFO(0, h)
        !           569:        ZEND_ARG_INFO(0, s)
        !           570:        ZEND_ARG_INFO(0, e)
        !           571:        ZEND_ARG_INFO(0, col)
        !           572: ZEND_END_ARG_INFO()
        !           573: 
        !           574: ZEND_BEGIN_ARG_INFO(arginfo_imageellipse, 0)
        !           575:        ZEND_ARG_INFO(0, im)
        !           576:        ZEND_ARG_INFO(0, cx)
        !           577:        ZEND_ARG_INFO(0, cy)
        !           578:        ZEND_ARG_INFO(0, w)
        !           579:        ZEND_ARG_INFO(0, h)
        !           580:        ZEND_ARG_INFO(0, color)
        !           581: ZEND_END_ARG_INFO()
        !           582: 
        !           583: ZEND_BEGIN_ARG_INFO(arginfo_imagefilltoborder, 0)
        !           584:        ZEND_ARG_INFO(0, im)
        !           585:        ZEND_ARG_INFO(0, x)
        !           586:        ZEND_ARG_INFO(0, y)
        !           587:        ZEND_ARG_INFO(0, border)
        !           588:        ZEND_ARG_INFO(0, col)
        !           589: ZEND_END_ARG_INFO()
        !           590: 
        !           591: ZEND_BEGIN_ARG_INFO(arginfo_imagefill, 0)
        !           592:        ZEND_ARG_INFO(0, im)
        !           593:        ZEND_ARG_INFO(0, x)
        !           594:        ZEND_ARG_INFO(0, y)
        !           595:        ZEND_ARG_INFO(0, col)
        !           596: ZEND_END_ARG_INFO()
        !           597: 
        !           598: ZEND_BEGIN_ARG_INFO(arginfo_imagecolorstotal, 0)
        !           599:        ZEND_ARG_INFO(0, im)
        !           600: ZEND_END_ARG_INFO()
        !           601: 
        !           602: ZEND_BEGIN_ARG_INFO_EX(arginfo_imagecolortransparent, 0, 0, 1)
        !           603:        ZEND_ARG_INFO(0, im)
        !           604:        ZEND_ARG_INFO(0, col)
        !           605: ZEND_END_ARG_INFO()
        !           606: 
        !           607: ZEND_BEGIN_ARG_INFO_EX(arginfo_imageinterlace, 0, 0, 1)
        !           608:        ZEND_ARG_INFO(0, im)
        !           609:        ZEND_ARG_INFO(0, interlace)
        !           610: ZEND_END_ARG_INFO()
        !           611: 
        !           612: ZEND_BEGIN_ARG_INFO(arginfo_imagepolygon, 0)
        !           613:        ZEND_ARG_INFO(0, im)
        !           614:        ZEND_ARG_INFO(0, points) /* ARRAY_INFO(0, points, 0) */
        !           615:        ZEND_ARG_INFO(0, num_pos)
        !           616:        ZEND_ARG_INFO(0, col)
        !           617: ZEND_END_ARG_INFO()
        !           618: 
        !           619: ZEND_BEGIN_ARG_INFO(arginfo_imagefilledpolygon, 0)
        !           620:        ZEND_ARG_INFO(0, im)
        !           621:        ZEND_ARG_INFO(0, points) /* ARRAY_INFO(0, points, 0) */
        !           622:        ZEND_ARG_INFO(0, num_pos)
        !           623:        ZEND_ARG_INFO(0, col)
        !           624: ZEND_END_ARG_INFO()
        !           625: 
        !           626: ZEND_BEGIN_ARG_INFO(arginfo_imagefontwidth, 0)
        !           627:        ZEND_ARG_INFO(0, font)
        !           628: ZEND_END_ARG_INFO()
        !           629: 
        !           630: ZEND_BEGIN_ARG_INFO(arginfo_imagefontheight, 0)
        !           631:        ZEND_ARG_INFO(0, font)
        !           632: ZEND_END_ARG_INFO()
        !           633: 
        !           634: ZEND_BEGIN_ARG_INFO(arginfo_imagechar, 0)
        !           635:        ZEND_ARG_INFO(0, im)
        !           636:        ZEND_ARG_INFO(0, font)
        !           637:        ZEND_ARG_INFO(0, x)
        !           638:        ZEND_ARG_INFO(0, y)
        !           639:        ZEND_ARG_INFO(0, c)
        !           640:        ZEND_ARG_INFO(0, col)
        !           641: ZEND_END_ARG_INFO()
        !           642: 
        !           643: ZEND_BEGIN_ARG_INFO(arginfo_imagecharup, 0)
        !           644:        ZEND_ARG_INFO(0, im)
        !           645:        ZEND_ARG_INFO(0, font)
        !           646:        ZEND_ARG_INFO(0, x)
        !           647:        ZEND_ARG_INFO(0, y)
        !           648:        ZEND_ARG_INFO(0, c)
        !           649:        ZEND_ARG_INFO(0, col)
        !           650: ZEND_END_ARG_INFO()
        !           651: 
        !           652: ZEND_BEGIN_ARG_INFO(arginfo_imagestring, 0)
        !           653:        ZEND_ARG_INFO(0, im)
        !           654:        ZEND_ARG_INFO(0, font)
        !           655:        ZEND_ARG_INFO(0, x)
        !           656:        ZEND_ARG_INFO(0, y)
        !           657:        ZEND_ARG_INFO(0, str)
        !           658:        ZEND_ARG_INFO(0, col)
        !           659: ZEND_END_ARG_INFO()
        !           660: 
        !           661: ZEND_BEGIN_ARG_INFO(arginfo_imagestringup, 0)
        !           662:        ZEND_ARG_INFO(0, im)
        !           663:        ZEND_ARG_INFO(0, font)
        !           664:        ZEND_ARG_INFO(0, x)
        !           665:        ZEND_ARG_INFO(0, y)
        !           666:        ZEND_ARG_INFO(0, str)
        !           667:        ZEND_ARG_INFO(0, col)
        !           668: ZEND_END_ARG_INFO()
        !           669: 
        !           670: ZEND_BEGIN_ARG_INFO(arginfo_imagecopy, 0)
        !           671:        ZEND_ARG_INFO(0, dst_im)
        !           672:        ZEND_ARG_INFO(0, src_im)
        !           673:        ZEND_ARG_INFO(0, dst_x)
        !           674:        ZEND_ARG_INFO(0, dst_y)
        !           675:        ZEND_ARG_INFO(0, src_x)
        !           676:        ZEND_ARG_INFO(0, src_y)
        !           677:        ZEND_ARG_INFO(0, src_w)
        !           678:        ZEND_ARG_INFO(0, src_h)
        !           679: ZEND_END_ARG_INFO()
        !           680: 
        !           681: #if HAVE_LIBGD15
        !           682: ZEND_BEGIN_ARG_INFO(arginfo_imagecopymerge, 0)
        !           683:        ZEND_ARG_INFO(0, src_im)
        !           684:        ZEND_ARG_INFO(0, dst_im)
        !           685:        ZEND_ARG_INFO(0, dst_x)
        !           686:        ZEND_ARG_INFO(0, dst_y)
        !           687:        ZEND_ARG_INFO(0, src_x)
        !           688:        ZEND_ARG_INFO(0, src_y)
        !           689:        ZEND_ARG_INFO(0, src_w)
        !           690:        ZEND_ARG_INFO(0, src_h)
        !           691:        ZEND_ARG_INFO(0, pct)
        !           692: ZEND_END_ARG_INFO()
        !           693: 
        !           694: ZEND_BEGIN_ARG_INFO(arginfo_imagecopymergegray, 0)
        !           695:        ZEND_ARG_INFO(0, src_im)
        !           696:        ZEND_ARG_INFO(0, dst_im)
        !           697:        ZEND_ARG_INFO(0, dst_x)
        !           698:        ZEND_ARG_INFO(0, dst_y)
        !           699:        ZEND_ARG_INFO(0, src_x)
        !           700:        ZEND_ARG_INFO(0, src_y)
        !           701:        ZEND_ARG_INFO(0, src_w)
        !           702:        ZEND_ARG_INFO(0, src_h)
        !           703:        ZEND_ARG_INFO(0, pct)
        !           704: ZEND_END_ARG_INFO()
        !           705: #endif
        !           706: 
        !           707: ZEND_BEGIN_ARG_INFO(arginfo_imagecopyresized, 0)
        !           708:        ZEND_ARG_INFO(0, dst_im)
        !           709:        ZEND_ARG_INFO(0, src_im)
        !           710:        ZEND_ARG_INFO(0, dst_x)
        !           711:        ZEND_ARG_INFO(0, dst_y)
        !           712:        ZEND_ARG_INFO(0, src_x)
        !           713:        ZEND_ARG_INFO(0, src_y)
        !           714:        ZEND_ARG_INFO(0, dst_w)
        !           715:        ZEND_ARG_INFO(0, dst_h)
        !           716:        ZEND_ARG_INFO(0, src_w)
        !           717:        ZEND_ARG_INFO(0, src_h)
        !           718: ZEND_END_ARG_INFO()
        !           719: 
        !           720: ZEND_BEGIN_ARG_INFO(arginfo_imagesx, 0)
        !           721:        ZEND_ARG_INFO(0, im)
        !           722: ZEND_END_ARG_INFO()
        !           723: 
        !           724: ZEND_BEGIN_ARG_INFO(arginfo_imagesy, 0)
        !           725:        ZEND_ARG_INFO(0, im)
        !           726: ZEND_END_ARG_INFO()
        !           727: 
        !           728: #ifdef ENABLE_GD_TTF
        !           729: #if HAVE_LIBFREETYPE && HAVE_GD_STRINGFTEX
        !           730: ZEND_BEGIN_ARG_INFO_EX(arginfo_imageftbbox, 0, 0, 4)
        !           731:        ZEND_ARG_INFO(0, size)
        !           732:        ZEND_ARG_INFO(0, angle)
        !           733:        ZEND_ARG_INFO(0, font_file)
        !           734:        ZEND_ARG_INFO(0, text)
        !           735:        ZEND_ARG_INFO(0, extrainfo) /* ARRAY_INFO(0, extrainfo, 0) */
        !           736: ZEND_END_ARG_INFO()
        !           737: 
        !           738: ZEND_BEGIN_ARG_INFO_EX(arginfo_imagefttext, 0, 0, 8)
        !           739:        ZEND_ARG_INFO(0, im)
        !           740:        ZEND_ARG_INFO(0, size)
        !           741:        ZEND_ARG_INFO(0, angle)
        !           742:        ZEND_ARG_INFO(0, x)
        !           743:        ZEND_ARG_INFO(0, y)
        !           744:        ZEND_ARG_INFO(0, col)
        !           745:        ZEND_ARG_INFO(0, font_file)
        !           746:        ZEND_ARG_INFO(0, text)
        !           747:        ZEND_ARG_INFO(0, extrainfo) /* ARRAY_INFO(0, extrainfo, 0) */
        !           748: ZEND_END_ARG_INFO()
        !           749: #endif
        !           750: 
        !           751: ZEND_BEGIN_ARG_INFO(arginfo_imagettfbbox, 0)
        !           752:        ZEND_ARG_INFO(0, size)
        !           753:        ZEND_ARG_INFO(0, angle)
        !           754:        ZEND_ARG_INFO(0, font_file)
        !           755:        ZEND_ARG_INFO(0, text)
        !           756: ZEND_END_ARG_INFO()
        !           757: 
        !           758: ZEND_BEGIN_ARG_INFO(arginfo_imagettftext, 0)
        !           759:        ZEND_ARG_INFO(0, im)
        !           760:        ZEND_ARG_INFO(0, size)
        !           761:        ZEND_ARG_INFO(0, angle)
        !           762:        ZEND_ARG_INFO(0, x)
        !           763:        ZEND_ARG_INFO(0, y)
        !           764:        ZEND_ARG_INFO(0, col)
        !           765:        ZEND_ARG_INFO(0, font_file)
        !           766:        ZEND_ARG_INFO(0, text)
        !           767: ZEND_END_ARG_INFO()
        !           768: #endif
        !           769: 
        !           770: #ifdef HAVE_LIBT1
        !           771: ZEND_BEGIN_ARG_INFO(arginfo_imagepsloadfont, 0)
        !           772:        ZEND_ARG_INFO(0, pathname)
        !           773: ZEND_END_ARG_INFO()
        !           774: 
        !           775: /*
        !           776: ZEND_BEGIN_ARG_INFO(arginfo_imagepscopyfont, 0)
        !           777:        ZEND_ARG_INFO(0, font_index)
        !           778: ZEND_END_ARG_INFO()
        !           779: */
        !           780: 
        !           781: ZEND_BEGIN_ARG_INFO(arginfo_imagepsfreefont, 0)
        !           782:        ZEND_ARG_INFO(0, font_index)
        !           783: ZEND_END_ARG_INFO()
        !           784: 
        !           785: ZEND_BEGIN_ARG_INFO(arginfo_imagepsencodefont, 0)
        !           786:        ZEND_ARG_INFO(0, font_index)
        !           787:        ZEND_ARG_INFO(0, filename)
        !           788: ZEND_END_ARG_INFO()
        !           789: 
        !           790: ZEND_BEGIN_ARG_INFO(arginfo_imagepsextendfont, 0)
        !           791:        ZEND_ARG_INFO(0, font_index)
        !           792:        ZEND_ARG_INFO(0, extend)
        !           793: ZEND_END_ARG_INFO()
        !           794: 
        !           795: ZEND_BEGIN_ARG_INFO(arginfo_imagepsslantfont, 0)
        !           796:        ZEND_ARG_INFO(0, font_index)
        !           797:        ZEND_ARG_INFO(0, slant)
        !           798: ZEND_END_ARG_INFO()
        !           799: 
        !           800: ZEND_BEGIN_ARG_INFO_EX(arginfo_imagepstext, 0, 0, 8)
        !           801:        ZEND_ARG_INFO(0, im)
        !           802:        ZEND_ARG_INFO(0, text)
        !           803:        ZEND_ARG_INFO(0, font)
        !           804:        ZEND_ARG_INFO(0, size)
        !           805:        ZEND_ARG_INFO(0, foreground)
        !           806:        ZEND_ARG_INFO(0, background)
        !           807:        ZEND_ARG_INFO(0, xcoord)
        !           808:        ZEND_ARG_INFO(0, ycoord)
        !           809:        ZEND_ARG_INFO(0, space)
        !           810:        ZEND_ARG_INFO(0, tightness)
        !           811:        ZEND_ARG_INFO(0, angle)
        !           812:        ZEND_ARG_INFO(0, antialias)
        !           813: ZEND_END_ARG_INFO()
        !           814: 
        !           815: ZEND_BEGIN_ARG_INFO_EX(arginfo_imagepsbbox, 0, 0, 3)
        !           816:        ZEND_ARG_INFO(0, text)
        !           817:        ZEND_ARG_INFO(0, font)
        !           818:        ZEND_ARG_INFO(0, size)
        !           819:        ZEND_ARG_INFO(0, space)
        !           820:        ZEND_ARG_INFO(0, tightness)
        !           821:        ZEND_ARG_INFO(0, angle)
        !           822: ZEND_END_ARG_INFO()
        !           823: #endif
        !           824: 
        !           825: #ifdef HAVE_GD_WBMP
        !           826: ZEND_BEGIN_ARG_INFO_EX(arginfo_image2wbmp, 0, 0, 1)
        !           827:        ZEND_ARG_INFO(0, im)
        !           828:        ZEND_ARG_INFO(0, filename)
        !           829:        ZEND_ARG_INFO(0, threshold)
        !           830: ZEND_END_ARG_INFO()
        !           831: #endif
        !           832: 
        !           833: #if defined(HAVE_GD_JPG) && defined(HAVE_GD_WBMP)
        !           834: ZEND_BEGIN_ARG_INFO(arginfo_jpeg2wbmp, 0)
        !           835:        ZEND_ARG_INFO(0, f_org)
        !           836:        ZEND_ARG_INFO(0, f_dest)
        !           837:        ZEND_ARG_INFO(0, d_height)
        !           838:        ZEND_ARG_INFO(0, d_width)
        !           839:        ZEND_ARG_INFO(0, d_threshold)
        !           840: ZEND_END_ARG_INFO()
        !           841: #endif
        !           842: 
        !           843: #if defined(HAVE_GD_PNG) && defined(HAVE_GD_WBMP)
        !           844: ZEND_BEGIN_ARG_INFO(arginfo_png2wbmp, 0)
        !           845:        ZEND_ARG_INFO(0, f_org)
        !           846:        ZEND_ARG_INFO(0, f_dest)
        !           847:        ZEND_ARG_INFO(0, d_height)
        !           848:        ZEND_ARG_INFO(0, d_width)
        !           849:        ZEND_ARG_INFO(0, d_threshold)
        !           850: ZEND_END_ARG_INFO()
        !           851: #endif
        !           852: 
        !           853: ZEND_BEGIN_ARG_INFO_EX(arginfo_imagefilter, 0, 0, 2)
        !           854:        ZEND_ARG_INFO(0, im)
        !           855:        ZEND_ARG_INFO(0, filtertype)
        !           856:        ZEND_ARG_INFO(0, arg1)
        !           857:        ZEND_ARG_INFO(0, arg2)
        !           858:        ZEND_ARG_INFO(0, arg3)
        !           859:        ZEND_ARG_INFO(0, arg4)
        !           860: ZEND_END_ARG_INFO()
        !           861: 
        !           862: ZEND_BEGIN_ARG_INFO(arginfo_imageconvolution, 0)
        !           863:        ZEND_ARG_INFO(0, im)
        !           864:        ZEND_ARG_INFO(0, matrix3x3) /* ARRAY_INFO(0, matrix3x3, 0) */
        !           865:        ZEND_ARG_INFO(0, div)
        !           866:        ZEND_ARG_INFO(0, offset)
        !           867: ZEND_END_ARG_INFO()
        !           868: 
        !           869: #ifdef HAVE_GD_BUNDLED
        !           870: ZEND_BEGIN_ARG_INFO(arginfo_imageantialias, 0)
        !           871:        ZEND_ARG_INFO(0, im)
        !           872:        ZEND_ARG_INFO(0, on)
        !           873: ZEND_END_ARG_INFO()
        !           874: #endif
        !           875: 
        !           876: /* }}} */
        !           877: 
        !           878: /* {{{ gd_functions[]
        !           879:  */
        !           880: const zend_function_entry gd_functions[] = {
        !           881:        PHP_FE(gd_info,                                 arginfo_gd_info)
        !           882:        PHP_FE(imagearc,                                                                arginfo_imagearc)
        !           883:        PHP_FE(imageellipse,                                                    arginfo_imageellipse)
        !           884:        PHP_FE(imagechar,                                                               arginfo_imagechar)
        !           885:        PHP_FE(imagecharup,                                                             arginfo_imagecharup)
        !           886:        PHP_FE(imagecolorat,                                                    arginfo_imagecolorat)
        !           887:        PHP_FE(imagecolorallocate,                                              arginfo_imagecolorallocate)
        !           888: #if HAVE_LIBGD15
        !           889:        PHP_FE(imagepalettecopy,                                                arginfo_imagepalettecopy)
        !           890:        PHP_FE(imagecreatefromstring,                                   arginfo_imagecreatefromstring)
        !           891: #endif
        !           892:        PHP_FE(imagecolorclosest,                                               arginfo_imagecolorclosest)
        !           893: #if HAVE_COLORCLOSESTHWB
        !           894:        PHP_FE(imagecolorclosesthwb,                                    arginfo_imagecolorclosesthwb)
        !           895: #endif
        !           896:        PHP_FE(imagecolordeallocate,                                    arginfo_imagecolordeallocate)
        !           897:        PHP_FE(imagecolorresolve,                                               arginfo_imagecolorresolve)
        !           898:        PHP_FE(imagecolorexact,                                                 arginfo_imagecolorexact)
        !           899:        PHP_FE(imagecolorset,                                                   arginfo_imagecolorset)
        !           900:        PHP_FE(imagecolortransparent,                                   arginfo_imagecolortransparent)
        !           901:        PHP_FE(imagecolorstotal,                                                arginfo_imagecolorstotal)
        !           902:        PHP_FE(imagecolorsforindex,                                             arginfo_imagecolorsforindex)
        !           903:        PHP_FE(imagecopy,                                                               arginfo_imagecopy)
        !           904: #if HAVE_LIBGD15
        !           905:        PHP_FE(imagecopymerge,                                                  arginfo_imagecopymerge)
        !           906:        PHP_FE(imagecopymergegray,                                              arginfo_imagecopymergegray)
        !           907: #endif
        !           908:        PHP_FE(imagecopyresized,                                                arginfo_imagecopyresized)
        !           909:        PHP_FE(imagecreate,                                                             arginfo_imagecreate)
        !           910:        PHP_FE(imagecreatetruecolor,                                    arginfo_imagecreatetruecolor)
        !           911:        PHP_FE(imageistruecolor,                                                arginfo_imageistruecolor)
        !           912:        PHP_FE(imagetruecolortopalette,                                 arginfo_imagetruecolortopalette)
        !           913:        PHP_FE(imagesetthickness,                                               arginfo_imagesetthickness)
        !           914:        PHP_FE(imagefilledarc,                                                  arginfo_imagefilledarc)
        !           915:        PHP_FE(imagefilledellipse,                                              arginfo_imagefilledellipse)
        !           916:        PHP_FE(imagealphablending,                                              arginfo_imagealphablending)
        !           917:        PHP_FE(imagesavealpha,                                                  arginfo_imagesavealpha)
        !           918:        PHP_FE(imagecolorallocatealpha,                                 arginfo_imagecolorallocatealpha)
        !           919:        PHP_FE(imagecolorresolvealpha,                                  arginfo_imagecolorresolvealpha)
        !           920:        PHP_FE(imagecolorclosestalpha,                                  arginfo_imagecolorclosestalpha)
        !           921:        PHP_FE(imagecolorexactalpha,                                    arginfo_imagecolorexactalpha)
        !           922:        PHP_FE(imagecopyresampled,                                              arginfo_imagecopyresampled)
        !           923: 
        !           924: #ifdef PHP_WIN32
        !           925:        PHP_FE(imagegrabwindow,                                                 arginfo_imagegrabwindow)
        !           926:        PHP_FE(imagegrabscreen,                                                 arginfo_imagegrabscreen)
        !           927: #endif
        !           928: 
        !           929:        PHP_FE(imagerotate,                                                     arginfo_imagerotate)
        !           930: 
        !           931: #ifdef HAVE_GD_BUNDLED
        !           932:        PHP_FE(imageantialias,                                                  arginfo_imageantialias)
        !           933: #endif
        !           934: 
        !           935: #if HAVE_GD_IMAGESETTILE
        !           936:        PHP_FE(imagesettile,                                                    arginfo_imagesettile)
        !           937: #endif
        !           938: 
        !           939: #if HAVE_GD_IMAGESETBRUSH
        !           940:        PHP_FE(imagesetbrush,                                                   arginfo_imagesetbrush)
        !           941: #endif
        !           942: 
        !           943:        PHP_FE(imagesetstyle,                                                   arginfo_imagesetstyle)
        !           944: 
        !           945: #ifdef HAVE_GD_PNG
        !           946:        PHP_FE(imagecreatefrompng,                                              arginfo_imagecreatefrompng)
        !           947: #endif
        !           948: #ifdef HAVE_GD_GIF_READ
        !           949:        PHP_FE(imagecreatefromgif,                                              arginfo_imagecreatefromgif)
        !           950: #endif
        !           951: #ifdef HAVE_GD_JPG
        !           952:        PHP_FE(imagecreatefromjpeg,                                             arginfo_imagecreatefromjpeg)
        !           953: #endif
        !           954: #ifdef HAVE_GD_WBMP
        !           955:        PHP_FE(imagecreatefromwbmp,                                             arginfo_imagecreatefromwbmp)
        !           956: #endif
        !           957: #ifdef HAVE_GD_XBM
        !           958:        PHP_FE(imagecreatefromxbm,                                              arginfo_imagecreatefromxbm)
        !           959: #endif
        !           960: #if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED)
        !           961:        PHP_FE(imagecreatefromxpm,                                              arginfo_imagecreatefromxpm)
        !           962: #endif
        !           963:        PHP_FE(imagecreatefromgd,                                               arginfo_imagecreatefromgd)
        !           964: #ifdef HAVE_GD_GD2
        !           965:        PHP_FE(imagecreatefromgd2,                                              arginfo_imagecreatefromgd2)
        !           966:        PHP_FE(imagecreatefromgd2part,                                  arginfo_imagecreatefromgd2part)
        !           967: #endif
        !           968: #ifdef HAVE_GD_PNG
        !           969:        PHP_FE(imagepng,                                                                arginfo_imagepng)
        !           970: #endif
        !           971: #ifdef HAVE_GD_GIF_CREATE
        !           972:        PHP_FE(imagegif,                                                                arginfo_imagegif)
        !           973: #endif
        !           974: #ifdef HAVE_GD_JPG
        !           975:        PHP_FE(imagejpeg,                                                               arginfo_imagejpeg)
        !           976: #endif
        !           977: #ifdef HAVE_GD_WBMP
        !           978:        PHP_FE(imagewbmp,                               arginfo_imagewbmp)
        !           979: #endif
        !           980:        PHP_FE(imagegd,                                                                 arginfo_imagegd)
        !           981: #ifdef HAVE_GD_GD2
        !           982:        PHP_FE(imagegd2,                                                                arginfo_imagegd2)
        !           983: #endif
        !           984: 
        !           985:        PHP_FE(imagedestroy,                                                    arginfo_imagedestroy)
        !           986:        PHP_FE(imagegammacorrect,                                               arginfo_imagegammacorrect)
        !           987:        PHP_FE(imagefill,                                                               arginfo_imagefill)
        !           988:        PHP_FE(imagefilledpolygon,                                              arginfo_imagefilledpolygon)
        !           989:        PHP_FE(imagefilledrectangle,                                    arginfo_imagefilledrectangle)
        !           990:        PHP_FE(imagefilltoborder,                                               arginfo_imagefilltoborder)
        !           991:        PHP_FE(imagefontwidth,                                                  arginfo_imagefontwidth)
        !           992:        PHP_FE(imagefontheight,                                                 arginfo_imagefontheight)
        !           993:        PHP_FE(imageinterlace,                                                  arginfo_imageinterlace)
        !           994:        PHP_FE(imageline,                                                               arginfo_imageline)
        !           995:        PHP_FE(imageloadfont,                                                   arginfo_imageloadfont)
        !           996:        PHP_FE(imagepolygon,                                                    arginfo_imagepolygon)
        !           997:        PHP_FE(imagerectangle,                                                  arginfo_imagerectangle)
        !           998:        PHP_FE(imagesetpixel,                                                   arginfo_imagesetpixel)
        !           999:        PHP_FE(imagestring,                                                             arginfo_imagestring)
        !          1000:        PHP_FE(imagestringup,                                                   arginfo_imagestringup)
        !          1001:        PHP_FE(imagesx,                                                                 arginfo_imagesx)
        !          1002:        PHP_FE(imagesy,                                                                 arginfo_imagesy)
        !          1003:        PHP_FE(imagedashedline,                                                 arginfo_imagedashedline)
        !          1004: 
        !          1005: #ifdef ENABLE_GD_TTF
        !          1006:        PHP_FE(imagettfbbox,                                                    arginfo_imagettfbbox)
        !          1007:        PHP_FE(imagettftext,                                                    arginfo_imagettftext)
        !          1008: #if HAVE_LIBFREETYPE && HAVE_GD_STRINGFTEX
        !          1009:        PHP_FE(imageftbbox,                                                             arginfo_imageftbbox)
        !          1010:        PHP_FE(imagefttext,                                                             arginfo_imagefttext)
        !          1011: #endif
        !          1012: #endif
        !          1013: 
        !          1014: #ifdef HAVE_LIBT1
        !          1015:        PHP_FE(imagepsloadfont,                                                 arginfo_imagepsloadfont)
        !          1016:        /*
        !          1017:        PHP_FE(imagepscopyfont,                                                 arginfo_imagepscopyfont)
        !          1018:        */
        !          1019:        PHP_FE(imagepsfreefont,                                                 arginfo_imagepsfreefont)
        !          1020:        PHP_FE(imagepsencodefont,                                               arginfo_imagepsencodefont)
        !          1021:        PHP_FE(imagepsextendfont,                                               arginfo_imagepsextendfont)
        !          1022:        PHP_FE(imagepsslantfont,                                                arginfo_imagepsslantfont)
        !          1023:        PHP_FE(imagepstext,                                                             arginfo_imagepstext)
        !          1024:        PHP_FE(imagepsbbox,                                                             arginfo_imagepsbbox)
        !          1025: #endif
        !          1026:        PHP_FE(imagetypes,                                                              arginfo_imagetypes)
        !          1027: 
        !          1028: #if defined(HAVE_GD_JPG) && defined(HAVE_GD_WBMP)
        !          1029:        PHP_FE(jpeg2wbmp,                                                               arginfo_jpeg2wbmp)
        !          1030: #endif
        !          1031: #if defined(HAVE_GD_PNG) && defined(HAVE_GD_WBMP)
        !          1032:        PHP_FE(png2wbmp,                                                                arginfo_png2wbmp)
        !          1033: #endif
        !          1034: #ifdef HAVE_GD_WBMP
        !          1035:        PHP_FE(image2wbmp,                                                              arginfo_image2wbmp)
        !          1036: #endif
        !          1037: #if HAVE_GD_BUNDLED
        !          1038:        PHP_FE(imagelayereffect,                                                arginfo_imagelayereffect)
        !          1039:        PHP_FE(imagexbm,                                arginfo_imagexbm)
        !          1040: #endif
        !          1041: 
        !          1042:        PHP_FE(imagecolormatch,                                                 arginfo_imagecolormatch)
        !          1043: 
        !          1044: /* gd filters */
        !          1045:        PHP_FE(imagefilter,                                                     arginfo_imagefilter)
        !          1046:        PHP_FE(imageconvolution,                                                arginfo_imageconvolution)
        !          1047: 
        !          1048:        PHP_FE_END
        !          1049: };
        !          1050: /* }}} */
        !          1051: 
        !          1052: zend_module_entry gd_module_entry = {
        !          1053:        STANDARD_MODULE_HEADER,
        !          1054:        "gd",
        !          1055:        gd_functions,
        !          1056:        PHP_MINIT(gd),
        !          1057: #if HAVE_LIBT1 || HAVE_GD_FONTMUTEX
        !          1058:        PHP_MSHUTDOWN(gd),
        !          1059: #else
        !          1060:        NULL,
        !          1061: #endif
        !          1062:        NULL,
        !          1063: #if HAVE_GD_STRINGFT && (HAVE_LIBFREETYPE && (HAVE_GD_FONTCACHESHUTDOWN || HAVE_GD_FREEFONTCACHE))
        !          1064:        PHP_RSHUTDOWN(gd),
        !          1065: #else
        !          1066:        NULL,
        !          1067: #endif
        !          1068:        PHP_MINFO(gd),
        !          1069:        NO_VERSION_YET,
        !          1070:        STANDARD_MODULE_PROPERTIES
        !          1071: };
        !          1072: 
        !          1073: #ifdef COMPILE_DL_GD
        !          1074: ZEND_GET_MODULE(gd)
        !          1075: #endif
        !          1076: 
        !          1077: /* {{{ PHP_INI_BEGIN */
        !          1078: PHP_INI_BEGIN()
        !          1079:        PHP_INI_ENTRY("gd.jpeg_ignore_warning", "0", PHP_INI_ALL, NULL)
        !          1080: PHP_INI_END()
        !          1081: /* }}} */
        !          1082: 
        !          1083: /* {{{ php_free_gd_image
        !          1084:  */
        !          1085: static void php_free_gd_image(zend_rsrc_list_entry *rsrc TSRMLS_DC)
        !          1086: {
        !          1087:        gdImageDestroy((gdImagePtr) rsrc->ptr);
        !          1088: }
        !          1089: /* }}} */
        !          1090: 
        !          1091: /* {{{ php_free_gd_font
        !          1092:  */
        !          1093: static void php_free_gd_font(zend_rsrc_list_entry *rsrc TSRMLS_DC)
        !          1094: {
        !          1095:        gdFontPtr fp = (gdFontPtr) rsrc->ptr;
        !          1096: 
        !          1097:        if (fp->data) {
        !          1098:                efree(fp->data);
        !          1099:        }
        !          1100: 
        !          1101:        efree(fp);
        !          1102: }
        !          1103: /* }}} */
        !          1104: 
        !          1105: /* {{{ PHP_MSHUTDOWN_FUNCTION
        !          1106:  */
        !          1107: #if HAVE_LIBT1 || HAVE_GD_FONTMUTEX
        !          1108: PHP_MSHUTDOWN_FUNCTION(gd)
        !          1109: {
        !          1110: #if HAVE_LIBT1
        !          1111:        T1_CloseLib();
        !          1112: #endif
        !          1113: #if HAVE_GD_FONTMUTEX && HAVE_LIBFREETYPE
        !          1114:        gdFontCacheMutexShutdown();
        !          1115: #endif
        !          1116:        UNREGISTER_INI_ENTRIES();
        !          1117:        return SUCCESS;
        !          1118: }
        !          1119: #endif
        !          1120: /* }}} */
        !          1121: 
        !          1122: 
        !          1123: /* {{{ PHP_MINIT_FUNCTION
        !          1124:  */
        !          1125: PHP_MINIT_FUNCTION(gd)
        !          1126: {
        !          1127:        le_gd = zend_register_list_destructors_ex(php_free_gd_image, NULL, "gd", module_number);
        !          1128:        le_gd_font = zend_register_list_destructors_ex(php_free_gd_font, NULL, "gd font", module_number);
        !          1129: 
        !          1130: #if HAVE_GD_FONTMUTEX && HAVE_LIBFREETYPE
        !          1131:        gdFontCacheMutexSetup();
        !          1132: #endif
        !          1133: #if HAVE_LIBT1
        !          1134:        T1_SetBitmapPad(8);
        !          1135:        T1_InitLib(NO_LOGFILE | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE);
        !          1136:        T1_SetLogLevel(T1LOG_DEBUG);
        !          1137:        le_ps_font = zend_register_list_destructors_ex(php_free_ps_font, NULL, "gd PS font", module_number);
        !          1138:        le_ps_enc = zend_register_list_destructors_ex(php_free_ps_enc, NULL, "gd PS encoding", module_number);
        !          1139: #endif
        !          1140: 
        !          1141:        REGISTER_INI_ENTRIES();
        !          1142: 
        !          1143:        REGISTER_LONG_CONSTANT("IMG_GIF", 1, CONST_CS | CONST_PERSISTENT);
        !          1144:        REGISTER_LONG_CONSTANT("IMG_JPG", 2, CONST_CS | CONST_PERSISTENT);
        !          1145:        REGISTER_LONG_CONSTANT("IMG_JPEG", 2, CONST_CS | CONST_PERSISTENT);
        !          1146:        REGISTER_LONG_CONSTANT("IMG_PNG", 4, CONST_CS | CONST_PERSISTENT);
        !          1147:        REGISTER_LONG_CONSTANT("IMG_WBMP", 8, CONST_CS | CONST_PERSISTENT);
        !          1148:        REGISTER_LONG_CONSTANT("IMG_XPM", 16, CONST_CS | CONST_PERSISTENT);
        !          1149: #ifdef gdTiled
        !          1150:        /* special colours for gd */
        !          1151:        REGISTER_LONG_CONSTANT("IMG_COLOR_TILED", gdTiled, CONST_CS | CONST_PERSISTENT);
        !          1152:        REGISTER_LONG_CONSTANT("IMG_COLOR_STYLED", gdStyled, CONST_CS | CONST_PERSISTENT);
        !          1153:        REGISTER_LONG_CONSTANT("IMG_COLOR_BRUSHED", gdBrushed, CONST_CS | CONST_PERSISTENT);
        !          1154:        REGISTER_LONG_CONSTANT("IMG_COLOR_STYLEDBRUSHED", gdStyledBrushed, CONST_CS | CONST_PERSISTENT);
        !          1155:        REGISTER_LONG_CONSTANT("IMG_COLOR_TRANSPARENT", gdTransparent, CONST_CS | CONST_PERSISTENT);
        !          1156: #endif
        !          1157:        /* for imagefilledarc */
        !          1158:        REGISTER_LONG_CONSTANT("IMG_ARC_ROUNDED", gdArc, CONST_CS | CONST_PERSISTENT);
        !          1159:        REGISTER_LONG_CONSTANT("IMG_ARC_PIE", gdPie, CONST_CS | CONST_PERSISTENT);
        !          1160:        REGISTER_LONG_CONSTANT("IMG_ARC_CHORD", gdChord, CONST_CS | CONST_PERSISTENT);
        !          1161:        REGISTER_LONG_CONSTANT("IMG_ARC_NOFILL", gdNoFill, CONST_CS | CONST_PERSISTENT);
        !          1162:        REGISTER_LONG_CONSTANT("IMG_ARC_EDGED", gdEdged, CONST_CS | CONST_PERSISTENT);
        !          1163: 
        !          1164: /* GD2 image format types */
        !          1165: #ifdef GD2_FMT_RAW
        !          1166:        REGISTER_LONG_CONSTANT("IMG_GD2_RAW", GD2_FMT_RAW, CONST_CS | CONST_PERSISTENT);
        !          1167: #endif
        !          1168: #ifdef GD2_FMT_COMPRESSED
        !          1169:        REGISTER_LONG_CONSTANT("IMG_GD2_COMPRESSED", GD2_FMT_COMPRESSED, CONST_CS | CONST_PERSISTENT);
        !          1170: #endif
        !          1171: #if HAVE_GD_BUNDLED
        !          1172:        REGISTER_LONG_CONSTANT("IMG_EFFECT_REPLACE", gdEffectReplace, CONST_CS | CONST_PERSISTENT);
        !          1173:        REGISTER_LONG_CONSTANT("IMG_EFFECT_ALPHABLEND", gdEffectAlphaBlend, CONST_CS | CONST_PERSISTENT);
        !          1174:        REGISTER_LONG_CONSTANT("IMG_EFFECT_NORMAL", gdEffectNormal, CONST_CS | CONST_PERSISTENT);
        !          1175:        REGISTER_LONG_CONSTANT("IMG_EFFECT_OVERLAY", gdEffectOverlay, CONST_CS | CONST_PERSISTENT);
        !          1176:        REGISTER_LONG_CONSTANT("GD_BUNDLED", 1, CONST_CS | CONST_PERSISTENT);
        !          1177: #else
        !          1178:        REGISTER_LONG_CONSTANT("GD_BUNDLED", 0, CONST_CS | CONST_PERSISTENT);
        !          1179: #endif
        !          1180: 
        !          1181:        /* Section Filters */
        !          1182:        REGISTER_LONG_CONSTANT("IMG_FILTER_NEGATE", IMAGE_FILTER_NEGATE, CONST_CS | CONST_PERSISTENT);
        !          1183:        REGISTER_LONG_CONSTANT("IMG_FILTER_GRAYSCALE", IMAGE_FILTER_GRAYSCALE, CONST_CS | CONST_PERSISTENT);
        !          1184:        REGISTER_LONG_CONSTANT("IMG_FILTER_BRIGHTNESS", IMAGE_FILTER_BRIGHTNESS, CONST_CS | CONST_PERSISTENT);
        !          1185:        REGISTER_LONG_CONSTANT("IMG_FILTER_CONTRAST", IMAGE_FILTER_CONTRAST, CONST_CS | CONST_PERSISTENT);
        !          1186:        REGISTER_LONG_CONSTANT("IMG_FILTER_COLORIZE", IMAGE_FILTER_COLORIZE, CONST_CS | CONST_PERSISTENT);
        !          1187:        REGISTER_LONG_CONSTANT("IMG_FILTER_EDGEDETECT", IMAGE_FILTER_EDGEDETECT, CONST_CS | CONST_PERSISTENT);
        !          1188:        REGISTER_LONG_CONSTANT("IMG_FILTER_GAUSSIAN_BLUR", IMAGE_FILTER_GAUSSIAN_BLUR, CONST_CS | CONST_PERSISTENT);
        !          1189:        REGISTER_LONG_CONSTANT("IMG_FILTER_SELECTIVE_BLUR", IMAGE_FILTER_SELECTIVE_BLUR, CONST_CS | CONST_PERSISTENT);
        !          1190:        REGISTER_LONG_CONSTANT("IMG_FILTER_EMBOSS", IMAGE_FILTER_EMBOSS, CONST_CS | CONST_PERSISTENT);
        !          1191:        REGISTER_LONG_CONSTANT("IMG_FILTER_MEAN_REMOVAL", IMAGE_FILTER_MEAN_REMOVAL, CONST_CS | CONST_PERSISTENT);
        !          1192:        REGISTER_LONG_CONSTANT("IMG_FILTER_SMOOTH", IMAGE_FILTER_SMOOTH, CONST_CS | CONST_PERSISTENT);
        !          1193:        REGISTER_LONG_CONSTANT("IMG_FILTER_PIXELATE", IMAGE_FILTER_PIXELATE, CONST_CS | CONST_PERSISTENT);
        !          1194:        /* End Section Filters */
        !          1195: 
        !          1196: #ifdef GD_VERSION_STRING
        !          1197:        REGISTER_STRING_CONSTANT("GD_VERSION", GD_VERSION_STRING, CONST_CS | CONST_PERSISTENT);
        !          1198: #endif
        !          1199: 
        !          1200: #if defined(GD_MAJOR_VERSION) && defined(GD_MINOR_VERSION) && defined(GD_RELEASE_VERSION) && defined(GD_EXTRA_VERSION)
        !          1201:        REGISTER_LONG_CONSTANT("GD_MAJOR_VERSION", GD_MAJOR_VERSION, CONST_CS | CONST_PERSISTENT);
        !          1202:        REGISTER_LONG_CONSTANT("GD_MINOR_VERSION", GD_MINOR_VERSION, CONST_CS | CONST_PERSISTENT);
        !          1203:        REGISTER_LONG_CONSTANT("GD_RELEASE_VERSION", GD_RELEASE_VERSION, CONST_CS | CONST_PERSISTENT);
        !          1204:        REGISTER_STRING_CONSTANT("GD_EXTRA_VERSION", GD_EXTRA_VERSION, CONST_CS | CONST_PERSISTENT);
        !          1205: #endif
        !          1206: 
        !          1207: 
        !          1208: #ifdef HAVE_GD_PNG
        !          1209: 
        !          1210:        /*
        !          1211:         * cannot include #include "png.h"
        !          1212:         * /usr/include/pngconf.h:310:2: error: #error png.h already includes setjmp.h with some additional fixup.
        !          1213:         * as error, use the values for now...
        !          1214:         */
        !          1215:        REGISTER_LONG_CONSTANT("PNG_NO_FILTER",     0x00, CONST_CS | CONST_PERSISTENT);
        !          1216:        REGISTER_LONG_CONSTANT("PNG_FILTER_NONE",   0x08, CONST_CS | CONST_PERSISTENT);
        !          1217:        REGISTER_LONG_CONSTANT("PNG_FILTER_SUB",    0x10, CONST_CS | CONST_PERSISTENT);
        !          1218:        REGISTER_LONG_CONSTANT("PNG_FILTER_UP",     0x20, CONST_CS | CONST_PERSISTENT);
        !          1219:        REGISTER_LONG_CONSTANT("PNG_FILTER_AVG",    0x40, CONST_CS | CONST_PERSISTENT);
        !          1220:        REGISTER_LONG_CONSTANT("PNG_FILTER_PAETH",  0x80, CONST_CS | CONST_PERSISTENT);
        !          1221:        REGISTER_LONG_CONSTANT("PNG_ALL_FILTERS",   0x08 | 0x10 | 0x20 | 0x40 | 0x80, CONST_CS | CONST_PERSISTENT);
        !          1222: #endif
        !          1223: 
        !          1224:        return SUCCESS;
        !          1225: }
        !          1226: /* }}} */
        !          1227: 
        !          1228: /* {{{ PHP_RSHUTDOWN_FUNCTION
        !          1229:  */
        !          1230: #if HAVE_GD_STRINGFT && (HAVE_LIBFREETYPE && (HAVE_GD_FONTCACHESHUTDOWN || HAVE_GD_FREEFONTCACHE))
        !          1231: PHP_RSHUTDOWN_FUNCTION(gd)
        !          1232: {
        !          1233: #if HAVE_GD_FONTCACHESHUTDOWN
        !          1234:        gdFontCacheShutdown();
        !          1235: #else
        !          1236:        gdFreeFontCache();
        !          1237: #endif
        !          1238:        return SUCCESS;
        !          1239: }
        !          1240: #endif
        !          1241: /* }}} */
        !          1242: 
        !          1243: #if HAVE_GD_BUNDLED
        !          1244: #define PHP_GD_VERSION_STRING "bundled (2.0.34 compatible)"
        !          1245: #else
        !          1246: #define PHP_GD_VERSION_STRING "2.0"
        !          1247: #endif
        !          1248: 
        !          1249: /* {{{ PHP_MINFO_FUNCTION
        !          1250:  */
        !          1251: PHP_MINFO_FUNCTION(gd)
        !          1252: {
        !          1253:        php_info_print_table_start();
        !          1254:        php_info_print_table_row(2, "GD Support", "enabled");
        !          1255: 
        !          1256:        /* need to use a PHPAPI function here because it is external module in windows */
        !          1257: 
        !          1258:        php_info_print_table_row(2, "GD Version", PHP_GD_VERSION_STRING);
        !          1259: 
        !          1260: #ifdef ENABLE_GD_TTF
        !          1261:        php_info_print_table_row(2, "FreeType Support", "enabled");
        !          1262: #if HAVE_LIBFREETYPE
        !          1263:        php_info_print_table_row(2, "FreeType Linkage", "with freetype");
        !          1264:        {
        !          1265:                char tmp[256];
        !          1266: 
        !          1267: #ifdef FREETYPE_PATCH
        !          1268:                snprintf(tmp, sizeof(tmp), "%d.%d.%d", FREETYPE_MAJOR, FREETYPE_MINOR, FREETYPE_PATCH);
        !          1269: #elif defined(FREETYPE_MAJOR)
        !          1270:                snprintf(tmp, sizeof(tmp), "%d.%d", FREETYPE_MAJOR, FREETYPE_MINOR);
        !          1271: #else
        !          1272:                snprintf(tmp, sizeof(tmp), "1.x");
        !          1273: #endif
        !          1274:                php_info_print_table_row(2, "FreeType Version", tmp);
        !          1275:        }
        !          1276: #else
        !          1277:        php_info_print_table_row(2, "FreeType Linkage", "with unknown library");
        !          1278: #endif
        !          1279: #endif
        !          1280: 
        !          1281: #ifdef HAVE_LIBT1
        !          1282:        php_info_print_table_row(2, "T1Lib Support", "enabled");
        !          1283: #endif
        !          1284: 
        !          1285: /* this next part is stupid ... if I knew better, I'd put them all on one row (cmv) */
        !          1286: 
        !          1287: #ifdef HAVE_GD_GIF_READ
        !          1288:        php_info_print_table_row(2, "GIF Read Support", "enabled");
        !          1289: #endif
        !          1290: #ifdef HAVE_GD_GIF_CREATE
        !          1291:        php_info_print_table_row(2, "GIF Create Support", "enabled");
        !          1292: #endif
        !          1293: #ifdef HAVE_GD_JPG
        !          1294:        {
        !          1295:                char tmp[12];
        !          1296:                snprintf(tmp, sizeof(tmp), "%s", gdJpegGetVersionString());
        !          1297:                php_info_print_table_row(2, "JPEG Support", "enabled");
        !          1298:                php_info_print_table_row(2, "libJPEG Version", tmp);
        !          1299:        }
        !          1300: #endif
        !          1301: 
        !          1302: #ifdef HAVE_GD_PNG
        !          1303:        php_info_print_table_row(2, "PNG Support", "enabled");
        !          1304:        php_info_print_table_row(2, "libPNG Version", gdPngGetVersionString());
        !          1305: #endif
        !          1306: #ifdef HAVE_GD_WBMP
        !          1307:        php_info_print_table_row(2, "WBMP Support", "enabled");
        !          1308: #endif
        !          1309: #if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED)
        !          1310:        php_info_print_table_row(2, "XPM Support", "enabled");
        !          1311: #endif
        !          1312: #ifdef HAVE_GD_XBM
        !          1313:        php_info_print_table_row(2, "XBM Support", "enabled");
        !          1314: #endif
        !          1315: #if defined(USE_GD_JISX0208) && defined(HAVE_GD_BUNDLED)
        !          1316:        php_info_print_table_row(2, "JIS-mapped Japanese Font Support", "enabled");
        !          1317: #endif
        !          1318:        php_info_print_table_end();
        !          1319:        DISPLAY_INI_ENTRIES();
        !          1320: }
        !          1321: /* }}} */
        !          1322: 
        !          1323: /* {{{ proto array gd_info()
        !          1324:  */
        !          1325: PHP_FUNCTION(gd_info)
        !          1326: {
        !          1327:        if (zend_parse_parameters_none() == FAILURE) {
        !          1328:                RETURN_FALSE;
        !          1329:        }
        !          1330: 
        !          1331:        array_init(return_value);
        !          1332: 
        !          1333:        add_assoc_string(return_value, "GD Version", PHP_GD_VERSION_STRING, 1);
        !          1334: 
        !          1335: #ifdef ENABLE_GD_TTF
        !          1336:        add_assoc_bool(return_value, "FreeType Support", 1);
        !          1337: #if HAVE_LIBFREETYPE
        !          1338:        add_assoc_string(return_value, "FreeType Linkage", "with freetype", 1);
        !          1339: #else
        !          1340:        add_assoc_string(return_value, "FreeType Linkage", "with unknown library", 1);
        !          1341: #endif
        !          1342: #else
        !          1343:        add_assoc_bool(return_value, "FreeType Support", 0);
        !          1344: #endif
        !          1345: 
        !          1346: #ifdef HAVE_LIBT1
        !          1347:        add_assoc_bool(return_value, "T1Lib Support", 1);
        !          1348: #else
        !          1349:        add_assoc_bool(return_value, "T1Lib Support", 0);
        !          1350: #endif
        !          1351: #ifdef HAVE_GD_GIF_READ
        !          1352:        add_assoc_bool(return_value, "GIF Read Support", 1);
        !          1353: #else
        !          1354:        add_assoc_bool(return_value, "GIF Read Support", 0);
        !          1355: #endif
        !          1356: #ifdef HAVE_GD_GIF_CREATE
        !          1357:        add_assoc_bool(return_value, "GIF Create Support", 1);
        !          1358: #else
        !          1359:        add_assoc_bool(return_value, "GIF Create Support", 0);
        !          1360: #endif
        !          1361: #ifdef HAVE_GD_JPG
        !          1362:        add_assoc_bool(return_value, "JPEG Support", 1);
        !          1363: #else
        !          1364:        add_assoc_bool(return_value, "JPEG Support", 0);
        !          1365: #endif
        !          1366: #ifdef HAVE_GD_PNG
        !          1367:        add_assoc_bool(return_value, "PNG Support", 1);
        !          1368: #else
        !          1369:        add_assoc_bool(return_value, "PNG Support", 0);
        !          1370: #endif
        !          1371: #ifdef HAVE_GD_WBMP
        !          1372:        add_assoc_bool(return_value, "WBMP Support", 1);
        !          1373: #else
        !          1374:        add_assoc_bool(return_value, "WBMP Support", 0);
        !          1375: #endif
        !          1376: #if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED)
        !          1377:        add_assoc_bool(return_value, "XPM Support", 1);
        !          1378: #else
        !          1379:        add_assoc_bool(return_value, "XPM Support", 0);
        !          1380: #endif
        !          1381: #ifdef HAVE_GD_XBM
        !          1382:        add_assoc_bool(return_value, "XBM Support", 1);
        !          1383: #else
        !          1384:        add_assoc_bool(return_value, "XBM Support", 0);
        !          1385: #endif
        !          1386: #if defined(USE_GD_JISX0208) && defined(HAVE_GD_BUNDLED)
        !          1387:        add_assoc_bool(return_value, "JIS-mapped Japanese Font Support", 1);
        !          1388: #else
        !          1389:        add_assoc_bool(return_value, "JIS-mapped Japanese Font Support", 0);
        !          1390: #endif
        !          1391: }
        !          1392: /* }}} */
        !          1393: 
        !          1394: /* Need this for cpdf. See also comment in file.c php3i_get_le_fp() */
        !          1395: PHP_GD_API int phpi_get_le_gd(void)
        !          1396: {
        !          1397:        return le_gd;
        !          1398: }
        !          1399: /* }}} */
        !          1400: 
        !          1401: #ifndef HAVE_GDIMAGECOLORRESOLVE
        !          1402: 
        !          1403: /* {{{ gdImageColorResolve
        !          1404:  */
        !          1405: /********************************************************************/
        !          1406: /* gdImageColorResolve is a replacement for the old fragment:       */
        !          1407: /*                                                                  */
        !          1408: /*      if ((color=gdImageColorExact(im,R,G,B)) < 0)                */
        !          1409: /*        if ((color=gdImageColorAllocate(im,R,G,B)) < 0)           */
        !          1410: /*          color=gdImageColorClosest(im,R,G,B);                    */
        !          1411: /*                                                                  */
        !          1412: /* in a single function                                             */
        !          1413: 
        !          1414: int gdImageColorResolve(gdImagePtr im, int r, int g, int b)
        !          1415: {
        !          1416:        int c;
        !          1417:        int ct = -1;
        !          1418:        int op = -1;
        !          1419:        long rd, gd, bd, dist;
        !          1420:        long mindist = 3*255*255;  /* init to max poss dist */
        !          1421: 
        !          1422:        for (c = 0; c < im->colorsTotal; c++) {
        !          1423:                if (im->open[c]) {
        !          1424:                        op = c;             /* Save open slot */
        !          1425:                        continue;           /* Color not in use */
        !          1426:                }
        !          1427:                rd = (long) (im->red  [c] - r);
        !          1428:                gd = (long) (im->green[c] - g);
        !          1429:                bd = (long) (im->blue [c] - b);
        !          1430:                dist = rd * rd + gd * gd + bd * bd;
        !          1431:                if (dist < mindist) {
        !          1432:                        if (dist == 0) {
        !          1433:                                return c;       /* Return exact match color */
        !          1434:                        }
        !          1435:                        mindist = dist;
        !          1436:                        ct = c;
        !          1437:                }
        !          1438:        }
        !          1439:        /* no exact match.  We now know closest, but first try to allocate exact */
        !          1440:        if (op == -1) {
        !          1441:                op = im->colorsTotal;
        !          1442:                if (op == gdMaxColors) {    /* No room for more colors */
        !          1443:                        return ct;          /* Return closest available color */
        !          1444:                }
        !          1445:                im->colorsTotal++;
        !          1446:        }
        !          1447:        im->red  [op] = r;
        !          1448:        im->green[op] = g;
        !          1449:        im->blue [op] = b;
        !          1450:        im->open [op] = 0;
        !          1451:        return op;                  /* Return newly allocated color */
        !          1452: }
        !          1453: /* }}} */
        !          1454: 
        !          1455: #endif
        !          1456: 
        !          1457: #define FLIPWORD(a) (((a & 0xff000000) >> 24) | ((a & 0x00ff0000) >> 8) | ((a & 0x0000ff00) << 8) | ((a & 0x000000ff) << 24))
        !          1458: 
        !          1459: /* {{{ proto int imageloadfont(string filename)
        !          1460:    Load a new font */
        !          1461: PHP_FUNCTION(imageloadfont)
        !          1462: {
        !          1463:        char *file;
        !          1464:        int file_name, hdr_size = sizeof(gdFont) - sizeof(char *);
        !          1465:        int ind, body_size, n = 0, b, i, body_size_check;
        !          1466:        gdFontPtr font;
        !          1467:        php_stream *stream;
        !          1468: 
        !          1469:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &file, &file_name) == FAILURE) {
        !          1470:                return;
        !          1471:        }
        !          1472: 
        !          1473:        stream = php_stream_open_wrapper(file, "rb", ENFORCE_SAFE_MODE | IGNORE_PATH | IGNORE_URL_WIN | REPORT_ERRORS, NULL);
        !          1474:        if (stream == NULL) {
        !          1475:                RETURN_FALSE;
        !          1476:        }
        !          1477: 
        !          1478:        /* Only supports a architecture-dependent binary dump format
        !          1479:         * at the moment.
        !          1480:         * The file format is like this on machines with 32-byte integers:
        !          1481:         *
        !          1482:         * byte 0-3:   (int) number of characters in the font
        !          1483:         * byte 4-7:   (int) value of first character in the font (often 32, space)
        !          1484:         * byte 8-11:  (int) pixel width of each character
        !          1485:         * byte 12-15: (int) pixel height of each character
        !          1486:         * bytes 16-:  (char) array with character data, one byte per pixel
        !          1487:         *                    in each character, for a total of
        !          1488:         *                    (nchars*width*height) bytes.
        !          1489:         */
        !          1490:        font = (gdFontPtr) emalloc(sizeof(gdFont));
        !          1491:        b = 0;
        !          1492:        while (b < hdr_size && (n = php_stream_read(stream, (char*)&font[b], hdr_size - b))) {
        !          1493:                b += n;
        !          1494:        }
        !          1495: 
        !          1496:        if (!n) {
        !          1497:                efree(font);
        !          1498:                if (php_stream_eof(stream)) {
        !          1499:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "End of file while reading header");
        !          1500:                } else {
        !          1501:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error while reading header");
        !          1502:                }
        !          1503:                php_stream_close(stream);
        !          1504:                RETURN_FALSE;
        !          1505:        }
        !          1506:        i = php_stream_tell(stream);
        !          1507:        php_stream_seek(stream, 0, SEEK_END);
        !          1508:        body_size_check = php_stream_tell(stream) - hdr_size;
        !          1509:        php_stream_seek(stream, i, SEEK_SET);
        !          1510: 
        !          1511:        body_size = font->w * font->h * font->nchars;
        !          1512:        if (body_size != body_size_check) {
        !          1513:                font->w = FLIPWORD(font->w);
        !          1514:                font->h = FLIPWORD(font->h);
        !          1515:                font->nchars = FLIPWORD(font->nchars);
        !          1516:                body_size = font->w * font->h * font->nchars;
        !          1517:        }
        !          1518: 
        !          1519:        if (overflow2(font->nchars, font->h)) {
        !          1520:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error reading font, invalid font header");
        !          1521:                efree(font);
        !          1522:                php_stream_close(stream);
        !          1523:                RETURN_FALSE;
        !          1524:        }
        !          1525:        if (overflow2(font->nchars * font->h, font->w )) {
        !          1526:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error reading font, invalid font header");
        !          1527:                efree(font);
        !          1528:                php_stream_close(stream);
        !          1529:                RETURN_FALSE;
        !          1530:        }
        !          1531: 
        !          1532:        if (body_size != body_size_check) {
        !          1533:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error reading font");
        !          1534:                efree(font);
        !          1535:                php_stream_close(stream);
        !          1536:                RETURN_FALSE;
        !          1537:        }
        !          1538: 
        !          1539:        font->data = emalloc(body_size);
        !          1540:        b = 0;
        !          1541:        while (b < body_size && (n = php_stream_read(stream, &font->data[b], body_size - b))) {
        !          1542:                b += n;
        !          1543:        }
        !          1544: 
        !          1545:        if (!n) {
        !          1546:                efree(font->data);
        !          1547:                efree(font);
        !          1548:                if (php_stream_eof(stream)) {
        !          1549:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "End of file while reading body");
        !          1550:                } else {
        !          1551:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error while reading body");
        !          1552:                }
        !          1553:                php_stream_close(stream);
        !          1554:                RETURN_FALSE;
        !          1555:        }
        !          1556:        php_stream_close(stream);
        !          1557: 
        !          1558:        /* Adding 5 to the font index so we will never have font indices
        !          1559:         * that overlap with the old fonts (with indices 1-5).  The first
        !          1560:         * list index given out is always 1.
        !          1561:         */
        !          1562:        ind = 5 + zend_list_insert(font, le_gd_font);
        !          1563: 
        !          1564:        RETURN_LONG(ind);
        !          1565: }
        !          1566: /* }}} */
        !          1567: 
        !          1568: /* {{{ proto bool imagesetstyle(resource im, array styles)
        !          1569:    Set the line drawing styles for use with imageline and IMG_COLOR_STYLED. */
        !          1570: PHP_FUNCTION(imagesetstyle)
        !          1571: {
        !          1572:        zval *IM, *styles;
        !          1573:        gdImagePtr im;
        !          1574:        int * stylearr;
        !          1575:        int index;
        !          1576:        HashPosition pos;
        !          1577: 
        !          1578:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ra", &IM, &styles) == FAILURE)  {
        !          1579:                return;
        !          1580:        }
        !          1581: 
        !          1582:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          1583: 
        !          1584:        /* copy the style values in the stylearr */
        !          1585:        stylearr = safe_emalloc(sizeof(int), zend_hash_num_elements(HASH_OF(styles)), 0);
        !          1586: 
        !          1587:        zend_hash_internal_pointer_reset_ex(HASH_OF(styles), &pos);
        !          1588: 
        !          1589:        for (index = 0;; zend_hash_move_forward_ex(HASH_OF(styles), &pos))      {
        !          1590:                zval ** item;
        !          1591: 
        !          1592:                if (zend_hash_get_current_data_ex(HASH_OF(styles), (void **) &item, &pos) == FAILURE) {
        !          1593:                        break;
        !          1594:                }
        !          1595: 
        !          1596:                convert_to_long_ex(item);
        !          1597: 
        !          1598:                stylearr[index++] = Z_LVAL_PP(item);
        !          1599:        }
        !          1600: 
        !          1601:        gdImageSetStyle(im, stylearr, index);
        !          1602: 
        !          1603:        efree(stylearr);
        !          1604: 
        !          1605:        RETURN_TRUE;
        !          1606: }
        !          1607: /* }}} */
        !          1608: 
        !          1609: /* {{{ proto resource imagecreatetruecolor(int x_size, int y_size)
        !          1610:    Create a new true color image */
        !          1611: PHP_FUNCTION(imagecreatetruecolor)
        !          1612: {
        !          1613:        long x_size, y_size;
        !          1614:        gdImagePtr im;
        !          1615: 
        !          1616:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &x_size, &y_size) == FAILURE) {
        !          1617:                return;
        !          1618:        }
        !          1619: 
        !          1620:        if (x_size <= 0 || y_size <= 0 || x_size >= INT_MAX || y_size >= INT_MAX) {
        !          1621:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid image dimensions");
        !          1622:                RETURN_FALSE;
        !          1623:        }
        !          1624: 
        !          1625:        im = gdImageCreateTrueColor(x_size, y_size);
        !          1626: 
        !          1627:        if (!im) {
        !          1628:                RETURN_FALSE;
        !          1629:        }
        !          1630: 
        !          1631:        ZEND_REGISTER_RESOURCE(return_value, im, le_gd);
        !          1632: }
        !          1633: /* }}} */
        !          1634: 
        !          1635: /* {{{ proto bool imageistruecolor(resource im)
        !          1636:    return true if the image uses truecolor */
        !          1637: PHP_FUNCTION(imageistruecolor)
        !          1638: {
        !          1639:        zval *IM;
        !          1640:        gdImagePtr im;
        !          1641: 
        !          1642:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &IM) == FAILURE) {
        !          1643:                return;
        !          1644:        }
        !          1645: 
        !          1646:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          1647: 
        !          1648:        RETURN_BOOL(im->trueColor);
        !          1649: }
        !          1650: /* }}} */
        !          1651: 
        !          1652: /* {{{ proto void imagetruecolortopalette(resource im, bool ditherFlag, int colorsWanted)
        !          1653:    Convert a true colour image to a palette based image with a number of colours, optionally using dithering. */
        !          1654: PHP_FUNCTION(imagetruecolortopalette)
        !          1655: {
        !          1656:        zval *IM;
        !          1657:        zend_bool dither;
        !          1658:        long ncolors;
        !          1659:        gdImagePtr im;
        !          1660: 
        !          1661:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rbl", &IM, &dither, &ncolors) == FAILURE)  {
        !          1662:                return;
        !          1663:        }
        !          1664: 
        !          1665:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          1666: 
        !          1667:        if (ncolors <= 0) {
        !          1668:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of colors has to be greater than zero");
        !          1669:                RETURN_FALSE;
        !          1670:        }
        !          1671:        gdImageTrueColorToPalette(im, dither, ncolors);
        !          1672: 
        !          1673:        RETURN_TRUE;
        !          1674: }
        !          1675: /* }}} */
        !          1676: 
        !          1677: /* {{{ proto bool imagecolormatch(resource im1, resource im2)
        !          1678:    Makes the colors of the palette version of an image more closely match the true color version */
        !          1679: PHP_FUNCTION(imagecolormatch)
        !          1680: {
        !          1681:        zval *IM1, *IM2;
        !          1682:        gdImagePtr im1, im2;
        !          1683:        int result;
        !          1684: 
        !          1685:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr", &IM1, &IM2) == FAILURE) {
        !          1686:                return;
        !          1687:        }
        !          1688: 
        !          1689:        ZEND_FETCH_RESOURCE(im1, gdImagePtr, &IM1, -1, "Image", le_gd);
        !          1690:        ZEND_FETCH_RESOURCE(im2, gdImagePtr, &IM2, -1, "Image", le_gd);
        !          1691: 
        !          1692:        result = gdImageColorMatch(im1, im2);
        !          1693:        switch (result) {
        !          1694:                case -1:
        !          1695:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Image1 must be TrueColor" );
        !          1696:                        RETURN_FALSE;
        !          1697:                        break;
        !          1698:                case -2:
        !          1699:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Image2 must be Palette" );
        !          1700:                        RETURN_FALSE;
        !          1701:                        break;
        !          1702:                case -3:
        !          1703:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Image1 and Image2 must be the same size" );
        !          1704:                        RETURN_FALSE;
        !          1705:                        break;
        !          1706:                case -4:
        !          1707:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Image2 must have at least one color" );
        !          1708:                        RETURN_FALSE;
        !          1709:                        break;
        !          1710:        }
        !          1711: 
        !          1712:        RETURN_TRUE;
        !          1713: }
        !          1714: /* }}} */
        !          1715: 
        !          1716: /* {{{ proto bool imagesetthickness(resource im, int thickness)
        !          1717:    Set line thickness for drawing lines, ellipses, rectangles, polygons etc. */
        !          1718: PHP_FUNCTION(imagesetthickness)
        !          1719: {
        !          1720:        zval *IM;
        !          1721:        long thick;
        !          1722:        gdImagePtr im;
        !          1723: 
        !          1724:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &IM, &thick) == FAILURE) {
        !          1725:                return;
        !          1726:        }
        !          1727: 
        !          1728:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          1729: 
        !          1730:        gdImageSetThickness(im, thick);
        !          1731: 
        !          1732:        RETURN_TRUE;
        !          1733: }
        !          1734: /* }}} */
        !          1735: 
        !          1736: /* {{{ proto bool imagefilledellipse(resource im, int cx, int cy, int w, int h, int color)
        !          1737:    Draw an ellipse */
        !          1738: PHP_FUNCTION(imagefilledellipse)
        !          1739: {
        !          1740:        zval *IM;
        !          1741:        long cx, cy, w, h, color;
        !          1742:        gdImagePtr im;
        !          1743: 
        !          1744:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllll", &IM, &cx, &cy, &w, &h, &color) == FAILURE) {
        !          1745:                return;
        !          1746:        }
        !          1747: 
        !          1748:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          1749: 
        !          1750:        gdImageFilledEllipse(im, cx, cy, w, h, color);
        !          1751: 
        !          1752:        RETURN_TRUE;
        !          1753: }
        !          1754: /* }}} */
        !          1755: 
        !          1756: /* {{{ proto bool imagefilledarc(resource im, int cx, int cy, int w, int h, int s, int e, int col, int style)
        !          1757:    Draw a filled partial ellipse */
        !          1758: PHP_FUNCTION(imagefilledarc)
        !          1759: {
        !          1760:        zval *IM;
        !          1761:        long cx, cy, w, h, ST, E, col, style;
        !          1762:        gdImagePtr im;
        !          1763:        int e, st;
        !          1764:        
        !          1765:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllllllll", &IM, &cx, &cy, &w, &h, &ST, &E, &col, &style) == FAILURE) {
        !          1766:                return;
        !          1767:        }
        !          1768: 
        !          1769:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          1770: 
        !          1771:        e = E;
        !          1772:        if (e < 0) {
        !          1773:                e %= 360;
        !          1774:        }
        !          1775: 
        !          1776:        st = ST;
        !          1777:        if (st < 0) {
        !          1778:                st %= 360;
        !          1779:        }
        !          1780: 
        !          1781:        gdImageFilledArc(im, cx, cy, w, h, st, e, col, style);
        !          1782: 
        !          1783:        RETURN_TRUE;
        !          1784: }
        !          1785: /* }}} */
        !          1786: 
        !          1787: /* {{{ proto bool imagealphablending(resource im, bool on)
        !          1788:    Turn alpha blending mode on or off for the given image */
        !          1789: PHP_FUNCTION(imagealphablending)
        !          1790: {
        !          1791:        zval *IM;
        !          1792:        zend_bool blend;
        !          1793:        gdImagePtr im;
        !          1794: 
        !          1795:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rb", &IM, &blend) == FAILURE) {
        !          1796:                return;
        !          1797:        }
        !          1798: 
        !          1799:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          1800:        gdImageAlphaBlending(im, blend);
        !          1801: 
        !          1802:        RETURN_TRUE;
        !          1803: }
        !          1804: /* }}} */
        !          1805: 
        !          1806: /* {{{ proto bool imagesavealpha(resource im, bool on)
        !          1807:    Include alpha channel to a saved image */
        !          1808: PHP_FUNCTION(imagesavealpha)
        !          1809: {
        !          1810:        zval *IM;
        !          1811:        zend_bool save;
        !          1812:        gdImagePtr im;
        !          1813: 
        !          1814:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rb", &IM, &save) == FAILURE) {
        !          1815:                return;
        !          1816:        }
        !          1817: 
        !          1818:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          1819:        gdImageSaveAlpha(im, save);
        !          1820: 
        !          1821:        RETURN_TRUE;
        !          1822: }
        !          1823: /* }}} */
        !          1824: 
        !          1825: #if HAVE_GD_BUNDLED
        !          1826: /* {{{ proto bool imagelayereffect(resource im, int effect)
        !          1827:    Set the alpha blending flag to use the bundled libgd layering effects */
        !          1828: PHP_FUNCTION(imagelayereffect)
        !          1829: {
        !          1830:        zval *IM;
        !          1831:        long effect;
        !          1832:        gdImagePtr im;
        !          1833: 
        !          1834:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &IM, &effect) == FAILURE) {
        !          1835:                return;
        !          1836:        }
        !          1837: 
        !          1838:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          1839:        gdImageAlphaBlending(im, effect);
        !          1840: 
        !          1841:        RETURN_TRUE;
        !          1842: }
        !          1843: /* }}} */
        !          1844: #endif
        !          1845: 
        !          1846: /* {{{ proto int imagecolorallocatealpha(resource im, int red, int green, int blue, int alpha)
        !          1847:    Allocate a color with an alpha level.  Works for true color and palette based images */
        !          1848: PHP_FUNCTION(imagecolorallocatealpha)
        !          1849: {
        !          1850:        zval *IM;
        !          1851:        long red, green, blue, alpha;
        !          1852:        gdImagePtr im;
        !          1853:        int ct = (-1);
        !          1854: 
        !          1855:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &IM, &red, &green, &blue, &alpha) == FAILURE) {
        !          1856:                RETURN_FALSE;
        !          1857:        }
        !          1858: 
        !          1859:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          1860:        ct = gdImageColorAllocateAlpha(im, red, green, blue, alpha);
        !          1861:        if (ct < 0) {
        !          1862:                RETURN_FALSE;
        !          1863:        }
        !          1864:        RETURN_LONG((long)ct);
        !          1865: }
        !          1866: /* }}} */
        !          1867: 
        !          1868: /* {{{ proto int imagecolorresolvealpha(resource im, int red, int green, int blue, int alpha)
        !          1869:    Resolve/Allocate a colour with an alpha level.  Works for true colour and palette based images */
        !          1870: PHP_FUNCTION(imagecolorresolvealpha)
        !          1871: {
        !          1872:        zval *IM;
        !          1873:        long red, green, blue, alpha;
        !          1874:        gdImagePtr im;
        !          1875: 
        !          1876:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &IM, &red, &green, &blue, &alpha) == FAILURE) {
        !          1877:                return;
        !          1878:        }
        !          1879: 
        !          1880:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          1881: 
        !          1882:        RETURN_LONG(gdImageColorResolveAlpha(im, red, green, blue, alpha));
        !          1883: }
        !          1884: /* }}} */
        !          1885: 
        !          1886: /* {{{ proto int imagecolorclosestalpha(resource im, int red, int green, int blue, int alpha)
        !          1887:    Find the closest matching colour with alpha transparency */
        !          1888: PHP_FUNCTION(imagecolorclosestalpha)
        !          1889: {
        !          1890:        zval *IM;
        !          1891:        long red, green, blue, alpha;
        !          1892:        gdImagePtr im;
        !          1893: 
        !          1894:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &IM, &red, &green, &blue, &alpha) == FAILURE) {
        !          1895:                return;
        !          1896:        }
        !          1897: 
        !          1898:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          1899: 
        !          1900:        RETURN_LONG(gdImageColorClosestAlpha(im, red, green, blue, alpha));
        !          1901: }
        !          1902: /* }}} */
        !          1903: 
        !          1904: /* {{{ proto int imagecolorexactalpha(resource im, int red, int green, int blue, int alpha)
        !          1905:    Find exact match for colour with transparency */
        !          1906: PHP_FUNCTION(imagecolorexactalpha)
        !          1907: {
        !          1908:        zval *IM;
        !          1909:        long red, green, blue, alpha;
        !          1910:        gdImagePtr im;
        !          1911: 
        !          1912:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &IM, &red, &green, &blue, &alpha) == FAILURE) {
        !          1913:                return;
        !          1914:        }
        !          1915: 
        !          1916:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          1917: 
        !          1918:        RETURN_LONG(gdImageColorExactAlpha(im, red, green, blue, alpha));
        !          1919: }
        !          1920: /* }}} */
        !          1921: 
        !          1922: /* {{{ proto bool imagecopyresampled(resource dst_im, resource 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)
        !          1923:    Copy and resize part of an image using resampling to help ensure clarity */
        !          1924: PHP_FUNCTION(imagecopyresampled)
        !          1925: {
        !          1926:        zval *SIM, *DIM;
        !          1927:        long SX, SY, SW, SH, DX, DY, DW, DH;
        !          1928:        gdImagePtr im_dst, im_src;
        !          1929:        int srcH, srcW, dstH, dstW, srcY, srcX, dstY, dstX;
        !          1930: 
        !          1931:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrllllllll", &DIM, &SIM, &DX, &DY, &SX, &SY, &DW, &DH, &SW, &SH) == FAILURE) {
        !          1932:                return;
        !          1933:        }
        !          1934: 
        !          1935:        ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, &DIM, -1, "Image", le_gd);
        !          1936:        ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd);
        !          1937: 
        !          1938:        srcX = SX;
        !          1939:        srcY = SY;
        !          1940:        srcH = SH;
        !          1941:        srcW = SW;
        !          1942:        dstX = DX;
        !          1943:        dstY = DY;
        !          1944:        dstH = DH;
        !          1945:        dstW = DW;
        !          1946: 
        !          1947:        gdImageCopyResampled(im_dst, im_src, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH);
        !          1948: 
        !          1949:        RETURN_TRUE;
        !          1950: }
        !          1951: /* }}} */
        !          1952: 
        !          1953: #ifdef PHP_WIN32
        !          1954: /* {{{ proto resource imagegrabwindow(int window_handle [, int client_area])
        !          1955:    Grab a window or its client area using a windows handle (HWND property in COM instance) */
        !          1956: PHP_FUNCTION(imagegrabwindow)
        !          1957: {
        !          1958:        HWND window;
        !          1959:        long client_area = 0;
        !          1960:        RECT rc = {0};
        !          1961:        RECT rc_win = {0};
        !          1962:        int Width, Height;
        !          1963:        HDC             hdc;
        !          1964:        HDC memDC;
        !          1965:        HBITMAP memBM;
        !          1966:        HBITMAP hOld;
        !          1967:        HINSTANCE handle;
        !          1968:        long lwindow_handle;
        !          1969:        typedef BOOL (WINAPI *tPrintWindow)(HWND, HDC,UINT);
        !          1970:        tPrintWindow pPrintWindow = 0;
        !          1971:        gdImagePtr im;
        !          1972: 
        !          1973:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l", &lwindow_handle, &client_area) == FAILURE) {
        !          1974:                RETURN_FALSE;
        !          1975:        }
        !          1976: 
        !          1977:        window = (HWND) lwindow_handle;
        !          1978: 
        !          1979:        if (!IsWindow(window)) {
        !          1980:                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Invalid window handle");
        !          1981:                RETURN_FALSE;
        !          1982:        }
        !          1983: 
        !          1984:        hdc             = GetDC(0);
        !          1985: 
        !          1986:        if (client_area) {
        !          1987:                GetClientRect(window, &rc);
        !          1988:                Width = rc.right;
        !          1989:                Height = rc.bottom;
        !          1990:        } else {
        !          1991:                GetWindowRect(window, &rc);
        !          1992:                Width   = rc.right - rc.left;
        !          1993:                Height  = rc.bottom - rc.top;
        !          1994:        }
        !          1995: 
        !          1996:        Width           = (Width/4)*4;
        !          1997: 
        !          1998:        memDC   = CreateCompatibleDC(hdc);
        !          1999:        memBM   = CreateCompatibleBitmap(hdc, Width, Height);
        !          2000:        hOld    = (HBITMAP) SelectObject (memDC, memBM);
        !          2001: 
        !          2002: 
        !          2003:        handle = LoadLibrary("User32.dll");
        !          2004:        if ( handle == 0 ) {
        !          2005:                goto clean;
        !          2006:        }
        !          2007:        pPrintWindow = (tPrintWindow) GetProcAddress(handle, "PrintWindow");  
        !          2008: 
        !          2009:        if ( pPrintWindow )  {
        !          2010:                pPrintWindow(window, memDC, (UINT) client_area);
        !          2011:        } else {
        !          2012:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Windows API too old");
        !          2013:                goto clean;
        !          2014:        }
        !          2015: 
        !          2016:        FreeLibrary(handle);
        !          2017: 
        !          2018:        im = gdImageCreateTrueColor(Width, Height);
        !          2019:        if (im) {
        !          2020:                int x,y;
        !          2021:                for (y=0; y <= Height; y++) {
        !          2022:                        for (x=0; x <= Width; x++) {
        !          2023:                                int c = GetPixel(memDC, x,y);
        !          2024:                                gdImageSetPixel(im, x, y, gdTrueColor(GetRValue(c), GetGValue(c), GetBValue(c)));
        !          2025:                        }
        !          2026:                }
        !          2027:        }
        !          2028: 
        !          2029: clean:
        !          2030:        SelectObject(memDC,hOld);
        !          2031:        DeleteObject(memBM);
        !          2032:        DeleteDC(memDC);
        !          2033:        ReleaseDC( 0, hdc );
        !          2034: 
        !          2035:        if (!im) {
        !          2036:                RETURN_FALSE;
        !          2037:        } else {
        !          2038:                ZEND_REGISTER_RESOURCE(return_value, im, le_gd);
        !          2039:        }
        !          2040: }
        !          2041: /* }}} */
        !          2042: 
        !          2043: /* {{{ proto resource imagegrabscreen()
        !          2044:    Grab a screenshot */
        !          2045: PHP_FUNCTION(imagegrabscreen)
        !          2046: {
        !          2047:        HWND window = GetDesktopWindow();
        !          2048:        RECT rc = {0};
        !          2049:        int Width, Height;
        !          2050:        HDC             hdc;
        !          2051:        HDC memDC;
        !          2052:        HBITMAP memBM;
        !          2053:        HBITMAP hOld;
        !          2054:        typedef BOOL (WINAPI *tPrintWindow)(HWND, HDC,UINT);
        !          2055:        tPrintWindow pPrintWindow = 0;
        !          2056:        gdImagePtr im;
        !          2057:        hdc             = GetDC(0);
        !          2058: 
        !          2059:        if (zend_parse_parameters_none() == FAILURE) {
        !          2060:                return;
        !          2061:        }
        !          2062: 
        !          2063:        if (!hdc) {
        !          2064:                RETURN_FALSE;
        !          2065:        }
        !          2066: 
        !          2067:        GetWindowRect(window, &rc);
        !          2068:        Width   = rc.right - rc.left;
        !          2069:        Height  = rc.bottom - rc.top;
        !          2070: 
        !          2071:        Width           = (Width/4)*4;
        !          2072: 
        !          2073:        memDC   = CreateCompatibleDC(hdc);
        !          2074:        memBM   = CreateCompatibleBitmap(hdc, Width, Height);
        !          2075:        hOld    = (HBITMAP) SelectObject (memDC, memBM);
        !          2076:        BitBlt( memDC, 0, 0, Width, Height , hdc, rc.left, rc.top , SRCCOPY );
        !          2077: 
        !          2078:        im = gdImageCreateTrueColor(Width, Height);
        !          2079:        if (im) {
        !          2080:                int x,y;
        !          2081:                for (y=0; y <= Height; y++) {
        !          2082:                        for (x=0; x <= Width; x++) {
        !          2083:                                int c = GetPixel(memDC, x,y);
        !          2084:                                gdImageSetPixel(im, x, y, gdTrueColor(GetRValue(c), GetGValue(c), GetBValue(c)));
        !          2085:                        }
        !          2086:                }
        !          2087:        }
        !          2088: 
        !          2089:        SelectObject(memDC,hOld);
        !          2090:        DeleteObject(memBM);
        !          2091:        DeleteDC(memDC);
        !          2092:        ReleaseDC( 0, hdc );
        !          2093: 
        !          2094:        if (!im) {
        !          2095:                RETURN_FALSE;
        !          2096:        } else {
        !          2097:                ZEND_REGISTER_RESOURCE(return_value, im, le_gd);
        !          2098:        }
        !          2099: }
        !          2100: /* }}} */
        !          2101: #endif /* PHP_WIN32 */
        !          2102: 
        !          2103: /* {{{ proto resource imagerotate(resource src_im, float angle, int bgdcolor [, int ignoretransparent])
        !          2104:    Rotate an image using a custom angle */
        !          2105: PHP_FUNCTION(imagerotate)
        !          2106: {
        !          2107:        zval *SIM;
        !          2108:        gdImagePtr im_dst, im_src;
        !          2109:        double degrees;
        !          2110:        long color;
        !          2111:        long ignoretransparent = 0;
        !          2112: 
        !          2113:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rdl|l", &SIM, &degrees, &color, &ignoretransparent) == FAILURE) {
        !          2114:                RETURN_FALSE;
        !          2115:        }
        !          2116: 
        !          2117:        ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd);
        !          2118: 
        !          2119:        im_dst = gdImageRotate(im_src, degrees, color, ignoretransparent);
        !          2120: 
        !          2121:        if (im_dst != NULL) {
        !          2122:                ZEND_REGISTER_RESOURCE(return_value, im_dst, le_gd);
        !          2123:        } else {
        !          2124:                RETURN_FALSE;
        !          2125:        }
        !          2126: }
        !          2127: /* }}} */
        !          2128: 
        !          2129: #if HAVE_GD_IMAGESETTILE
        !          2130: /* {{{ proto bool imagesettile(resource image, resource tile)
        !          2131:    Set the tile image to $tile when filling $image with the "IMG_COLOR_TILED" color */
        !          2132: PHP_FUNCTION(imagesettile)
        !          2133: {
        !          2134:        zval *IM, *TILE;
        !          2135:        gdImagePtr im, tile;
        !          2136: 
        !          2137:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr", &IM, &TILE) == FAILURE) {
        !          2138:                return;
        !          2139:        }
        !          2140: 
        !          2141:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          2142:        ZEND_FETCH_RESOURCE(tile, gdImagePtr, &TILE, -1, "Image", le_gd);
        !          2143: 
        !          2144:        gdImageSetTile(im, tile);
        !          2145: 
        !          2146:        RETURN_TRUE;
        !          2147: }
        !          2148: /* }}} */
        !          2149: #endif
        !          2150: 
        !          2151: #if HAVE_GD_IMAGESETBRUSH
        !          2152: /* {{{ proto bool imagesetbrush(resource image, resource brush)
        !          2153:    Set the brush image to $brush when filling $image with the "IMG_COLOR_BRUSHED" color */
        !          2154: PHP_FUNCTION(imagesetbrush)
        !          2155: {
        !          2156:        zval *IM, *TILE;
        !          2157:        gdImagePtr im, tile;
        !          2158: 
        !          2159:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr", &IM, &TILE) == FAILURE) {
        !          2160:                return;
        !          2161:        }
        !          2162: 
        !          2163:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          2164:        ZEND_FETCH_RESOURCE(tile, gdImagePtr, &TILE, -1, "Image", le_gd);
        !          2165: 
        !          2166:        gdImageSetBrush(im, tile);
        !          2167: 
        !          2168:        RETURN_TRUE;
        !          2169: }
        !          2170: /* }}} */
        !          2171: #endif
        !          2172: 
        !          2173: /* {{{ proto resource imagecreate(int x_size, int y_size)
        !          2174:    Create a new image */
        !          2175: PHP_FUNCTION(imagecreate)
        !          2176: {
        !          2177:        long x_size, y_size;
        !          2178:        gdImagePtr im;
        !          2179: 
        !          2180:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &x_size, &y_size) == FAILURE) {
        !          2181:                return;
        !          2182:        }
        !          2183: 
        !          2184:        if (x_size <= 0 || y_size <= 0 || x_size >= INT_MAX || y_size >= INT_MAX) {
        !          2185:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid image dimensions");
        !          2186:                RETURN_FALSE;
        !          2187:        }
        !          2188: 
        !          2189:        im = gdImageCreate(x_size, y_size);
        !          2190: 
        !          2191:        if (!im) {
        !          2192:                RETURN_FALSE;
        !          2193:        }
        !          2194: 
        !          2195:        ZEND_REGISTER_RESOURCE(return_value, im, le_gd);
        !          2196: }
        !          2197: /* }}} */
        !          2198: 
        !          2199: /* {{{ proto int imagetypes(void)
        !          2200:    Return the types of images supported in a bitfield - 1=GIF, 2=JPEG, 4=PNG, 8=WBMP, 16=XPM */
        !          2201: PHP_FUNCTION(imagetypes)
        !          2202: {
        !          2203:        int ret=0;
        !          2204: #ifdef HAVE_GD_GIF_CREATE
        !          2205:        ret = 1;
        !          2206: #endif
        !          2207: #ifdef HAVE_GD_JPG
        !          2208:        ret |= 2;
        !          2209: #endif
        !          2210: #ifdef HAVE_GD_PNG
        !          2211:        ret |= 4;
        !          2212: #endif
        !          2213: #ifdef HAVE_GD_WBMP
        !          2214:        ret |= 8;
        !          2215: #endif
        !          2216: #if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED)
        !          2217:        ret |= 16;
        !          2218: #endif
        !          2219: 
        !          2220:        if (zend_parse_parameters_none() == FAILURE) {
        !          2221:                return;
        !          2222:        }
        !          2223: 
        !          2224:        RETURN_LONG(ret);
        !          2225: }
        !          2226: /* }}} */
        !          2227: 
        !          2228: /* {{{ _php_image_type
        !          2229:  */
        !          2230: static const char php_sig_gd2[3] = {'g', 'd', '2'};
        !          2231: 
        !          2232: static int _php_image_type (char data[8])
        !          2233: {
        !          2234: #ifdef HAVE_LIBGD15
        !          2235:        /* Based on ext/standard/image.c */
        !          2236: 
        !          2237:        if (data == NULL) {
        !          2238:                return -1;
        !          2239:        }
        !          2240: 
        !          2241:        if (!memcmp(data, php_sig_gd2, 3)) {
        !          2242:                return PHP_GDIMG_TYPE_GD2;
        !          2243:        } else if (!memcmp(data, php_sig_jpg, 3)) {
        !          2244:                return PHP_GDIMG_TYPE_JPG;
        !          2245:        } else if (!memcmp(data, php_sig_png, 3)) {
        !          2246:                if (!memcmp(data, php_sig_png, 8)) {
        !          2247:                        return PHP_GDIMG_TYPE_PNG;
        !          2248:                }
        !          2249:        } else if (!memcmp(data, php_sig_gif, 3)) {
        !          2250:                return PHP_GDIMG_TYPE_GIF;
        !          2251:        }
        !          2252: #ifdef HAVE_GD_WBMP
        !          2253:        else {
        !          2254:                gdIOCtx *io_ctx;
        !          2255:                io_ctx = gdNewDynamicCtxEx(8, data, 0);
        !          2256:                if (io_ctx) {
        !          2257:                        if (getmbi((int(*)(void *)) gdGetC, io_ctx) == 0 && skipheader((int(*)(void *)) gdGetC, io_ctx) == 0 ) {
        !          2258: #if HAVE_LIBGD204
        !          2259:                                io_ctx->gd_free(io_ctx);
        !          2260: #else
        !          2261:                                io_ctx->free(io_ctx);
        !          2262: #endif
        !          2263:                                return PHP_GDIMG_TYPE_WBM;
        !          2264:                        } else {
        !          2265: #if HAVE_LIBGD204
        !          2266:                                io_ctx->gd_free(io_ctx);
        !          2267: #else
        !          2268:                                io_ctx->free(io_ctx);
        !          2269: #endif
        !          2270:                        }
        !          2271:                }
        !          2272:        }
        !          2273: #endif
        !          2274:        return -1;
        !          2275: #endif
        !          2276: }
        !          2277: /* }}} */
        !          2278: 
        !          2279: #ifdef HAVE_LIBGD15
        !          2280: /* {{{ _php_image_create_from_string
        !          2281:  */
        !          2282: gdImagePtr _php_image_create_from_string(zval **data, char *tn, gdImagePtr (*ioctx_func_p)() TSRMLS_DC)
        !          2283: {
        !          2284:        gdImagePtr im;
        !          2285:        gdIOCtx *io_ctx;
        !          2286: 
        !          2287:        io_ctx = gdNewDynamicCtxEx(Z_STRLEN_PP(data), Z_STRVAL_PP(data), 0);
        !          2288: 
        !          2289:        if (!io_ctx) {
        !          2290:                return NULL;
        !          2291:        }
        !          2292: 
        !          2293:        im = (*ioctx_func_p)(io_ctx);
        !          2294:        if (!im) {
        !          2295:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Passed data is not in '%s' format", tn);
        !          2296: #if HAVE_LIBGD204
        !          2297:                io_ctx->gd_free(io_ctx);
        !          2298: #else
        !          2299:                io_ctx->free(io_ctx);
        !          2300: #endif
        !          2301:                return NULL;
        !          2302:        }
        !          2303: 
        !          2304: #if HAVE_LIBGD204
        !          2305:        io_ctx->gd_free(io_ctx);
        !          2306: #else
        !          2307:        io_ctx->free(io_ctx);
        !          2308: #endif
        !          2309: 
        !          2310:        return im;
        !          2311: }
        !          2312: /* }}} */
        !          2313: 
        !          2314: /* {{{ proto resource imagecreatefromstring(string image)
        !          2315:    Create a new image from the image stream in the string */
        !          2316: PHP_FUNCTION(imagecreatefromstring)
        !          2317: {
        !          2318:        zval **data;
        !          2319:        gdImagePtr im;
        !          2320:        int imtype;
        !          2321:        char sig[8];
        !          2322: 
        !          2323:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &data) == FAILURE) {
        !          2324:                return;
        !          2325:        }
        !          2326: 
        !          2327:        convert_to_string_ex(data);
        !          2328:        if (Z_STRLEN_PP(data) < 8) {
        !          2329:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty string or invalid image");
        !          2330:                RETURN_FALSE;
        !          2331:        }
        !          2332: 
        !          2333:        memcpy(sig, Z_STRVAL_PP(data), 8);
        !          2334: 
        !          2335:        imtype = _php_image_type(sig);
        !          2336: 
        !          2337:        switch (imtype) {
        !          2338:                case PHP_GDIMG_TYPE_JPG:
        !          2339: #ifdef HAVE_GD_JPG
        !          2340:                        im = _php_image_create_from_string(data, "JPEG", gdImageCreateFromJpegCtx TSRMLS_CC);
        !          2341: #else
        !          2342:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "No JPEG support in this PHP build");
        !          2343:                        RETURN_FALSE;
        !          2344: #endif
        !          2345:                        break;
        !          2346: 
        !          2347:                case PHP_GDIMG_TYPE_PNG:
        !          2348: #ifdef HAVE_GD_PNG
        !          2349:                        im = _php_image_create_from_string(data, "PNG", gdImageCreateFromPngCtx TSRMLS_CC);
        !          2350: #else
        !          2351:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "No PNG support in this PHP build");
        !          2352:                        RETURN_FALSE;
        !          2353: #endif
        !          2354:                        break;
        !          2355: 
        !          2356:                case PHP_GDIMG_TYPE_GIF:
        !          2357: #ifdef HAVE_GD_GIF_READ
        !          2358:                        im = _php_image_create_from_string(data, "GIF", gdImageCreateFromGifCtx TSRMLS_CC);
        !          2359: #else
        !          2360:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "No GIF support in this PHP build");
        !          2361:                        RETURN_FALSE;
        !          2362: #endif
        !          2363:                        break;
        !          2364: 
        !          2365:                case PHP_GDIMG_TYPE_WBM:
        !          2366: #ifdef HAVE_GD_WBMP
        !          2367:                        im = _php_image_create_from_string(data, "WBMP", gdImageCreateFromWBMPCtx TSRMLS_CC);
        !          2368: #else
        !          2369:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "No WBMP support in this PHP build");
        !          2370:                        RETURN_FALSE;
        !          2371: #endif
        !          2372:                        break;
        !          2373: 
        !          2374:                case PHP_GDIMG_TYPE_GD2:
        !          2375: #ifdef HAVE_GD_GD2
        !          2376:                        im = _php_image_create_from_string(data, "GD2", gdImageCreateFromGd2Ctx TSRMLS_CC);
        !          2377: #else
        !          2378:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "No GD2 support in this PHP build");
        !          2379:                        RETURN_FALSE;
        !          2380: #endif
        !          2381:                        break;
        !          2382: 
        !          2383:                default:
        !          2384:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Data is not in a recognized format");
        !          2385:                        RETURN_FALSE;
        !          2386:        }
        !          2387: 
        !          2388:        if (!im) {
        !          2389:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't create GD Image Stream out of Data");
        !          2390:                RETURN_FALSE;
        !          2391:        }
        !          2392: 
        !          2393:        ZEND_REGISTER_RESOURCE(return_value, im, le_gd);
        !          2394: }
        !          2395: /* }}} */
        !          2396: #endif
        !          2397: 
        !          2398: /* {{{ _php_image_create_from
        !          2399:  */
        !          2400: static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(), gdImagePtr (*ioctx_func_p)())
        !          2401: {
        !          2402:        char *file;
        !          2403:        int file_len;
        !          2404:        long srcx, srcy, width, height;
        !          2405:        gdImagePtr im = NULL;
        !          2406:        php_stream *stream;
        !          2407:        FILE * fp = NULL;
        !          2408: #ifdef HAVE_GD_JPG
        !          2409:        long ignore_warning;
        !          2410: #endif
        !          2411:        if (image_type == PHP_GDIMG_TYPE_GD2PART) {
        !          2412:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sllll", &file, &file_len, &srcx, &srcy, &width, &height) == FAILURE) {
        !          2413:                        return;
        !          2414:                }
        !          2415:                if (width < 1 || height < 1) {
        !          2416:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Zero width or height not allowed");
        !          2417:                        RETURN_FALSE;
        !          2418:                }
        !          2419:        } else {
        !          2420:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &file, &file_len) == FAILURE) {
        !          2421:                        return;
        !          2422:                }
        !          2423:        }
        !          2424: 
        !          2425:        stream = php_stream_open_wrapper(file, "rb", ENFORCE_SAFE_MODE|REPORT_ERRORS|IGNORE_PATH|IGNORE_URL_WIN, NULL);
        !          2426:        if (stream == NULL)     {
        !          2427:                RETURN_FALSE;
        !          2428:        }
        !          2429: 
        !          2430: #ifndef USE_GD_IOCTX
        !          2431:        ioctx_func_p = NULL; /* don't allow sockets without IOCtx */
        !          2432: #endif
        !          2433: 
        !          2434:        /* try and avoid allocating a FILE* if the stream is not naturally a FILE* */
        !          2435:        if (php_stream_is(stream, PHP_STREAM_IS_STDIO)) {
        !          2436:                if (FAILURE == php_stream_cast(stream, PHP_STREAM_AS_STDIO, (void**)&fp, REPORT_ERRORS)) {
        !          2437:                        goto out_err;
        !          2438:                }
        !          2439:        } else if (ioctx_func_p) {
        !          2440: #ifdef USE_GD_IOCTX
        !          2441:                /* we can create an io context */
        !          2442:                gdIOCtx* io_ctx;
        !          2443:                size_t buff_size;
        !          2444:                char *buff;
        !          2445: 
        !          2446:                /* needs to be malloc (persistent) - GD will free() it later */
        !          2447:                buff_size = php_stream_copy_to_mem(stream, &buff, PHP_STREAM_COPY_ALL, 1);
        !          2448: 
        !          2449:                if (!buff_size) {
        !          2450:                        php_error_docref(NULL TSRMLS_CC, E_WARNING,"Cannot read image data");
        !          2451:                        goto out_err;
        !          2452:                }
        !          2453: 
        !          2454:                io_ctx = gdNewDynamicCtxEx(buff_size, buff, 0);
        !          2455:                if (!io_ctx) {
        !          2456:                        pefree(buff, 1);
        !          2457:                        php_error_docref(NULL TSRMLS_CC, E_WARNING,"Cannot allocate GD IO context");
        !          2458:                        goto out_err;
        !          2459:                }
        !          2460: 
        !          2461:                if (image_type == PHP_GDIMG_TYPE_GD2PART) {
        !          2462:                        im = (*ioctx_func_p)(io_ctx, srcx, srcy, width, height);
        !          2463:                } else {
        !          2464:                        im = (*ioctx_func_p)(io_ctx);
        !          2465:                }
        !          2466: #if HAVE_LIBGD204
        !          2467:                io_ctx->gd_free(io_ctx);
        !          2468: #else
        !          2469:                io_ctx->free(io_ctx);
        !          2470: #endif
        !          2471:                pefree(buff, 1);
        !          2472: #endif
        !          2473:        }
        !          2474:        else {
        !          2475:                /* try and force the stream to be FILE* */
        !          2476:                if (FAILURE == php_stream_cast(stream, PHP_STREAM_AS_STDIO | PHP_STREAM_CAST_TRY_HARD, (void **) &fp, REPORT_ERRORS)) {
        !          2477:                        goto out_err;
        !          2478:                }
        !          2479:        }
        !          2480: 
        !          2481:        if (!im && fp) {
        !          2482:                switch (image_type) {
        !          2483:                        case PHP_GDIMG_TYPE_GD2PART:
        !          2484:                                im = (*func_p)(fp, srcx, srcy, width, height);
        !          2485:                                break;
        !          2486: #if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED)
        !          2487:                        case PHP_GDIMG_TYPE_XPM:
        !          2488:                                im = gdImageCreateFromXpm(file);
        !          2489:                                break;
        !          2490: #endif
        !          2491: 
        !          2492: #ifdef HAVE_GD_JPG
        !          2493:                        case PHP_GDIMG_TYPE_JPG:
        !          2494:                                ignore_warning = INI_INT("gd.jpeg_ignore_warning");
        !          2495: #ifdef HAVE_GD_BUNDLED
        !          2496:                                im = gdImageCreateFromJpeg(fp, ignore_warning);
        !          2497: #else
        !          2498:                                im = gdImageCreateFromJpeg(fp);
        !          2499: #endif
        !          2500:                        break;
        !          2501: #endif
        !          2502: 
        !          2503:                        default:
        !          2504:                                im = (*func_p)(fp);
        !          2505:                                break;
        !          2506:                }
        !          2507: 
        !          2508:                fflush(fp);
        !          2509:        }
        !          2510: 
        !          2511:        if (im) {
        !          2512:                ZEND_REGISTER_RESOURCE(return_value, im, le_gd);
        !          2513:                php_stream_close(stream);
        !          2514:                return;
        !          2515:        }
        !          2516: 
        !          2517:        php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%s' is not a valid %s file", file, tn);
        !          2518: out_err:
        !          2519:        php_stream_close(stream);
        !          2520:        RETURN_FALSE;
        !          2521: 
        !          2522: }
        !          2523: /* }}} */
        !          2524: 
        !          2525: #ifdef HAVE_GD_GIF_READ
        !          2526: /* {{{ proto resource imagecreatefromgif(string filename)
        !          2527:    Create a new image from GIF file or URL */
        !          2528: PHP_FUNCTION(imagecreatefromgif)
        !          2529: {
        !          2530:        _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GIF, "GIF", gdImageCreateFromGif, gdImageCreateFromGifCtx);
        !          2531: }
        !          2532: /* }}} */
        !          2533: #endif /* HAVE_GD_GIF_READ */
        !          2534: 
        !          2535: #ifdef HAVE_GD_JPG
        !          2536: /* {{{ proto resource imagecreatefromjpeg(string filename)
        !          2537:    Create a new image from JPEG file or URL */
        !          2538: PHP_FUNCTION(imagecreatefromjpeg)
        !          2539: {
        !          2540:        _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_JPG, "JPEG", gdImageCreateFromJpeg, gdImageCreateFromJpegCtx);
        !          2541: }
        !          2542: /* }}} */
        !          2543: #endif /* HAVE_GD_JPG */
        !          2544: 
        !          2545: #ifdef HAVE_GD_PNG
        !          2546: /* {{{ proto resource imagecreatefrompng(string filename)
        !          2547:    Create a new image from PNG file or URL */
        !          2548: PHP_FUNCTION(imagecreatefrompng)
        !          2549: {
        !          2550:        _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_PNG, "PNG", gdImageCreateFromPng, gdImageCreateFromPngCtx);
        !          2551: }
        !          2552: /* }}} */
        !          2553: #endif /* HAVE_GD_PNG */
        !          2554: 
        !          2555: #ifdef HAVE_GD_XBM
        !          2556: /* {{{ proto resource imagecreatefromxbm(string filename)
        !          2557:    Create a new image from XBM file or URL */
        !          2558: PHP_FUNCTION(imagecreatefromxbm)
        !          2559: {
        !          2560:        _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_XBM, "XBM", gdImageCreateFromXbm, NULL);
        !          2561: }
        !          2562: /* }}} */
        !          2563: #endif /* HAVE_GD_XBM */
        !          2564: 
        !          2565: #if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED)
        !          2566: /* {{{ proto resource imagecreatefromxpm(string filename)
        !          2567:    Create a new image from XPM file or URL */
        !          2568: PHP_FUNCTION(imagecreatefromxpm)
        !          2569: {
        !          2570:        _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_XPM, "XPM", gdImageCreateFromXpm, NULL);
        !          2571: }
        !          2572: /* }}} */
        !          2573: #endif
        !          2574: 
        !          2575: #ifdef HAVE_GD_WBMP
        !          2576: /* {{{ proto resource imagecreatefromwbmp(string filename)
        !          2577:    Create a new image from WBMP file or URL */
        !          2578: PHP_FUNCTION(imagecreatefromwbmp)
        !          2579: {
        !          2580:        _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_WBM, "WBMP", gdImageCreateFromWBMP, gdImageCreateFromWBMPCtx);
        !          2581: }
        !          2582: /* }}} */
        !          2583: #endif /* HAVE_GD_WBMP */
        !          2584: 
        !          2585: /* {{{ proto resource imagecreatefromgd(string filename)
        !          2586:    Create a new image from GD file or URL */
        !          2587: PHP_FUNCTION(imagecreatefromgd)
        !          2588: {
        !          2589:        _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD, "GD", gdImageCreateFromGd, gdImageCreateFromGdCtx);
        !          2590: }
        !          2591: /* }}} */
        !          2592: 
        !          2593: #ifdef HAVE_GD_GD2
        !          2594: /* {{{ proto resource imagecreatefromgd2(string filename)
        !          2595:    Create a new image from GD2 file or URL */
        !          2596: PHP_FUNCTION(imagecreatefromgd2)
        !          2597: {
        !          2598:        _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD2, "GD2", gdImageCreateFromGd2, gdImageCreateFromGd2Ctx);
        !          2599: }
        !          2600: /* }}} */
        !          2601: 
        !          2602: /* {{{ proto resource imagecreatefromgd2part(string filename, int srcX, int srcY, int width, int height)
        !          2603:    Create a new image from a given part of GD2 file or URL */
        !          2604: PHP_FUNCTION(imagecreatefromgd2part)
        !          2605: {
        !          2606:        _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD2PART, "GD2", gdImageCreateFromGd2Part, gdImageCreateFromGd2PartCtx);
        !          2607: }
        !          2608: /* }}} */
        !          2609: #endif /* HAVE_GD_GD2 */
        !          2610: 
        !          2611: /* {{{ _php_image_output
        !          2612:  */
        !          2613: static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)())
        !          2614: {
        !          2615:        zval *imgind;
        !          2616:        char *file = NULL;
        !          2617:        long quality = 0, type = 0;
        !          2618:        gdImagePtr im;
        !          2619:        char *fn = NULL;
        !          2620:        FILE *fp;
        !          2621:        int file_len = 0, argc = ZEND_NUM_ARGS();
        !          2622:        int q = -1, i, t = 1;
        !          2623: 
        !          2624:        /* The quality parameter for Wbmp stands for the threshold when called from image2wbmp() */
        !          2625:        /* When called from imagewbmp() the quality parameter stands for the foreground color. Default: black. */
        !          2626:        /* The quality parameter for gd2 stands for chunk size */
        !          2627: 
        !          2628:        if (zend_parse_parameters(argc TSRMLS_CC, "r|sll", &imgind, &file, &file_len, &quality, &type) == FAILURE) {
        !          2629:                return;
        !          2630:        }
        !          2631: 
        !          2632:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &imgind, -1, "Image", le_gd);
        !          2633: 
        !          2634:        if (argc > 1) {
        !          2635:                fn = file;
        !          2636:                if (argc == 3) {
        !          2637:                        q = quality;
        !          2638:                }
        !          2639:                if (argc == 4) {
        !          2640:                        t = type;
        !          2641:                }
        !          2642:        }
        !          2643: 
        !          2644:        if (argc >= 2 && file_len) {
        !          2645:                if (strlen(file) != file_len) {
        !          2646:                        RETURN_FALSE;
        !          2647:                }
        !          2648:                PHP_GD_CHECK_OPEN_BASEDIR(fn, "Invalid filename");
        !          2649: 
        !          2650:                fp = VCWD_FOPEN(fn, "wb");
        !          2651:                if (!fp) {
        !          2652:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to open '%s' for writing", fn);
        !          2653:                        RETURN_FALSE;
        !          2654:                }
        !          2655: 
        !          2656:                switch (image_type) {
        !          2657: #ifdef HAVE_GD_WBMP
        !          2658:                        case PHP_GDIMG_CONVERT_WBM:
        !          2659:                                if (q == -1) {
        !          2660:                                        q = 0;
        !          2661:                                } else if (q < 0 || q > 255) {
        !          2662:                                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid threshold value '%d'. It must be between 0 and 255", q);
        !          2663:                                        q = 0;
        !          2664:                                }
        !          2665:                                gdImageWBMP(im, q, fp);
        !          2666:                                break;
        !          2667: #endif
        !          2668:                        case PHP_GDIMG_TYPE_JPG:
        !          2669:                                (*func_p)(im, fp, q);
        !          2670:                                break;
        !          2671:                        case PHP_GDIMG_TYPE_WBM:
        !          2672:                                for (i = 0; i < gdImageColorsTotal(im); i++) {
        !          2673:                                        if (gdImageRed(im, i) == 0) break;
        !          2674:                                }
        !          2675:                                (*func_p)(im, i, fp);
        !          2676:                                break;
        !          2677:                        case PHP_GDIMG_TYPE_GD:
        !          2678:                                if (im->trueColor){
        !          2679:                                        gdImageTrueColorToPalette(im,1,256);
        !          2680:                                }
        !          2681:                                (*func_p)(im, fp);
        !          2682:                                break;
        !          2683: #ifdef HAVE_GD_GD2
        !          2684:                        case PHP_GDIMG_TYPE_GD2:
        !          2685:                                if (q == -1) {
        !          2686:                                        q = 128;
        !          2687:                                }
        !          2688:                                (*func_p)(im, fp, q, t);
        !          2689:                                break;
        !          2690: #endif
        !          2691:                        default:
        !          2692:                                if (q == -1) {
        !          2693:                                        q = 128;
        !          2694:                                }
        !          2695:                                (*func_p)(im, fp, q, t);
        !          2696:                                break;
        !          2697:                }
        !          2698:                fflush(fp);
        !          2699:                fclose(fp);
        !          2700:        } else {
        !          2701:                int   b;
        !          2702:                FILE *tmp;
        !          2703:                char  buf[4096];
        !          2704:                char *path;
        !          2705: 
        !          2706:                tmp = php_open_temporary_file(NULL, NULL, &path TSRMLS_CC);
        !          2707:                if (tmp == NULL) {
        !          2708:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to open temporary file");
        !          2709:                        RETURN_FALSE;
        !          2710:                }
        !          2711: 
        !          2712:                switch (image_type) {
        !          2713: #ifdef HAVE_GD_WBMP
        !          2714:                        case PHP_GDIMG_CONVERT_WBM:
        !          2715:                                if (q == -1) {
        !          2716:                                        q = 0;
        !          2717:                                } else if (q < 0 || q > 255) {
        !          2718:                                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid threshold value '%d'. It must be between 0 and 255", q);
        !          2719:                                        q = 0;
        !          2720:                                }
        !          2721:                                gdImageWBMP(im, q, tmp);
        !          2722:                                break;
        !          2723: #endif
        !          2724:                        case PHP_GDIMG_TYPE_JPG:
        !          2725:                                (*func_p)(im, tmp, q);
        !          2726:                                break;
        !          2727:                        case PHP_GDIMG_TYPE_WBM:
        !          2728:                                for (i = 0; i < gdImageColorsTotal(im); i++) {
        !          2729:                                        if (gdImageRed(im, i) == 0) {
        !          2730:                                                break;
        !          2731:                                        }
        !          2732:                                }
        !          2733:                                (*func_p)(im, q, tmp);
        !          2734:                                break;
        !          2735:                        case PHP_GDIMG_TYPE_GD:
        !          2736:                                if (im->trueColor) {
        !          2737:                                        gdImageTrueColorToPalette(im,1,256);
        !          2738:                                }
        !          2739:                                (*func_p)(im, tmp);
        !          2740:                                break;
        !          2741: #ifdef HAVE_GD_GD2
        !          2742:                        case PHP_GDIMG_TYPE_GD2:
        !          2743:                                if (q == -1) {
        !          2744:                                        q = 128;
        !          2745:                                }
        !          2746:                                (*func_p)(im, tmp, q, t);
        !          2747:                                break;
        !          2748: #endif
        !          2749:                        default:
        !          2750:                                (*func_p)(im, tmp);
        !          2751:                                break;
        !          2752:                }
        !          2753: 
        !          2754:                fseek(tmp, 0, SEEK_SET);
        !          2755: 
        !          2756: #if APACHE && defined(CHARSET_EBCDIC)
        !          2757:                /* XXX this is unlikely to work any more thies@thieso.net */
        !          2758: 
        !          2759:                /* This is a binary file already: avoid EBCDIC->ASCII conversion */
        !          2760:                ap_bsetflag(php3_rqst->connection->client, B_EBCDIC2ASCII, 0);
        !          2761: #endif
        !          2762:                while ((b = fread(buf, 1, sizeof(buf), tmp)) > 0) {
        !          2763:                        php_write(buf, b TSRMLS_CC);
        !          2764:                }
        !          2765: 
        !          2766:                fclose(tmp);
        !          2767:                VCWD_UNLINK((const char *)path); /* make sure that the temporary file is removed */
        !          2768:                efree(path);
        !          2769:        }
        !          2770:        RETURN_TRUE;
        !          2771: }
        !          2772: /* }}} */
        !          2773: 
        !          2774: /* {{{ proto int imagexbm(int im, string filename [, int foreground])
        !          2775:    Output XBM image to browser or file */
        !          2776: #if HAVE_GD_BUNDLED
        !          2777: PHP_FUNCTION(imagexbm)
        !          2778: {
        !          2779:        _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_XBM, "XBM", gdImageXbmCtx);
        !          2780: }
        !          2781: #endif
        !          2782: /* }}} */
        !          2783: 
        !          2784: #ifdef HAVE_GD_GIF_CREATE
        !          2785: /* {{{ proto bool imagegif(resource im [, string filename])
        !          2786:    Output GIF image to browser or file */
        !          2787: PHP_FUNCTION(imagegif)
        !          2788: {
        !          2789: #ifdef HAVE_GD_GIF_CTX
        !          2790:        _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GIF, "GIF", gdImageGifCtx);
        !          2791: #else
        !          2792:        _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GIF, "GIF", gdImageGif);
        !          2793: #endif
        !          2794: }
        !          2795: /* }}} */
        !          2796: #endif /* HAVE_GD_GIF_CREATE */
        !          2797: 
        !          2798: #ifdef HAVE_GD_PNG
        !          2799: /* {{{ proto bool imagepng(resource im [, string filename])
        !          2800:    Output PNG image to browser or file */
        !          2801: PHP_FUNCTION(imagepng)
        !          2802: {
        !          2803: #ifdef USE_GD_IOCTX
        !          2804:        _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_PNG, "PNG", gdImagePngCtxEx);
        !          2805: #else
        !          2806:        _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_PNG, "PNG", gdImagePng);
        !          2807: #endif
        !          2808: }
        !          2809: /* }}} */
        !          2810: #endif /* HAVE_GD_PNG */
        !          2811: 
        !          2812: #ifdef HAVE_GD_JPG
        !          2813: /* {{{ proto bool imagejpeg(resource im [, string filename [, int quality]])
        !          2814:    Output JPEG image to browser or file */
        !          2815: PHP_FUNCTION(imagejpeg)
        !          2816: {
        !          2817: #ifdef USE_GD_IOCTX
        !          2818:        _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_JPG, "JPEG", gdImageJpegCtx);
        !          2819: #else
        !          2820:        _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_JPG, "JPEG", gdImageJpeg);
        !          2821: #endif
        !          2822: }
        !          2823: /* }}} */
        !          2824: #endif /* HAVE_GD_JPG */
        !          2825: 
        !          2826: #ifdef HAVE_GD_WBMP
        !          2827: /* {{{ proto bool imagewbmp(resource im [, string filename, [, int foreground]])
        !          2828:    Output WBMP image to browser or file */
        !          2829: PHP_FUNCTION(imagewbmp)
        !          2830: {
        !          2831: #ifdef USE_GD_IOCTX
        !          2832:        _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_WBM, "WBMP", gdImageWBMPCtx);
        !          2833: #else
        !          2834:        _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_WBM, "WBMP", gdImageWBMP);
        !          2835: #endif
        !          2836: }
        !          2837: /* }}} */
        !          2838: #endif /* HAVE_GD_WBMP */
        !          2839: 
        !          2840: /* {{{ proto bool imagegd(resource im [, string filename])
        !          2841:    Output GD image to browser or file */
        !          2842: PHP_FUNCTION(imagegd)
        !          2843: {
        !          2844:        _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD, "GD", gdImageGd);
        !          2845: }
        !          2846: /* }}} */
        !          2847: 
        !          2848: #ifdef HAVE_GD_GD2
        !          2849: /* {{{ proto bool imagegd2(resource im [, string filename, [, int chunk_size, [, int type]]])
        !          2850:    Output GD2 image to browser or file */
        !          2851: PHP_FUNCTION(imagegd2)
        !          2852: {
        !          2853:        _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD2, "GD2", gdImageGd2);
        !          2854: }
        !          2855: /* }}} */
        !          2856: #endif /* HAVE_GD_GD2 */
        !          2857: 
        !          2858: /* {{{ proto bool imagedestroy(resource im)
        !          2859:    Destroy an image */
        !          2860: PHP_FUNCTION(imagedestroy)
        !          2861: {
        !          2862:        zval *IM;
        !          2863:        gdImagePtr im;
        !          2864: 
        !          2865:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &IM) == FAILURE) {
        !          2866:                return;
        !          2867:        }
        !          2868: 
        !          2869:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          2870: 
        !          2871:        zend_list_delete(Z_LVAL_P(IM));
        !          2872: 
        !          2873:        RETURN_TRUE;
        !          2874: }
        !          2875: /* }}} */
        !          2876: 
        !          2877: 
        !          2878: /* {{{ proto int imagecolorallocate(resource im, int red, int green, int blue)
        !          2879:    Allocate a color for an image */
        !          2880: PHP_FUNCTION(imagecolorallocate)
        !          2881: {
        !          2882:        zval *IM;
        !          2883:        long red, green, blue;
        !          2884:        gdImagePtr im;
        !          2885:        int ct = (-1);
        !          2886: 
        !          2887:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlll", &IM, &red, &green, &blue) == FAILURE) {
        !          2888:                return;
        !          2889:        }
        !          2890: 
        !          2891:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          2892: 
        !          2893:        ct = gdImageColorAllocate(im, red, green, blue);
        !          2894:        if (ct < 0) {
        !          2895:                RETURN_FALSE;
        !          2896:        }
        !          2897:        RETURN_LONG(ct);
        !          2898: }
        !          2899: /* }}} */
        !          2900: 
        !          2901: #if HAVE_LIBGD15
        !          2902: /* {{{ proto void imagepalettecopy(resource dst, resource src)
        !          2903:    Copy the palette from the src image onto the dst image */
        !          2904: PHP_FUNCTION(imagepalettecopy)
        !          2905: {
        !          2906:        zval *dstim, *srcim;
        !          2907:        gdImagePtr dst, src;
        !          2908: 
        !          2909:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr", &dstim, &srcim) == FAILURE) {
        !          2910:                return;
        !          2911:        }
        !          2912: 
        !          2913:        ZEND_FETCH_RESOURCE(dst, gdImagePtr, &dstim, -1, "Image", le_gd);
        !          2914:        ZEND_FETCH_RESOURCE(src, gdImagePtr, &srcim, -1, "Image", le_gd);
        !          2915: 
        !          2916:        gdImagePaletteCopy(dst, src);
        !          2917: }
        !          2918: /* }}} */
        !          2919: #endif
        !          2920: 
        !          2921: /* {{{ proto int imagecolorat(resource im, int x, int y)
        !          2922:    Get the index of the color of a pixel */
        !          2923: PHP_FUNCTION(imagecolorat)
        !          2924: {
        !          2925:        zval *IM;
        !          2926:        long x, y;
        !          2927:        gdImagePtr im;
        !          2928: 
        !          2929:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &IM, &x, &y) == FAILURE) {
        !          2930:                return;
        !          2931:        }
        !          2932: 
        !          2933:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          2934: 
        !          2935:        if (gdImageTrueColor(im)) {
        !          2936:                if (im->tpixels && gdImageBoundsSafe(im, x, y)) {
        !          2937:                        RETURN_LONG(gdImageTrueColorPixel(im, x, y));
        !          2938:                } else {
        !          2939:                        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%ld,%ld is out of bounds", x, y);
        !          2940:                        RETURN_FALSE;
        !          2941:                }
        !          2942:        } else {
        !          2943:                if (im->pixels && gdImageBoundsSafe(im, x, y)) {
        !          2944:                        RETURN_LONG(im->pixels[y][x]);
        !          2945:                } else {
        !          2946:                        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%ld,%ld is out of bounds", x, y);
        !          2947:                        RETURN_FALSE;
        !          2948:                }
        !          2949:        }
        !          2950: }
        !          2951: /* }}} */
        !          2952: 
        !          2953: /* {{{ proto int imagecolorclosest(resource im, int red, int green, int blue)
        !          2954:    Get the index of the closest color to the specified color */
        !          2955: PHP_FUNCTION(imagecolorclosest)
        !          2956: {
        !          2957:        zval *IM;
        !          2958:        long red, green, blue;
        !          2959:        gdImagePtr im;
        !          2960: 
        !          2961:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlll", &IM, &red, &green, &blue) == FAILURE) {
        !          2962:                return;
        !          2963:        }
        !          2964: 
        !          2965:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          2966: 
        !          2967:        RETURN_LONG(gdImageColorClosest(im, red, green, blue));
        !          2968: }
        !          2969: /* }}} */
        !          2970: 
        !          2971: #if HAVE_COLORCLOSESTHWB
        !          2972: /* {{{ proto int imagecolorclosesthwb(resource im, int red, int green, int blue)
        !          2973:    Get the index of the color which has the hue, white and blackness nearest to the given color */
        !          2974: PHP_FUNCTION(imagecolorclosesthwb)
        !          2975: {
        !          2976:        zval *IM;
        !          2977:        long red, green, blue;
        !          2978:        gdImagePtr im;
        !          2979: 
        !          2980:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlll", &IM, &red, &green, &blue) == FAILURE) {
        !          2981:                return;
        !          2982:        }
        !          2983: 
        !          2984:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          2985: 
        !          2986:        RETURN_LONG(gdImageColorClosestHWB(im, red, green, blue));
        !          2987: }
        !          2988: /* }}} */
        !          2989: #endif
        !          2990: 
        !          2991: /* {{{ proto bool imagecolordeallocate(resource im, int index)
        !          2992:    De-allocate a color for an image */
        !          2993: PHP_FUNCTION(imagecolordeallocate)
        !          2994: {
        !          2995:        zval *IM;
        !          2996:        long index;
        !          2997:        int col;
        !          2998:        gdImagePtr im;
        !          2999: 
        !          3000:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &IM, &index) == FAILURE) {
        !          3001:                return;
        !          3002:        }
        !          3003: 
        !          3004:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3005: 
        !          3006:        /* We can return right away for a truecolor image as deallocating colours is meaningless here */
        !          3007:        if (gdImageTrueColor(im)) {
        !          3008:                RETURN_TRUE;
        !          3009:        }
        !          3010: 
        !          3011:        col = index;
        !          3012: 
        !          3013:        if (col >= 0 && col < gdImageColorsTotal(im)) {
        !          3014:                gdImageColorDeallocate(im, col);
        !          3015:                RETURN_TRUE;
        !          3016:        } else {
        !          3017:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Color index %d out of range",      col);
        !          3018:                RETURN_FALSE;
        !          3019:        }
        !          3020: }
        !          3021: /* }}} */
        !          3022: 
        !          3023: /* {{{ proto int imagecolorresolve(resource im, int red, int green, int blue)
        !          3024:    Get the index of the specified color or its closest possible alternative */
        !          3025: PHP_FUNCTION(imagecolorresolve)
        !          3026: {
        !          3027:        zval *IM;
        !          3028:        long red, green, blue;
        !          3029:        gdImagePtr im;
        !          3030: 
        !          3031:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlll", &IM, &red, &green, &blue) == FAILURE) {
        !          3032:                return;
        !          3033:        }
        !          3034: 
        !          3035:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3036: 
        !          3037:        RETURN_LONG(gdImageColorResolve(im, red, green, blue));
        !          3038: }
        !          3039: /* }}} */
        !          3040: 
        !          3041: /* {{{ proto int imagecolorexact(resource im, int red, int green, int blue)
        !          3042:    Get the index of the specified color */
        !          3043: PHP_FUNCTION(imagecolorexact)
        !          3044: {
        !          3045:        zval *IM;
        !          3046:        long red, green, blue;
        !          3047:        gdImagePtr im;
        !          3048: 
        !          3049:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlll", &IM, &red, &green, &blue) == FAILURE) {
        !          3050:                return;
        !          3051:        }
        !          3052: 
        !          3053:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3054: 
        !          3055:        RETURN_LONG(gdImageColorExact(im, red, green, blue));
        !          3056: }
        !          3057: /* }}} */
        !          3058: 
        !          3059: /* {{{ proto void imagecolorset(resource im, int col, int red, int green, int blue)
        !          3060:    Set the color for the specified palette index */
        !          3061: PHP_FUNCTION(imagecolorset)
        !          3062: {
        !          3063:        zval *IM;
        !          3064:        long color, red, green, blue;
        !          3065:        int col;
        !          3066:        gdImagePtr im;
        !          3067: 
        !          3068:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &IM, &color, &red, &green, &blue) == FAILURE) {
        !          3069:                return;
        !          3070:        }
        !          3071: 
        !          3072:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3073: 
        !          3074:        col = color;
        !          3075: 
        !          3076:        if (col >= 0 && col < gdImageColorsTotal(im)) {
        !          3077:                im->red[col]   = red;
        !          3078:                im->green[col] = green;
        !          3079:                im->blue[col]  = blue;
        !          3080:        } else {
        !          3081:                RETURN_FALSE;
        !          3082:        }
        !          3083: }
        !          3084: /* }}} */
        !          3085: 
        !          3086: /* {{{ proto array imagecolorsforindex(resource im, int col)
        !          3087:    Get the colors for an index */
        !          3088: PHP_FUNCTION(imagecolorsforindex)
        !          3089: {
        !          3090:        zval *IM;
        !          3091:        long index;
        !          3092:        int col;
        !          3093:        gdImagePtr im;
        !          3094: 
        !          3095:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &IM, &index) == FAILURE) {
        !          3096:                return;
        !          3097:        }
        !          3098: 
        !          3099:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3100: 
        !          3101:        col = index;
        !          3102: 
        !          3103:        if ((col >= 0 && gdImageTrueColor(im)) || (!gdImageTrueColor(im) && col >= 0 && col < gdImageColorsTotal(im))) {
        !          3104:                array_init(return_value);
        !          3105: 
        !          3106:                add_assoc_long(return_value,"red",  gdImageRed(im,col));
        !          3107:                add_assoc_long(return_value,"green", gdImageGreen(im,col));
        !          3108:                add_assoc_long(return_value,"blue", gdImageBlue(im,col));
        !          3109:                add_assoc_long(return_value,"alpha", gdImageAlpha(im,col));
        !          3110:        } else {
        !          3111:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Color index %d out of range", col);
        !          3112:                RETURN_FALSE;
        !          3113:        }
        !          3114: }
        !          3115: /* }}} */
        !          3116: 
        !          3117: /* {{{ proto bool imagegammacorrect(resource im, float inputgamma, float outputgamma)
        !          3118:    Apply a gamma correction to a GD image */
        !          3119: PHP_FUNCTION(imagegammacorrect)
        !          3120: {
        !          3121:        zval *IM;
        !          3122:        gdImagePtr im;
        !          3123:        int i;
        !          3124:        double input, output;
        !          3125: 
        !          3126:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rdd", &IM, &input, &output) == FAILURE) {
        !          3127:                return;
        !          3128:        }
        !          3129: 
        !          3130:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3131: 
        !          3132:        if (gdImageTrueColor(im))       {
        !          3133:                int x, y, c;
        !          3134: 
        !          3135:                for (y = 0; y < gdImageSY(im); y++)     {
        !          3136:                        for (x = 0; x < gdImageSX(im); x++)     {
        !          3137:                                c = gdImageGetPixel(im, x, y);
        !          3138:                                gdImageSetPixel(im, x, y,
        !          3139:                                        gdTrueColor(
        !          3140:                                                (int) ((pow((pow((gdTrueColorGetRed(c)   / 255.0), input)), 1.0 / output) * 255) + .5),
        !          3141:                                                (int) ((pow((pow((gdTrueColorGetGreen(c) / 255.0), input)), 1.0 / output) * 255) + .5),
        !          3142:                                                (int) ((pow((pow((gdTrueColorGetBlue(c)  / 255.0), input)), 1.0 / output) * 255) + .5)
        !          3143:                                        )
        !          3144:                                );
        !          3145:                        }
        !          3146:                }
        !          3147:                RETURN_TRUE;
        !          3148:        }
        !          3149: 
        !          3150:        for (i = 0; i < gdImageColorsTotal(im); i++) {
        !          3151:                im->red[i]   = (int)((pow((pow((im->red[i]   / 255.0), input)), 1.0 / output) * 255) + .5);
        !          3152:                im->green[i] = (int)((pow((pow((im->green[i] / 255.0), input)), 1.0 / output) * 255) + .5);
        !          3153:                im->blue[i]  = (int)((pow((pow((im->blue[i]  / 255.0), input)), 1.0 / output) * 255) + .5);
        !          3154:        }
        !          3155: 
        !          3156:        RETURN_TRUE;
        !          3157: }
        !          3158: /* }}} */
        !          3159: 
        !          3160: /* {{{ proto bool imagesetpixel(resource im, int x, int y, int col)
        !          3161:    Set a single pixel */
        !          3162: PHP_FUNCTION(imagesetpixel)
        !          3163: {
        !          3164:        zval *IM;
        !          3165:        long x, y, col;
        !          3166:        gdImagePtr im;
        !          3167: 
        !          3168:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlll", &IM, &x, &y, &col) == FAILURE) {
        !          3169:                return;
        !          3170:        }
        !          3171: 
        !          3172:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3173:        gdImageSetPixel(im, x, y, col);
        !          3174:        RETURN_TRUE;
        !          3175: }
        !          3176: /* }}} */
        !          3177: 
        !          3178: /* {{{ proto bool imageline(resource im, int x1, int y1, int x2, int y2, int col)
        !          3179:    Draw a line */
        !          3180: PHP_FUNCTION(imageline)
        !          3181: {
        !          3182:        zval *IM;
        !          3183:        long x1, y1, x2, y2, col;
        !          3184:        gdImagePtr im;
        !          3185: 
        !          3186:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllll", &IM, &x1, &y1, &x2, &y2, &col) == FAILURE) {
        !          3187:                return;
        !          3188:        }
        !          3189: 
        !          3190:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3191: 
        !          3192: #ifdef HAVE_GD_BUNDLED
        !          3193:        if (im->antialias) {
        !          3194:                gdImageAALine(im, x1, y1, x2, y2, col);
        !          3195:        } else
        !          3196: #endif
        !          3197:        {
        !          3198:                gdImageLine(im, x1, y1, x2, y2, col);
        !          3199:        }
        !          3200:        RETURN_TRUE;
        !          3201: }
        !          3202: /* }}} */
        !          3203: 
        !          3204: /* {{{ proto bool imagedashedline(resource im, int x1, int y1, int x2, int y2, int col)
        !          3205:    Draw a dashed line */
        !          3206: PHP_FUNCTION(imagedashedline)
        !          3207: {
        !          3208:        zval *IM;
        !          3209:        long x1, y1, x2, y2, col;
        !          3210:        gdImagePtr im;
        !          3211: 
        !          3212:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllll", &IM, &x1, &y1, &x2, &y2, &col) == FAILURE) {
        !          3213:                return;
        !          3214:        }
        !          3215: 
        !          3216:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3217:        gdImageDashedLine(im, x1, y1, x2, y2, col);
        !          3218:        RETURN_TRUE;
        !          3219: }
        !          3220: /* }}} */
        !          3221: 
        !          3222: /* {{{ proto bool imagerectangle(resource im, int x1, int y1, int x2, int y2, int col)
        !          3223:    Draw a rectangle */
        !          3224: PHP_FUNCTION(imagerectangle)
        !          3225: {
        !          3226:        zval *IM;
        !          3227:        long x1, y1, x2, y2, col;
        !          3228:        gdImagePtr im;
        !          3229: 
        !          3230:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllll", &IM, &x1, &y1, &x2, &y2, &col) == FAILURE) {
        !          3231:                return;
        !          3232:        }
        !          3233: 
        !          3234:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3235:        gdImageRectangle(im, x1, y1, x2, y2, col);
        !          3236:        RETURN_TRUE;
        !          3237: }
        !          3238: /* }}} */
        !          3239: 
        !          3240: /* {{{ proto bool imagefilledrectangle(resource im, int x1, int y1, int x2, int y2, int col)
        !          3241:    Draw a filled rectangle */
        !          3242: PHP_FUNCTION(imagefilledrectangle)
        !          3243: {
        !          3244:        zval *IM;
        !          3245:        long x1, y1, x2, y2, col;
        !          3246:        gdImagePtr im;
        !          3247: 
        !          3248:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllll", &IM, &x1, &y1, &x2, &y2, &col) == FAILURE) {
        !          3249:                return;
        !          3250:        }
        !          3251: 
        !          3252:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3253:        gdImageFilledRectangle(im, x1, y1, x2, y2, col);
        !          3254:        RETURN_TRUE;
        !          3255: }
        !          3256: /* }}} */
        !          3257: 
        !          3258: /* {{{ proto bool imagearc(resource im, int cx, int cy, int w, int h, int s, int e, int col)
        !          3259:    Draw a partial ellipse */
        !          3260: PHP_FUNCTION(imagearc)
        !          3261: {
        !          3262:        zval *IM;
        !          3263:        long cx, cy, w, h, ST, E, col;
        !          3264:        gdImagePtr im;
        !          3265:        int e, st;
        !          3266: 
        !          3267:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllllll", &IM, &cx, &cy, &w, &h, &ST, &E, &col) == FAILURE) {
        !          3268:                return;
        !          3269:        }
        !          3270: 
        !          3271:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3272: 
        !          3273:        e = E;
        !          3274:        if (e < 0) {
        !          3275:                e %= 360;
        !          3276:        }
        !          3277: 
        !          3278:        st = ST;
        !          3279:        if (st < 0) {
        !          3280:                st %= 360;
        !          3281:        }
        !          3282: 
        !          3283:        gdImageArc(im, cx, cy, w, h, st, e, col);
        !          3284:        RETURN_TRUE;
        !          3285: }
        !          3286: /* }}} */
        !          3287: 
        !          3288: /* {{{ proto bool imageellipse(resource im, int cx, int cy, int w, int h, int color)
        !          3289:    Draw an ellipse */
        !          3290: PHP_FUNCTION(imageellipse)
        !          3291: {
        !          3292:        zval *IM;
        !          3293:        long cx, cy, w, h, color;
        !          3294:        gdImagePtr im;
        !          3295: 
        !          3296:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllll", &IM, &cx, &cy, &w, &h, &color) == FAILURE) {
        !          3297:                return;
        !          3298:        }
        !          3299: 
        !          3300:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3301: 
        !          3302:        gdImageEllipse(im, cx, cy, w, h, color);
        !          3303:        RETURN_TRUE;
        !          3304: }
        !          3305: /* }}} */
        !          3306: 
        !          3307: /* {{{ proto bool imagefilltoborder(resource im, int x, int y, int border, int col)
        !          3308:    Flood fill to specific color */
        !          3309: PHP_FUNCTION(imagefilltoborder)
        !          3310: {
        !          3311:        zval *IM;
        !          3312:        long x, y, border, col;
        !          3313:        gdImagePtr im;
        !          3314: 
        !          3315:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll", &IM, &x, &y, &border, &col) == FAILURE) {
        !          3316:                return;
        !          3317:        }
        !          3318: 
        !          3319:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3320:        gdImageFillToBorder(im, x, y, border, col);
        !          3321:        RETURN_TRUE;
        !          3322: }
        !          3323: /* }}} */
        !          3324: 
        !          3325: /* {{{ proto bool imagefill(resource im, int x, int y, int col)
        !          3326:    Flood fill */
        !          3327: PHP_FUNCTION(imagefill)
        !          3328: {
        !          3329:        zval *IM;
        !          3330:        long x, y, col;
        !          3331:        gdImagePtr im;
        !          3332: 
        !          3333:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlll", &IM, &x, &y, &col) == FAILURE) {
        !          3334:                return;
        !          3335:        }
        !          3336: 
        !          3337:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3338:        gdImageFill(im, x, y, col);
        !          3339:        RETURN_TRUE;
        !          3340: }
        !          3341: /* }}} */
        !          3342: 
        !          3343: /* {{{ proto int imagecolorstotal(resource im)
        !          3344:    Find out the number of colors in an image's palette */
        !          3345: PHP_FUNCTION(imagecolorstotal)
        !          3346: {
        !          3347:        zval *IM;
        !          3348:        gdImagePtr im;
        !          3349: 
        !          3350:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &IM) == FAILURE) {
        !          3351:                return;
        !          3352:        }
        !          3353: 
        !          3354:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3355: 
        !          3356:        RETURN_LONG(gdImageColorsTotal(im));
        !          3357: }
        !          3358: /* }}} */
        !          3359: 
        !          3360: /* {{{ proto int imagecolortransparent(resource im [, int col])
        !          3361:    Define a color as transparent */
        !          3362: PHP_FUNCTION(imagecolortransparent)
        !          3363: {
        !          3364:        zval *IM;
        !          3365:        long COL = 0;
        !          3366:        gdImagePtr im;
        !          3367:        int argc = ZEND_NUM_ARGS();
        !          3368: 
        !          3369:        if (zend_parse_parameters(argc TSRMLS_CC, "r|l", &IM, &COL) == FAILURE) {
        !          3370:                return;
        !          3371:        }
        !          3372: 
        !          3373:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3374: 
        !          3375:        if (argc > 1) {
        !          3376:                gdImageColorTransparent(im, COL);
        !          3377:        }
        !          3378: 
        !          3379:        RETURN_LONG(gdImageGetTransparent(im));
        !          3380: }
        !          3381: /* }}} */
        !          3382: 
        !          3383: /* {{{ proto int imageinterlace(resource im [, int interlace])
        !          3384:    Enable or disable interlace */
        !          3385: PHP_FUNCTION(imageinterlace)
        !          3386: {
        !          3387:        zval *IM;
        !          3388:        int argc = ZEND_NUM_ARGS();
        !          3389:        long INT = 0;
        !          3390:        gdImagePtr im;
        !          3391: 
        !          3392:        if (zend_parse_parameters(argc TSRMLS_CC, "r|l", &IM, &INT) == FAILURE) {
        !          3393:                return;
        !          3394:        }
        !          3395: 
        !          3396:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3397: 
        !          3398:        if (argc > 1) {
        !          3399:                gdImageInterlace(im, INT);
        !          3400:        }
        !          3401: 
        !          3402:        RETURN_LONG(gdImageGetInterlaced(im));
        !          3403: }
        !          3404: /* }}} */
        !          3405: 
        !          3406: /* {{{ php_imagepolygon
        !          3407:    arg = 0  normal polygon
        !          3408:    arg = 1  filled polygon */
        !          3409: /* im, points, num_points, col */
        !          3410: static void php_imagepolygon(INTERNAL_FUNCTION_PARAMETERS, int filled)
        !          3411: {
        !          3412:        zval *IM, *POINTS;
        !          3413:        long NPOINTS, COL;
        !          3414:        zval **var = NULL;
        !          3415:        gdImagePtr im;
        !          3416:        gdPointPtr points;
        !          3417:        int npoints, col, nelem, i;
        !          3418: 
        !          3419:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rall", &IM, &POINTS, &NPOINTS, &COL) == FAILURE) {
        !          3420:                return;
        !          3421:        }
        !          3422: 
        !          3423:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3424: 
        !          3425:        npoints = NPOINTS;
        !          3426:        col = COL;
        !          3427: 
        !          3428:        nelem = zend_hash_num_elements(Z_ARRVAL_P(POINTS));
        !          3429:        if (nelem < 6) {
        !          3430:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must have at least 3 points in your array");
        !          3431:                RETURN_FALSE;
        !          3432:        }
        !          3433:        if (npoints <= 0) {
        !          3434:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must give a positive number of points");
        !          3435:                RETURN_FALSE;
        !          3436:        }
        !          3437:        if (nelem < npoints * 2) {
        !          3438:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Trying to use %d points in array with only %d points", npoints, nelem/2);
        !          3439:                RETURN_FALSE;
        !          3440:        }
        !          3441: 
        !          3442:        points = (gdPointPtr) safe_emalloc(npoints, sizeof(gdPoint), 0);
        !          3443: 
        !          3444:        for (i = 0; i < npoints; i++) {
        !          3445:                if (zend_hash_index_find(Z_ARRVAL_P(POINTS), (i * 2), (void **) &var) == SUCCESS) {
        !          3446:                        SEPARATE_ZVAL((var));
        !          3447:                        convert_to_long(*var);
        !          3448:                        points[i].x = Z_LVAL_PP(var);
        !          3449:                }
        !          3450:                if (zend_hash_index_find(Z_ARRVAL_P(POINTS), (i * 2) + 1, (void **) &var) == SUCCESS) {
        !          3451:                        SEPARATE_ZVAL(var);
        !          3452:                        convert_to_long(*var);
        !          3453:                        points[i].y = Z_LVAL_PP(var);
        !          3454:                }
        !          3455:        }
        !          3456: 
        !          3457:        if (filled) {
        !          3458:                gdImageFilledPolygon(im, points, npoints, col);
        !          3459:        } else {
        !          3460:                gdImagePolygon(im, points, npoints, col);
        !          3461:        }
        !          3462: 
        !          3463:        efree(points);
        !          3464:        RETURN_TRUE;
        !          3465: }
        !          3466: /* }}} */
        !          3467: 
        !          3468: /* {{{ proto bool imagepolygon(resource im, array point, int num_points, int col)
        !          3469:    Draw a polygon */
        !          3470: PHP_FUNCTION(imagepolygon)
        !          3471: {
        !          3472:        php_imagepolygon(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
        !          3473: }
        !          3474: /* }}} */
        !          3475: 
        !          3476: /* {{{ proto bool imagefilledpolygon(resource im, array point, int num_points, int col)
        !          3477:    Draw a filled polygon */
        !          3478: PHP_FUNCTION(imagefilledpolygon)
        !          3479: {
        !          3480:        php_imagepolygon(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
        !          3481: }
        !          3482: /* }}} */
        !          3483: 
        !          3484: /* {{{ php_find_gd_font
        !          3485:  */
        !          3486: static gdFontPtr php_find_gd_font(int size TSRMLS_DC)
        !          3487: {
        !          3488:        gdFontPtr font;
        !          3489:        int ind_type;
        !          3490: 
        !          3491:        switch (size) {
        !          3492:                case 1:
        !          3493:                         font = gdFontTiny;
        !          3494:                         break;
        !          3495:                case 2:
        !          3496:                         font = gdFontSmall;
        !          3497:                         break;
        !          3498:                case 3:
        !          3499:                         font = gdFontMediumBold;
        !          3500:                         break;
        !          3501:                case 4:
        !          3502:                         font = gdFontLarge;
        !          3503:                         break;
        !          3504:                case 5:
        !          3505:                         font = gdFontGiant;
        !          3506:                         break;
        !          3507:                default:
        !          3508:                        font = zend_list_find(size - 5, &ind_type);
        !          3509:                         if (!font || ind_type != le_gd_font) {
        !          3510:                                  if (size < 1) {
        !          3511:                                           font = gdFontTiny;
        !          3512:                                  } else {
        !          3513:                                           font = gdFontGiant;
        !          3514:                                  }
        !          3515:                         }
        !          3516:                         break;
        !          3517:        }
        !          3518: 
        !          3519:        return font;
        !          3520: }
        !          3521: /* }}} */
        !          3522: 
        !          3523: /* {{{ php_imagefontsize
        !          3524:  * arg = 0  ImageFontWidth
        !          3525:  * arg = 1  ImageFontHeight
        !          3526:  */
        !          3527: static void php_imagefontsize(INTERNAL_FUNCTION_PARAMETERS, int arg)
        !          3528: {
        !          3529:        long SIZE;
        !          3530:        gdFontPtr font;
        !          3531: 
        !          3532:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &SIZE) == FAILURE) {
        !          3533:                return;
        !          3534:        }
        !          3535: 
        !          3536:        font = php_find_gd_font(SIZE TSRMLS_CC);
        !          3537:        RETURN_LONG(arg ? font->h : font->w);
        !          3538: }
        !          3539: /* }}} */
        !          3540: 
        !          3541: /* {{{ proto int imagefontwidth(int font)
        !          3542:    Get font width */
        !          3543: PHP_FUNCTION(imagefontwidth)
        !          3544: {
        !          3545:        php_imagefontsize(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
        !          3546: }
        !          3547: /* }}} */
        !          3548: 
        !          3549: /* {{{ proto int imagefontheight(int font)
        !          3550:    Get font height */
        !          3551: PHP_FUNCTION(imagefontheight)
        !          3552: {
        !          3553:        php_imagefontsize(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
        !          3554: }
        !          3555: /* }}} */
        !          3556: 
        !          3557: /* {{{ php_gdimagecharup
        !          3558:  * workaround for a bug in gd 1.2 */
        !          3559: static void php_gdimagecharup(gdImagePtr im, gdFontPtr f, int x, int y, int c, int color)
        !          3560: {
        !          3561:        int cx, cy, px, py, fline;
        !          3562:        cx = 0;
        !          3563:        cy = 0;
        !          3564: 
        !          3565:        if ((c < f->offset) || (c >= (f->offset + f->nchars))) {
        !          3566:                return;
        !          3567:        }
        !          3568: 
        !          3569:        fline = (c - f->offset) * f->h * f->w;
        !          3570:        for (py = y; (py > (y - f->w)); py--) {
        !          3571:                for (px = x; (px < (x + f->h)); px++) {
        !          3572:                        if (f->data[fline + cy * f->w + cx]) {
        !          3573:                                gdImageSetPixel(im, px, py, color);
        !          3574:                        }
        !          3575:                        cy++;
        !          3576:                }
        !          3577:                cy = 0;
        !          3578:                cx++;
        !          3579:        }
        !          3580: }
        !          3581: /* }}} */
        !          3582: 
        !          3583: /* {{{ php_imagechar
        !          3584:  * arg = 0  ImageChar
        !          3585:  * arg = 1  ImageCharUp
        !          3586:  * arg = 2  ImageString
        !          3587:  * arg = 3  ImageStringUp
        !          3588:  */
        !          3589: static void php_imagechar(INTERNAL_FUNCTION_PARAMETERS, int mode)
        !          3590: {
        !          3591:        zval *IM;
        !          3592:        long SIZE, X, Y, COL;
        !          3593:        char *C;
        !          3594:        int C_len;
        !          3595:        gdImagePtr im;
        !          3596:        int ch = 0, col, x, y, size, i, l = 0;
        !          3597:        unsigned char *str = NULL;
        !          3598:        gdFontPtr font;
        !          3599: 
        !          3600:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlllsl", &IM, &SIZE, &X, &Y, &C, &C_len, &COL) == FAILURE) {
        !          3601:                return;
        !          3602:        }
        !          3603: 
        !          3604:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3605: 
        !          3606:        col = COL;
        !          3607: 
        !          3608:        if (mode < 2) {
        !          3609:                ch = (int)((unsigned char)*C);
        !          3610:        } else {
        !          3611:                str = (unsigned char *) estrndup(C, C_len);
        !          3612:                l = strlen((char *)str);
        !          3613:        }
        !          3614: 
        !          3615:        y = Y;
        !          3616:        x = X;
        !          3617:        size = SIZE;
        !          3618: 
        !          3619:        font = php_find_gd_font(size TSRMLS_CC);
        !          3620: 
        !          3621:        switch (mode) {
        !          3622:                case 0:
        !          3623:                        gdImageChar(im, font, x, y, ch, col);
        !          3624:                        break;
        !          3625:                case 1:
        !          3626:                        php_gdimagecharup(im, font, x, y, ch, col);
        !          3627:                        break;
        !          3628:                case 2:
        !          3629:                        for (i = 0; (i < l); i++) {
        !          3630:                                gdImageChar(im, font, x, y, (int) ((unsigned char) str[i]), col);
        !          3631:                                x += font->w;
        !          3632:                        }
        !          3633:                        break;
        !          3634:                case 3: {
        !          3635:                        for (i = 0; (i < l); i++) {
        !          3636:                                /* php_gdimagecharup(im, font, x, y, (int) str[i], col); */
        !          3637:                                gdImageCharUp(im, font, x, y, (int) str[i], col);
        !          3638:                                y -= font->w;
        !          3639:                        }
        !          3640:                        break;
        !          3641:                }
        !          3642:        }
        !          3643:        if (str) {
        !          3644:                efree(str);
        !          3645:        }
        !          3646:        RETURN_TRUE;
        !          3647: }
        !          3648: /* }}} */
        !          3649: 
        !          3650: /* {{{ proto bool imagechar(resource im, int font, int x, int y, string c, int col)
        !          3651:    Draw a character */
        !          3652: PHP_FUNCTION(imagechar)
        !          3653: {
        !          3654:        php_imagechar(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
        !          3655: }
        !          3656: /* }}} */
        !          3657: 
        !          3658: /* {{{ proto bool imagecharup(resource im, int font, int x, int y, string c, int col)
        !          3659:    Draw a character rotated 90 degrees counter-clockwise */
        !          3660: PHP_FUNCTION(imagecharup)
        !          3661: {
        !          3662:        php_imagechar(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
        !          3663: }
        !          3664: /* }}} */
        !          3665: 
        !          3666: /* {{{ proto bool imagestring(resource im, int font, int x, int y, string str, int col)
        !          3667:    Draw a string horizontally */
        !          3668: PHP_FUNCTION(imagestring)
        !          3669: {
        !          3670:        php_imagechar(INTERNAL_FUNCTION_PARAM_PASSTHRU, 2);
        !          3671: }
        !          3672: /* }}} */
        !          3673: 
        !          3674: /* {{{ proto bool imagestringup(resource im, int font, int x, int y, string str, int col)
        !          3675:    Draw a string vertically - rotated 90 degrees counter-clockwise */
        !          3676: PHP_FUNCTION(imagestringup)
        !          3677: {
        !          3678:        php_imagechar(INTERNAL_FUNCTION_PARAM_PASSTHRU, 3);
        !          3679: }
        !          3680: /* }}} */
        !          3681: 
        !          3682: /* {{{ proto bool imagecopy(resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h)
        !          3683:    Copy part of an image */
        !          3684: PHP_FUNCTION(imagecopy)
        !          3685: {
        !          3686:        zval *SIM, *DIM;
        !          3687:        long SX, SY, SW, SH, DX, DY;
        !          3688:        gdImagePtr im_dst, im_src;
        !          3689:        int srcH, srcW, srcY, srcX, dstY, dstX;
        !          3690: 
        !          3691:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrllllll", &DIM, &SIM, &DX, &DY, &SX, &SY, &SW, &SH) == FAILURE) {
        !          3692:                return;
        !          3693:        }
        !          3694: 
        !          3695:        ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd);
        !          3696:        ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, &DIM, -1, "Image", le_gd);
        !          3697: 
        !          3698:        srcX = SX;
        !          3699:        srcY = SY;
        !          3700:        srcH = SH;
        !          3701:        srcW = SW;
        !          3702:        dstX = DX;
        !          3703:        dstY = DY;
        !          3704: 
        !          3705:        gdImageCopy(im_dst, im_src, dstX, dstY, srcX, srcY, srcW, srcH);
        !          3706:        RETURN_TRUE;
        !          3707: }
        !          3708: /* }}} */
        !          3709: 
        !          3710: #if HAVE_LIBGD15
        !          3711: /* {{{ proto bool imagecopymerge(resource src_im, resource dst_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct)
        !          3712:    Merge one part of an image with another */
        !          3713: PHP_FUNCTION(imagecopymerge)
        !          3714: {
        !          3715:        zval *SIM, *DIM;
        !          3716:        long SX, SY, SW, SH, DX, DY, PCT;
        !          3717:        gdImagePtr im_dst, im_src;
        !          3718:        int srcH, srcW, srcY, srcX, dstY, dstX, pct;
        !          3719: 
        !          3720:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrlllllll", &DIM, &SIM, &DX, &DY, &SX, &SY, &SW, &SH, &PCT) == FAILURE) {
        !          3721:                return;
        !          3722:        }
        !          3723: 
        !          3724:        ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd);
        !          3725:        ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, &DIM, -1, "Image", le_gd);
        !          3726: 
        !          3727:        srcX = SX;
        !          3728:        srcY = SY;
        !          3729:        srcH = SH;
        !          3730:        srcW = SW;
        !          3731:        dstX = DX;
        !          3732:        dstY = DY;
        !          3733:        pct  = PCT;
        !          3734: 
        !          3735:        gdImageCopyMerge(im_dst, im_src, dstX, dstY, srcX, srcY, srcW, srcH, pct);
        !          3736:        RETURN_TRUE;
        !          3737: }
        !          3738: /* }}} */
        !          3739: 
        !          3740: /* {{{ proto bool imagecopymergegray(resource src_im, resource dst_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct)
        !          3741:    Merge one part of an image with another */
        !          3742: PHP_FUNCTION(imagecopymergegray)
        !          3743: {
        !          3744:        zval *SIM, *DIM;
        !          3745:        long SX, SY, SW, SH, DX, DY, PCT;
        !          3746:        gdImagePtr im_dst, im_src;
        !          3747:        int srcH, srcW, srcY, srcX, dstY, dstX, pct;
        !          3748: 
        !          3749:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrlllllll", &DIM, &SIM, &DX, &DY, &SX, &SY, &SW, &SH, &PCT) == FAILURE) {
        !          3750:                return;
        !          3751:        }
        !          3752: 
        !          3753:        ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd);
        !          3754:        ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, &DIM, -1, "Image", le_gd);
        !          3755: 
        !          3756:        srcX = SX;
        !          3757:        srcY = SY;
        !          3758:        srcH = SH;
        !          3759:        srcW = SW;
        !          3760:        dstX = DX;
        !          3761:        dstY = DY;
        !          3762:        pct  = PCT;
        !          3763: 
        !          3764:        gdImageCopyMergeGray(im_dst, im_src, dstX, dstY, srcX, srcY, srcW, srcH, pct);
        !          3765:        RETURN_TRUE;
        !          3766: }
        !          3767: /* }}} */
        !          3768: #endif
        !          3769: 
        !          3770: /* {{{ proto bool imagecopyresized(resource dst_im, resource 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)
        !          3771:    Copy and resize part of an image */
        !          3772: PHP_FUNCTION(imagecopyresized)
        !          3773: {
        !          3774:        zval *SIM, *DIM;
        !          3775:        long SX, SY, SW, SH, DX, DY, DW, DH;
        !          3776:        gdImagePtr im_dst, im_src;
        !          3777:        int srcH, srcW, dstH, dstW, srcY, srcX, dstY, dstX;
        !          3778: 
        !          3779:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrllllllll", &DIM, &SIM, &DX, &DY, &SX, &SY, &DW, &DH, &SW, &SH) == FAILURE) {
        !          3780:                return;
        !          3781:        }
        !          3782: 
        !          3783:        ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, &DIM, -1, "Image", le_gd);
        !          3784:        ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd);
        !          3785: 
        !          3786:        srcX = SX;
        !          3787:        srcY = SY;
        !          3788:        srcH = SH;
        !          3789:        srcW = SW;
        !          3790:        dstX = DX;
        !          3791:        dstY = DY;
        !          3792:        dstH = DH;
        !          3793:        dstW = DW;
        !          3794: 
        !          3795:        if (dstW <= 0 || dstH <= 0 || srcW <= 0 || srcH <= 0) {
        !          3796:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid image dimensions");
        !          3797:                RETURN_FALSE;
        !          3798:        }
        !          3799: 
        !          3800:        gdImageCopyResized(im_dst, im_src, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH);
        !          3801:        RETURN_TRUE;
        !          3802: }
        !          3803: /* }}} */
        !          3804: 
        !          3805: /* {{{ proto int imagesx(resource im)
        !          3806:    Get image width */
        !          3807: PHP_FUNCTION(imagesx)
        !          3808: {
        !          3809:        zval *IM;
        !          3810:        gdImagePtr im;
        !          3811: 
        !          3812:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &IM) == FAILURE) {
        !          3813:                return;
        !          3814:        }
        !          3815: 
        !          3816:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3817: 
        !          3818:        RETURN_LONG(gdImageSX(im));
        !          3819: }
        !          3820: /* }}} */
        !          3821: 
        !          3822: /* {{{ proto int imagesy(resource im)
        !          3823:    Get image height */
        !          3824: PHP_FUNCTION(imagesy)
        !          3825: {
        !          3826:        zval *IM;
        !          3827:        gdImagePtr im;
        !          3828: 
        !          3829:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &IM) == FAILURE) {
        !          3830:                return;
        !          3831:        }
        !          3832: 
        !          3833:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3834: 
        !          3835:        RETURN_LONG(gdImageSY(im));
        !          3836: }
        !          3837: /* }}} */
        !          3838: 
        !          3839: #ifdef ENABLE_GD_TTF
        !          3840: #define TTFTEXT_DRAW 0
        !          3841: #define TTFTEXT_BBOX 1
        !          3842: #endif
        !          3843: 
        !          3844: #ifdef ENABLE_GD_TTF
        !          3845: 
        !          3846: #if  HAVE_LIBFREETYPE && HAVE_GD_STRINGFTEX
        !          3847: /* {{{ proto array imageftbbox(float size, float angle, string font_file, string text [, array extrainfo])
        !          3848:    Give the bounding box of a text using fonts via freetype2 */
        !          3849: PHP_FUNCTION(imageftbbox)
        !          3850: {
        !          3851:        php_imagettftext_common(INTERNAL_FUNCTION_PARAM_PASSTHRU, TTFTEXT_BBOX, 1);
        !          3852: }
        !          3853: /* }}} */
        !          3854: 
        !          3855: /* {{{ proto array imagefttext(resource im, float size, float angle, int x, int y, int col, string font_file, string text [, array extrainfo])
        !          3856:    Write text to the image using fonts via freetype2 */
        !          3857: PHP_FUNCTION(imagefttext)
        !          3858: {
        !          3859:        php_imagettftext_common(INTERNAL_FUNCTION_PARAM_PASSTHRU, TTFTEXT_DRAW, 1);
        !          3860: }
        !          3861: /* }}} */
        !          3862: #endif
        !          3863: 
        !          3864: /* {{{ proto array imagettfbbox(float size, float angle, string font_file, string text)
        !          3865:    Give the bounding box of a text using TrueType fonts */
        !          3866: PHP_FUNCTION(imagettfbbox)
        !          3867: {
        !          3868:        php_imagettftext_common(INTERNAL_FUNCTION_PARAM_PASSTHRU, TTFTEXT_BBOX, 0);
        !          3869: }
        !          3870: /* }}} */
        !          3871: 
        !          3872: /* {{{ proto array imagettftext(resource im, float size, float angle, int x, int y, int col, string font_file, string text)
        !          3873:    Write text to the image using a TrueType font */
        !          3874: PHP_FUNCTION(imagettftext)
        !          3875: {
        !          3876:        php_imagettftext_common(INTERNAL_FUNCTION_PARAM_PASSTHRU, TTFTEXT_DRAW, 0);
        !          3877: }
        !          3878: /* }}} */
        !          3879: 
        !          3880: /* {{{ php_imagettftext_common
        !          3881:  */
        !          3882: static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int mode, int extended)
        !          3883: {
        !          3884:        zval *IM, *EXT = NULL;
        !          3885:        gdImagePtr im=NULL;
        !          3886:        long col = -1, x = -1, y = -1;
        !          3887:        int str_len, fontname_len, i, brect[8];
        !          3888:        double ptsize, angle;
        !          3889:        char *str = NULL, *fontname = NULL;
        !          3890:        char *error = NULL;
        !          3891:        int argc = ZEND_NUM_ARGS();
        !          3892: #if HAVE_GD_STRINGFTEX
        !          3893:        gdFTStringExtra strex = {0};
        !          3894: #endif
        !          3895: 
        !          3896: #if !HAVE_GD_STRINGFTEX
        !          3897:        assert(!extended);
        !          3898: #endif
        !          3899: 
        !          3900:        if (mode == TTFTEXT_BBOX) {
        !          3901:                if (argc < 4 || argc > ((extended) ? 5 : 4)) {
        !          3902:                        ZEND_WRONG_PARAM_COUNT();
        !          3903:                } else if (zend_parse_parameters(argc TSRMLS_CC, "ddss|a", &ptsize, &angle, &fontname, &fontname_len, &str, &str_len, &EXT) == FAILURE) {
        !          3904:                        RETURN_FALSE;
        !          3905:                }
        !          3906:        } else {
        !          3907:                if (argc < 8 || argc > ((extended) ? 9 : 8)) {
        !          3908:                        ZEND_WRONG_PARAM_COUNT();
        !          3909:                } else if (zend_parse_parameters(argc TSRMLS_CC, "rddlllss|a", &IM, &ptsize, &angle, &x, &y, &col, &fontname, &fontname_len, &str, &str_len, &EXT) == FAILURE) {
        !          3910:                        RETURN_FALSE;
        !          3911:                }
        !          3912:                ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          3913:        }
        !          3914: 
        !          3915:        /* convert angle to radians */
        !          3916:        angle = angle * (M_PI/180);
        !          3917: 
        !          3918: #if HAVE_GD_STRINGFTEX
        !          3919:        if (extended && EXT) {  /* parse extended info */
        !          3920:                HashPosition pos;
        !          3921: 
        !          3922:                /* walk the assoc array */
        !          3923:                zend_hash_internal_pointer_reset_ex(HASH_OF(EXT), &pos);
        !          3924:                do {
        !          3925:                        zval ** item;
        !          3926:                        char * key;
        !          3927:                        ulong num_key;
        !          3928: 
        !          3929:                        if (zend_hash_get_current_key_ex(HASH_OF(EXT), &key, NULL, &num_key, 0, &pos) != HASH_KEY_IS_STRING) {
        !          3930:                                continue;
        !          3931:                        }
        !          3932: 
        !          3933:                        if (zend_hash_get_current_data_ex(HASH_OF(EXT), (void **) &item, &pos) == FAILURE) {
        !          3934:                                continue;
        !          3935:                        }
        !          3936:                
        !          3937:                        if (strcmp("linespacing", key) == 0) {
        !          3938:                                convert_to_double_ex(item);
        !          3939:                                strex.flags |= gdFTEX_LINESPACE;
        !          3940:                                strex.linespacing = Z_DVAL_PP(item);
        !          3941:                        }
        !          3942: 
        !          3943:                } while (zend_hash_move_forward_ex(HASH_OF(EXT), &pos) == SUCCESS);
        !          3944:        }
        !          3945: #endif
        !          3946: 
        !          3947: #ifdef VIRTUAL_DIR
        !          3948:        {
        !          3949:                char tmp_font_path[MAXPATHLEN];
        !          3950: 
        !          3951:                if (!VCWD_REALPATH(fontname, tmp_font_path)) {
        !          3952:                        fontname = NULL;
        !          3953:                }
        !          3954:        }
        !          3955: #endif
        !          3956: 
        !          3957:        PHP_GD_CHECK_OPEN_BASEDIR(fontname, "Invalid font filename");
        !          3958:        
        !          3959: #ifdef USE_GD_IMGSTRTTF
        !          3960: # if HAVE_GD_STRINGFTEX
        !          3961:        if (extended) {
        !          3962:                error = gdImageStringFTEx(im, brect, col, fontname, ptsize, angle, x, y, str, &strex);
        !          3963:        }
        !          3964:        else
        !          3965: # endif
        !          3966: 
        !          3967: # if HAVE_GD_STRINGFT
        !          3968:        error = gdImageStringFT(im, brect, col, fontname, ptsize, angle, x, y, str);
        !          3969: # elif HAVE_GD_STRINGTTF
        !          3970:        error = gdImageStringTTF(im, brect, col, fontname, ptsize, angle, x, y, str);
        !          3971: # endif
        !          3972: 
        !          3973: #endif
        !          3974: 
        !          3975:        if (error) {
        !          3976:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", error);
        !          3977:                RETURN_FALSE;
        !          3978:        }
        !          3979: 
        !          3980:        array_init(return_value);
        !          3981: 
        !          3982:        /* return array with the text's bounding box */
        !          3983:        for (i = 0; i < 8; i++) {
        !          3984:                add_next_index_long(return_value, brect[i]);
        !          3985:        }
        !          3986: }
        !          3987: /* }}} */
        !          3988: #endif /* ENABLE_GD_TTF */
        !          3989: 
        !          3990: #if HAVE_LIBT1
        !          3991: 
        !          3992: /* {{{ php_free_ps_font
        !          3993:  */
        !          3994: static void php_free_ps_font(zend_rsrc_list_entry *rsrc TSRMLS_DC)
        !          3995: {
        !          3996:        int *font = (int *) rsrc->ptr;
        !          3997: 
        !          3998:        T1_DeleteFont(*font);
        !          3999:        efree(font);
        !          4000: }
        !          4001: /* }}} */
        !          4002: 
        !          4003: /* {{{ php_free_ps_enc
        !          4004:  */
        !          4005: static void php_free_ps_enc(zend_rsrc_list_entry *rsrc TSRMLS_DC)
        !          4006: {
        !          4007:        char **enc = (char **) rsrc->ptr;
        !          4008: 
        !          4009:        T1_DeleteEncoding(enc);
        !          4010: }
        !          4011: /* }}} */
        !          4012: 
        !          4013: /* {{{ proto resource imagepsloadfont(string pathname)
        !          4014:    Load a new font from specified file */
        !          4015: PHP_FUNCTION(imagepsloadfont)
        !          4016: {
        !          4017:        char *file;
        !          4018:        int file_len, f_ind, *font;
        !          4019: #ifdef PHP_WIN32
        !          4020:        struct stat st;
        !          4021: #endif
        !          4022: 
        !          4023:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &file, &file_len) == FAILURE) {
        !          4024:                return;
        !          4025:        }
        !          4026: 
        !          4027: #ifdef PHP_WIN32
        !          4028:        if (VCWD_STAT(file, &st) < 0) {
        !          4029:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Font file not found (%s)", file);
        !          4030:                RETURN_FALSE;
        !          4031:        }
        !          4032: #endif
        !          4033: 
        !          4034:        f_ind = T1_AddFont(file);
        !          4035: 
        !          4036:        if (f_ind < 0) {
        !          4037:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "T1Lib Error (%i): %s", f_ind, T1_StrError(f_ind));
        !          4038:                RETURN_FALSE;
        !          4039:        }
        !          4040: 
        !          4041:        if (T1_LoadFont(f_ind)) {
        !          4042:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't load the font");
        !          4043:                RETURN_FALSE;
        !          4044:        }
        !          4045: 
        !          4046:        font = (int *) emalloc(sizeof(int));
        !          4047:        *font = f_ind;
        !          4048:        ZEND_REGISTER_RESOURCE(return_value, font, le_ps_font);
        !          4049: }
        !          4050: /* }}} */
        !          4051: 
        !          4052: /* {{{ proto int imagepscopyfont(int font_index)
        !          4053:    Make a copy of a font for purposes like extending or reenconding */
        !          4054: /* The function in t1lib which this function uses seem to be buggy...
        !          4055: PHP_FUNCTION(imagepscopyfont)
        !          4056: {
        !          4057:        int l_ind, type;
        !          4058:        gd_ps_font *nf_ind, *of_ind;
        !          4059:        long fnt;
        !          4060: 
        !          4061:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &fnt) == FAILURE) {
        !          4062:                return;
        !          4063:        }
        !          4064: 
        !          4065:        of_ind = zend_list_find(fnt, &type);
        !          4066: 
        !          4067:        if (type != le_ps_font) {
        !          4068:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "%ld is not a Type 1 font index", fnt);
        !          4069:                RETURN_FALSE;
        !          4070:        }
        !          4071: 
        !          4072:        nf_ind = emalloc(sizeof(gd_ps_font));
        !          4073:        nf_ind->font_id = T1_CopyFont(of_ind->font_id);
        !          4074: 
        !          4075:        if (nf_ind->font_id < 0) {
        !          4076:                l_ind = nf_ind->font_id;
        !          4077:                efree(nf_ind);
        !          4078:                switch (l_ind) {
        !          4079:                        case -1:
        !          4080:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "FontID %d is not loaded in memory", l_ind);
        !          4081:                                RETURN_FALSE;
        !          4082:                                break;
        !          4083:                        case -2:
        !          4084:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Tried to copy a logical font");
        !          4085:                                RETURN_FALSE;
        !          4086:                                break;
        !          4087:                        case -3:
        !          4088:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Memory allocation fault in t1lib");
        !          4089:                                RETURN_FALSE;
        !          4090:                                break;
        !          4091:                        default:
        !          4092:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "An unknown error occurred in t1lib");
        !          4093:                                RETURN_FALSE;
        !          4094:                                break;
        !          4095:                }
        !          4096:        }
        !          4097: 
        !          4098:        nf_ind->extend = 1;
        !          4099:        l_ind = zend_list_insert(nf_ind, le_ps_font);
        !          4100:        RETURN_LONG(l_ind);
        !          4101: }
        !          4102: */
        !          4103: /* }}} */
        !          4104: 
        !          4105: /* {{{ proto bool imagepsfreefont(resource font_index)
        !          4106:    Free memory used by a font */
        !          4107: PHP_FUNCTION(imagepsfreefont)
        !          4108: {
        !          4109:        zval *fnt;
        !          4110:        int *f_ind;
        !          4111: 
        !          4112:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &fnt) == FAILURE) {
        !          4113:                return;
        !          4114:        }
        !          4115: 
        !          4116:        ZEND_FETCH_RESOURCE(f_ind, int *, &fnt, -1, "Type 1 font", le_ps_font);
        !          4117:        zend_list_delete(Z_LVAL_P(fnt));
        !          4118:        RETURN_TRUE;
        !          4119: }
        !          4120: /* }}} */
        !          4121: 
        !          4122: /* {{{ proto bool imagepsencodefont(resource font_index, string filename)
        !          4123:    To change a fonts character encoding vector */
        !          4124: PHP_FUNCTION(imagepsencodefont)
        !          4125: {
        !          4126:        zval *fnt;
        !          4127:        char *enc, **enc_vector;
        !          4128:        int enc_len, *f_ind;
        !          4129: 
        !          4130:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &fnt, &enc, &enc_len) == FAILURE) {
        !          4131:                return;
        !          4132:        }
        !          4133: 
        !          4134:        ZEND_FETCH_RESOURCE(f_ind, int *, &fnt, -1, "Type 1 font", le_ps_font);
        !          4135: 
        !          4136:        if ((enc_vector = T1_LoadEncoding(enc)) == NULL) {
        !          4137:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't load encoding vector from %s", enc);
        !          4138:                RETURN_FALSE;
        !          4139:        }
        !          4140: 
        !          4141:        T1_DeleteAllSizes(*f_ind);
        !          4142:        if (T1_ReencodeFont(*f_ind, enc_vector)) {
        !          4143:                T1_DeleteEncoding(enc_vector);
        !          4144:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't re-encode font");
        !          4145:                RETURN_FALSE;
        !          4146:        }
        !          4147: 
        !          4148:        zend_list_insert(enc_vector, le_ps_enc);
        !          4149: 
        !          4150:        RETURN_TRUE;
        !          4151: }
        !          4152: /* }}} */
        !          4153: 
        !          4154: /* {{{ proto bool imagepsextendfont(resource font_index, float extend)
        !          4155:    Extend or or condense (if extend < 1) a font */
        !          4156: PHP_FUNCTION(imagepsextendfont)
        !          4157: {
        !          4158:        zval *fnt;
        !          4159:        double ext;
        !          4160:        int *f_ind;
        !          4161: 
        !          4162:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &fnt, &ext) == FAILURE) {
        !          4163:                return;
        !          4164:        }
        !          4165: 
        !          4166:        ZEND_FETCH_RESOURCE(f_ind, int *, &fnt, -1, "Type 1 font", le_ps_font);
        !          4167: 
        !          4168:        T1_DeleteAllSizes(*f_ind);
        !          4169: 
        !          4170:        if (ext <= 0) {
        !          4171:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Second parameter %F out of range (must be > 0)", ext);
        !          4172:                RETURN_FALSE;
        !          4173:        }
        !          4174: 
        !          4175:        if (T1_ExtendFont(*f_ind, ext) != 0) {
        !          4176:                RETURN_FALSE;
        !          4177:        }
        !          4178: 
        !          4179:        RETURN_TRUE;
        !          4180: }
        !          4181: /* }}} */
        !          4182: 
        !          4183: /* {{{ proto bool imagepsslantfont(resource font_index, float slant)
        !          4184:    Slant a font */
        !          4185: PHP_FUNCTION(imagepsslantfont)
        !          4186: {
        !          4187:        zval *fnt;
        !          4188:        double slt;
        !          4189:        int *f_ind;
        !          4190: 
        !          4191:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rd", &fnt, &slt) == FAILURE) {
        !          4192:                return;
        !          4193:        }
        !          4194: 
        !          4195:        ZEND_FETCH_RESOURCE(f_ind, int *, &fnt, -1, "Type 1 font", le_ps_font);
        !          4196: 
        !          4197:        if (T1_SlantFont(*f_ind, slt) != 0) {
        !          4198:                RETURN_FALSE;
        !          4199:        }
        !          4200: 
        !          4201:        RETURN_TRUE;
        !          4202: }
        !          4203: /* }}} */
        !          4204: 
        !          4205: /* {{{ proto array imagepstext(resource image, string text, resource font, int size, int foreground, int background, int xcoord, int ycoord [, int space [, int tightness [, float angle [, int antialias])
        !          4206:    Rasterize a string over an image */
        !          4207: PHP_FUNCTION(imagepstext)
        !          4208: {
        !          4209:        zval *img, *fnt;
        !          4210:        int i, j;
        !          4211:        long _fg, _bg, x, y, size, space = 0, aa_steps = 4, width = 0;
        !          4212:        int *f_ind;
        !          4213:        int h_lines, v_lines, c_ind;
        !          4214:        int rd, gr, bl, fg_rd, fg_gr, fg_bl, bg_rd, bg_gr, bg_bl;
        !          4215:        int fg_al, bg_al, al;
        !          4216:        int aa[16];
        !          4217:        int amount_kern, add_width;
        !          4218:        double angle = 0.0, extend;
        !          4219:        unsigned long aa_greys[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
        !          4220:        gdImagePtr bg_img;
        !          4221:        GLYPH *str_img;
        !          4222:        T1_OUTLINE *char_path, *str_path;
        !          4223:        T1_TMATRIX *transform = NULL;
        !          4224:        char *str;
        !          4225:        int str_len;
        !          4226: 
        !          4227:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsrlllll|lldl", &img, &str, &str_len, &fnt, &size, &_fg, &_bg, &x, &y, &space, &width, &angle, &aa_steps) == FAILURE) {
        !          4228:                return;
        !          4229:        }
        !          4230: 
        !          4231:        if (aa_steps != 4 && aa_steps != 16) {
        !          4232:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Antialias steps must be 4 or 16");
        !          4233:                RETURN_FALSE;
        !          4234:        }
        !          4235: 
        !          4236:        ZEND_FETCH_RESOURCE(bg_img, gdImagePtr, &img, -1, "Image", le_gd);
        !          4237:        ZEND_FETCH_RESOURCE(f_ind, int *, &fnt, -1, "Type 1 font", le_ps_font);
        !          4238: 
        !          4239:        /* Ensure that the provided colors are valid */
        !          4240:        if (_fg < 0 || (!gdImageTrueColor(bg_img) && _fg > gdImageColorsTotal(bg_img))) {
        !          4241:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Foreground color index %ld out of range", _fg);
        !          4242:                RETURN_FALSE;
        !          4243:        }
        !          4244: 
        !          4245:        if (_bg < 0 || (!gdImageTrueColor(bg_img) && _fg > gdImageColorsTotal(bg_img))) {
        !          4246:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Background color index %ld out of range", _bg);
        !          4247:                RETURN_FALSE;
        !          4248:        }
        !          4249: 
        !          4250:        fg_rd = gdImageRed  (bg_img, _fg);
        !          4251:        fg_gr = gdImageGreen(bg_img, _fg);
        !          4252:        fg_bl = gdImageBlue (bg_img, _fg);
        !          4253:        fg_al = gdImageAlpha(bg_img, _fg);
        !          4254: 
        !          4255:        bg_rd = gdImageRed  (bg_img, _bg);
        !          4256:        bg_gr = gdImageGreen(bg_img, _bg);
        !          4257:        bg_bl = gdImageBlue (bg_img, _bg);
        !          4258:        bg_al = gdImageAlpha(bg_img, _bg);
        !          4259: 
        !          4260:        for (i = 0; i < aa_steps; i++) {
        !          4261:                rd = bg_rd + (double) (fg_rd - bg_rd) / aa_steps * (i + 1);
        !          4262:                gr = bg_gr + (double) (fg_gr - bg_gr) / aa_steps * (i + 1);
        !          4263:                bl = bg_bl + (double) (fg_bl - bg_bl) / aa_steps * (i + 1);
        !          4264:                al = bg_al + (double) (fg_al - bg_al) / aa_steps * (i + 1);
        !          4265:                aa[i] = gdImageColorResolveAlpha(bg_img, rd, gr, bl, al);
        !          4266:        }
        !          4267: 
        !          4268:        T1_AASetBitsPerPixel(8);
        !          4269: 
        !          4270:        switch (aa_steps) {
        !          4271:                case 4:
        !          4272:                        T1_AASetGrayValues(0, 1, 2, 3, 4);
        !          4273:                        T1_AASetLevel(T1_AA_LOW);
        !          4274:                        break;
        !          4275:                case 16:
        !          4276:                        T1_AAHSetGrayValues(aa_greys);
        !          4277:                        T1_AASetLevel(T1_AA_HIGH);
        !          4278:                        break;
        !          4279:                default:
        !          4280:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid value %ld as number of steps for antialiasing", aa_steps);
        !          4281:                        RETURN_FALSE;
        !          4282:        }
        !          4283: 
        !          4284:        if (angle) {
        !          4285:                transform = T1_RotateMatrix(NULL, angle);
        !          4286:        }
        !          4287: 
        !          4288:        if (width) {
        !          4289:                extend = T1_GetExtend(*f_ind);
        !          4290:                str_path = T1_GetCharOutline(*f_ind, str[0], size, transform);
        !          4291: 
        !          4292:                if (!str_path) {
        !          4293:                        if (T1_errno) {
        !          4294:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "T1Lib Error: %s", T1_StrError(T1_errno));
        !          4295:                        }
        !          4296:                        RETURN_FALSE;
        !          4297:                }
        !          4298: 
        !          4299:                for (i = 1; i < str_len; i++) {
        !          4300:                        amount_kern = (int) T1_GetKerning(*f_ind, str[i - 1], str[i]);
        !          4301:                        amount_kern += str[i - 1] == ' ' ? space : 0;
        !          4302:                        add_width = (int) (amount_kern + width) / extend;
        !          4303: 
        !          4304:                        char_path = T1_GetMoveOutline(*f_ind, add_width, 0, 0, size, transform);
        !          4305:                        str_path = T1_ConcatOutlines(str_path, char_path);
        !          4306: 
        !          4307:                        char_path = T1_GetCharOutline(*f_ind, str[i], size, transform);
        !          4308:                        str_path = T1_ConcatOutlines(str_path, char_path);
        !          4309:                }
        !          4310:                str_img = T1_AAFillOutline(str_path, 0);
        !          4311:        } else {
        !          4312:                str_img = T1_AASetString(*f_ind, str,  str_len, space, T1_KERNING, size, transform);
        !          4313:        }
        !          4314:        if (T1_errno) {
        !          4315:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "T1Lib Error: %s", T1_StrError(T1_errno));
        !          4316:                RETURN_FALSE;
        !          4317:        }
        !          4318: 
        !          4319:        h_lines = str_img->metrics.ascent -  str_img->metrics.descent;
        !          4320:        v_lines = str_img->metrics.rightSideBearing - str_img->metrics.leftSideBearing;
        !          4321: 
        !          4322:        for (i = 0; i < v_lines; i++) {
        !          4323:                for (j = 0; j < h_lines; j++) {
        !          4324:                        switch (str_img->bits[j * v_lines + i]) {
        !          4325:                                case 0:
        !          4326:                                        break;
        !          4327:                                default:
        !          4328:                                        c_ind = aa[str_img->bits[j * v_lines + i] - 1];
        !          4329:                                        gdImageSetPixel(bg_img, x + str_img->metrics.leftSideBearing + i, y - str_img->metrics.ascent + j, c_ind);
        !          4330:                                        break;
        !          4331:                        }
        !          4332:                }
        !          4333:        }
        !          4334: 
        !          4335:        array_init(return_value);
        !          4336: 
        !          4337:        add_next_index_long(return_value, str_img->metrics.leftSideBearing);
        !          4338:        add_next_index_long(return_value, str_img->metrics.descent);
        !          4339:        add_next_index_long(return_value, str_img->metrics.rightSideBearing);
        !          4340:        add_next_index_long(return_value, str_img->metrics.ascent);
        !          4341: }
        !          4342: /* }}} */
        !          4343: 
        !          4344: /* {{{ proto array imagepsbbox(string text, resource font, int size [, int space, int tightness, float angle])
        !          4345:    Return the bounding box needed by a string if rasterized */
        !          4346: PHP_FUNCTION(imagepsbbox)
        !          4347: {
        !          4348:        zval *fnt;
        !          4349:        long sz = 0, sp = 0, wd = 0;
        !          4350:        char *str;
        !          4351:        int i, space = 0, add_width = 0, char_width, amount_kern;
        !          4352:        int cur_x, cur_y, dx, dy;
        !          4353:        int x1, y1, x2, y2, x3, y3, x4, y4;
        !          4354:        int *f_ind;
        !          4355:        int str_len, per_char = 0;
        !          4356:        int argc = ZEND_NUM_ARGS();
        !          4357:        double angle = 0, sin_a = 0, cos_a = 0;
        !          4358:        BBox char_bbox, str_bbox = {0, 0, 0, 0};
        !          4359: 
        !          4360:        if (argc != 3 && argc != 6) {
        !          4361:                ZEND_WRONG_PARAM_COUNT();
        !          4362:        }
        !          4363:        
        !          4364:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "srl|lld", &str, &str_len, &fnt, &sz, &sp, &wd, &angle) == FAILURE) {
        !          4365:                return;
        !          4366:        }
        !          4367:        
        !          4368:        if (argc == 6) {
        !          4369:                space = sp;
        !          4370:                add_width = wd;
        !          4371:                angle = angle * M_PI / 180;
        !          4372:                sin_a = sin(angle);
        !          4373:                cos_a = cos(angle);
        !          4374:                per_char =  add_width || angle ? 1 : 0;
        !          4375:        }
        !          4376: 
        !          4377:        ZEND_FETCH_RESOURCE(f_ind, int *, &fnt, -1, "Type 1 font", le_ps_font);
        !          4378: 
        !          4379: #define max(a, b) (a > b ? a : b)
        !          4380: #define min(a, b) (a < b ? a : b)
        !          4381: #define new_x(a, b) (int) ((a) * cos_a - (b) * sin_a)
        !          4382: #define new_y(a, b) (int) ((a) * sin_a + (b) * cos_a)
        !          4383: 
        !          4384:        if (per_char) {
        !          4385:                space += T1_GetCharWidth(*f_ind, ' ');
        !          4386:                cur_x = cur_y = 0;
        !          4387: 
        !          4388:                for (i = 0; i < str_len; i++) {
        !          4389:                        if (str[i] == ' ') {
        !          4390:                                char_bbox.llx = char_bbox.lly = char_bbox.ury = 0;
        !          4391:                                char_bbox.urx = char_width = space;
        !          4392:                        } else {
        !          4393:                                char_bbox = T1_GetCharBBox(*f_ind, str[i]);
        !          4394:                                char_width = T1_GetCharWidth(*f_ind, str[i]);
        !          4395:                        }
        !          4396:                        amount_kern = i ? T1_GetKerning(*f_ind, str[i - 1], str[i]) : 0;
        !          4397: 
        !          4398:                        /* Transfer character bounding box to right place */
        !          4399:                        x1 = new_x(char_bbox.llx, char_bbox.lly) + cur_x;
        !          4400:                        y1 = new_y(char_bbox.llx, char_bbox.lly) + cur_y;
        !          4401:                        x2 = new_x(char_bbox.llx, char_bbox.ury) + cur_x;
        !          4402:                        y2 = new_y(char_bbox.llx, char_bbox.ury) + cur_y;
        !          4403:                        x3 = new_x(char_bbox.urx, char_bbox.ury) + cur_x;
        !          4404:                        y3 = new_y(char_bbox.urx, char_bbox.ury) + cur_y;
        !          4405:                        x4 = new_x(char_bbox.urx, char_bbox.lly) + cur_x;
        !          4406:                        y4 = new_y(char_bbox.urx, char_bbox.lly) + cur_y;
        !          4407: 
        !          4408:                        /* Find min & max values and compare them with current bounding box */
        !          4409:                        str_bbox.llx = min(str_bbox.llx, min(x1, min(x2, min(x3, x4))));
        !          4410:                        str_bbox.lly = min(str_bbox.lly, min(y1, min(y2, min(y3, y4))));
        !          4411:                        str_bbox.urx = max(str_bbox.urx, max(x1, max(x2, max(x3, x4))));
        !          4412:                        str_bbox.ury = max(str_bbox.ury, max(y1, max(y2, max(y3, y4))));
        !          4413: 
        !          4414:                        /* Move to the next base point */
        !          4415:                        dx = new_x(char_width + add_width + amount_kern, 0);
        !          4416:                        dy = new_y(char_width + add_width + amount_kern, 0);
        !          4417:                        cur_x += dx;
        !          4418:                        cur_y += dy;
        !          4419:                        /*
        !          4420:                        printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", x1, y1, x2, y2, x3, y3, x4, y4, char_bbox.llx, char_bbox.lly, char_bbox.urx, char_bbox.ury, char_width, amount_kern, cur_x, cur_y, dx, dy);
        !          4421:                        */
        !          4422:                }
        !          4423: 
        !          4424:        } else {
        !          4425:                str_bbox = T1_GetStringBBox(*f_ind, str, str_len, space, T1_KERNING);
        !          4426:        }
        !          4427: 
        !          4428:        if (T1_errno) {
        !          4429:                RETURN_FALSE;
        !          4430:        }
        !          4431: 
        !          4432:        array_init(return_value);
        !          4433:        /*
        !          4434:        printf("%d %d %d %d\n", str_bbox.llx, str_bbox.lly, str_bbox.urx, str_bbox.ury);
        !          4435:        */
        !          4436:        add_next_index_long(return_value, (int) ceil(((double) str_bbox.llx)*sz/1000));
        !          4437:        add_next_index_long(return_value, (int) ceil(((double) str_bbox.lly)*sz/1000));
        !          4438:        add_next_index_long(return_value, (int) ceil(((double) str_bbox.urx)*sz/1000));
        !          4439:        add_next_index_long(return_value, (int) ceil(((double) str_bbox.ury)*sz/1000));
        !          4440: }
        !          4441: /* }}} */
        !          4442: #endif
        !          4443: 
        !          4444: #ifdef HAVE_GD_WBMP
        !          4445: /* {{{ proto bool image2wbmp(resource im [, string filename [, int threshold]])
        !          4446:    Output WBMP image to browser or file */
        !          4447: PHP_FUNCTION(image2wbmp)
        !          4448: {
        !          4449:        _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_CONVERT_WBM, "WBMP", _php_image_bw_convert);
        !          4450: }
        !          4451: /* }}} */
        !          4452: #endif /* HAVE_GD_WBMP */
        !          4453: 
        !          4454: #if defined(HAVE_GD_JPG) && defined(HAVE_GD_WBMP)
        !          4455: /* {{{ proto bool jpeg2wbmp (string f_org, string f_dest, int d_height, int d_width, int threshold)
        !          4456:    Convert JPEG image to WBMP image */
        !          4457: PHP_FUNCTION(jpeg2wbmp)
        !          4458: {
        !          4459:        _php_image_convert(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_JPG);
        !          4460: }
        !          4461: /* }}} */
        !          4462: #endif
        !          4463: 
        !          4464: #if defined(HAVE_GD_PNG) && defined(HAVE_GD_WBMP)
        !          4465: /* {{{ proto bool png2wbmp (string f_org, string f_dest, int d_height, int d_width, int threshold)
        !          4466:    Convert PNG image to WBMP image */
        !          4467: PHP_FUNCTION(png2wbmp)
        !          4468: {
        !          4469:        _php_image_convert(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_PNG);
        !          4470: }
        !          4471: /* }}} */
        !          4472: #endif
        !          4473: 
        !          4474: #ifdef HAVE_GD_WBMP
        !          4475: /* {{{ _php_image_bw_convert
        !          4476:  * It converts a gd Image to bw using a threshold value */
        !          4477: static void _php_image_bw_convert(gdImagePtr im_org, gdIOCtx *out, int threshold)
        !          4478: {
        !          4479:        gdImagePtr im_dest;
        !          4480:        int white, black;
        !          4481:        int color, color_org, median;
        !          4482:        int dest_height = gdImageSY(im_org);
        !          4483:        int dest_width = gdImageSX(im_org);
        !          4484:        int x, y;
        !          4485:        TSRMLS_FETCH();
        !          4486: 
        !          4487:        im_dest = gdImageCreate(dest_width, dest_height);
        !          4488:        if (im_dest == NULL) {
        !          4489:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to allocate temporary buffer");
        !          4490:                return;
        !          4491:        }
        !          4492: 
        !          4493:        white = gdImageColorAllocate(im_dest, 255, 255, 255);
        !          4494:        if (white == -1) {
        !          4495:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to allocate the colors for the destination buffer");
        !          4496:                return;
        !          4497:        }
        !          4498: 
        !          4499:        black = gdImageColorAllocate(im_dest, 0, 0, 0);
        !          4500:        if (black == -1) {
        !          4501:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to allocate the colors for the destination buffer");
        !          4502:                return;
        !          4503:        }
        !          4504: 
        !          4505:        if (im_org->trueColor) {
        !          4506:                gdImageTrueColorToPalette(im_org, 1, 256);
        !          4507:        }
        !          4508: 
        !          4509:        for (y = 0; y < dest_height; y++) {
        !          4510:                for (x = 0; x < dest_width; x++) {
        !          4511:                        color_org = gdImageGetPixel(im_org, x, y);
        !          4512:                        median = (im_org->red[color_org] + im_org->green[color_org] + im_org->blue[color_org]) / 3;
        !          4513:                        if (median < threshold) {
        !          4514:                                color = black;
        !          4515:                        } else {
        !          4516:                                color = white;
        !          4517:                        }
        !          4518:                        gdImageSetPixel (im_dest, x, y, color);
        !          4519:                }
        !          4520:        }
        !          4521: #ifdef USE_GD_IOCTX
        !          4522:        gdImageWBMPCtx (im_dest, black, out);
        !          4523: #else
        !          4524:        gdImageWBMP (im_dest, black, out);
        !          4525: #endif
        !          4526: 
        !          4527: }
        !          4528: /* }}} */
        !          4529: 
        !          4530: /* {{{ _php_image_convert
        !          4531:  * _php_image_convert converts jpeg/png images to wbmp and resizes them as needed  */
        !          4532: static void _php_image_convert(INTERNAL_FUNCTION_PARAMETERS, int image_type )
        !          4533: {
        !          4534:        char *f_org, *f_dest;
        !          4535:        int f_org_len, f_dest_len;
        !          4536:        long height, width, threshold;
        !          4537:        gdImagePtr im_org, im_dest, im_tmp;
        !          4538:        char *fn_org = NULL;
        !          4539:        char *fn_dest = NULL;
        !          4540:        FILE *org, *dest;
        !          4541:        int dest_height = -1;
        !          4542:        int dest_width = -1;
        !          4543:        int org_height, org_width;
        !          4544:        int white, black;
        !          4545:        int color, color_org, median;
        !          4546:        int int_threshold;
        !          4547:        int x, y;
        !          4548:        float x_ratio, y_ratio;
        !          4549: #ifdef HAVE_GD_JPG
        !          4550:     long ignore_warning;
        !          4551: #endif
        !          4552:        
        !          4553:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sslll", &f_org, &f_org_len, &f_dest, &f_dest_len, &height, &width, &threshold) == FAILURE) {
        !          4554:                return;
        !          4555:        }
        !          4556: 
        !          4557:        fn_org  = f_org;
        !          4558:        fn_dest = f_dest;
        !          4559:        dest_height = height;
        !          4560:        dest_width = width;
        !          4561:        int_threshold = threshold;
        !          4562: 
        !          4563:        if (strlen(f_org) != f_org_len) {
        !          4564:                RETURN_FALSE;
        !          4565:        }
        !          4566: 
        !          4567:        if (strlen(f_dest) != f_dest_len) {
        !          4568:                RETURN_FALSE;
        !          4569:        }
        !          4570: 
        !          4571:        /* Check threshold value */
        !          4572:        if (int_threshold < 0 || int_threshold > 8) {
        !          4573:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid threshold value '%d'", int_threshold);
        !          4574:                RETURN_FALSE;
        !          4575:        }
        !          4576: 
        !          4577:        /* Check origin file */
        !          4578:        PHP_GD_CHECK_OPEN_BASEDIR(fn_org, "Invalid origin filename");
        !          4579: 
        !          4580:        /* Check destination file */
        !          4581:        PHP_GD_CHECK_OPEN_BASEDIR(fn_dest, "Invalid destination filename");
        !          4582: 
        !          4583:        /* Open origin file */
        !          4584:        org = VCWD_FOPEN(fn_org, "rb");
        !          4585:        if (!org) {
        !          4586:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to open '%s' for reading", fn_org);
        !          4587:                RETURN_FALSE;
        !          4588:        }
        !          4589: 
        !          4590:        /* Open destination file */
        !          4591:        dest = VCWD_FOPEN(fn_dest, "wb");
        !          4592:        if (!dest) {
        !          4593:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to open '%s' for writing", fn_dest);
        !          4594:                RETURN_FALSE;
        !          4595:        }
        !          4596: 
        !          4597:        switch (image_type) {
        !          4598: #ifdef HAVE_GD_GIF_READ
        !          4599:                case PHP_GDIMG_TYPE_GIF:
        !          4600:                        im_org = gdImageCreateFromGif(org);
        !          4601:                        if (im_org == NULL) {
        !          4602:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to open '%s' Not a valid GIF file", fn_dest);
        !          4603:                                RETURN_FALSE;
        !          4604:                        }
        !          4605:                        break;
        !          4606: #endif /* HAVE_GD_GIF_READ */
        !          4607: 
        !          4608: #ifdef HAVE_GD_JPG
        !          4609:                case PHP_GDIMG_TYPE_JPG:
        !          4610:                        ignore_warning = INI_INT("gd.jpeg_ignore_warning");
        !          4611: #ifdef HAVE_GD_BUNDLED
        !          4612:                        im_org = gdImageCreateFromJpeg(org, ignore_warning);
        !          4613: #else
        !          4614:                        im_org = gdImageCreateFromJpeg(org);
        !          4615: #endif
        !          4616:                        if (im_org == NULL) {
        !          4617:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to open '%s' Not a valid JPEG file", fn_dest);
        !          4618:                                RETURN_FALSE;
        !          4619:                        }
        !          4620:                        break;
        !          4621: #endif /* HAVE_GD_JPG */
        !          4622: 
        !          4623: 
        !          4624: #ifdef HAVE_GD_PNG
        !          4625:                case PHP_GDIMG_TYPE_PNG:
        !          4626:                        im_org = gdImageCreateFromPng(org);
        !          4627:                        if (im_org == NULL) {
        !          4628:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to open '%s' Not a valid PNG file", fn_dest);
        !          4629:                                RETURN_FALSE;
        !          4630:                        }
        !          4631:                        break;
        !          4632: #endif /* HAVE_GD_PNG */
        !          4633: 
        !          4634:                default:
        !          4635:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Format not supported");
        !          4636:                        RETURN_FALSE;
        !          4637:                        break;
        !          4638:        }
        !          4639: 
        !          4640:        org_width  = gdImageSX (im_org);
        !          4641:        org_height = gdImageSY (im_org);
        !          4642: 
        !          4643:        x_ratio = (float) org_width / (float) dest_width;
        !          4644:        y_ratio = (float) org_height / (float) dest_height;
        !          4645: 
        !          4646:        if (x_ratio > 1 && y_ratio > 1) {
        !          4647:                if (y_ratio > x_ratio) {
        !          4648:                        x_ratio = y_ratio;
        !          4649:                } else {
        !          4650:                        y_ratio = x_ratio;
        !          4651:                }
        !          4652:                dest_width = (int) (org_width / x_ratio);
        !          4653:                dest_height = (int) (org_height / y_ratio);
        !          4654:        } else {
        !          4655:                x_ratio = (float) dest_width / (float) org_width;
        !          4656:                y_ratio = (float) dest_height / (float) org_height;
        !          4657: 
        !          4658:                if (y_ratio < x_ratio) {
        !          4659:                        x_ratio = y_ratio;
        !          4660:                } else {
        !          4661:                        y_ratio = x_ratio;
        !          4662:                }
        !          4663:                dest_width = (int) (org_width * x_ratio);
        !          4664:                dest_height = (int) (org_height * y_ratio);
        !          4665:        }
        !          4666: 
        !          4667:        im_tmp = gdImageCreate (dest_width, dest_height);
        !          4668:        if (im_tmp == NULL ) {
        !          4669:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to allocate temporary buffer");
        !          4670:                RETURN_FALSE;
        !          4671:        }
        !          4672: 
        !          4673:        gdImageCopyResized (im_tmp, im_org, 0, 0, 0, 0, dest_width, dest_height, org_width, org_height);
        !          4674: 
        !          4675:        gdImageDestroy(im_org);
        !          4676: 
        !          4677:        fclose(org);
        !          4678: 
        !          4679:        im_dest = gdImageCreate(dest_width, dest_height);
        !          4680:        if (im_dest == NULL) {
        !          4681:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to allocate destination buffer");
        !          4682:                RETURN_FALSE;
        !          4683:        }
        !          4684: 
        !          4685:        white = gdImageColorAllocate(im_dest, 255, 255, 255);
        !          4686:        if (white == -1) {
        !          4687:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to allocate the colors for the destination buffer");
        !          4688:                RETURN_FALSE;
        !          4689:        }
        !          4690: 
        !          4691:        black = gdImageColorAllocate(im_dest, 0, 0, 0);
        !          4692:        if (black == -1) {
        !          4693:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to allocate the colors for the destination buffer");
        !          4694:                RETURN_FALSE;
        !          4695:        }
        !          4696: 
        !          4697:        int_threshold = int_threshold * 32;
        !          4698: 
        !          4699:        for (y = 0; y < dest_height; y++) {
        !          4700:                for (x = 0; x < dest_width; x++) {
        !          4701:                        color_org = gdImageGetPixel (im_tmp, x, y);
        !          4702:                        median = (im_tmp->red[color_org] + im_tmp->green[color_org] + im_tmp->blue[color_org]) / 3;
        !          4703:                        if (median < int_threshold) {
        !          4704:                                color = black;
        !          4705:                        } else {
        !          4706:                                color = white;
        !          4707:                        }
        !          4708:                        gdImageSetPixel (im_dest, x, y, color);
        !          4709:                }
        !          4710:        }
        !          4711: 
        !          4712:        gdImageDestroy (im_tmp );
        !          4713: 
        !          4714:        gdImageWBMP(im_dest, black , dest);
        !          4715: 
        !          4716:        fflush(dest);
        !          4717:        fclose(dest);
        !          4718: 
        !          4719:        gdImageDestroy(im_dest);
        !          4720: 
        !          4721:        RETURN_TRUE;
        !          4722: }
        !          4723: /* }}} */
        !          4724: #endif /* HAVE_GD_WBMP */
        !          4725: 
        !          4726: #endif /* HAVE_LIBGD */
        !          4727: 
        !          4728: /* Section Filters */
        !          4729: #define PHP_GD_SINGLE_RES      \
        !          4730:        zval *SIM;      \
        !          4731:        gdImagePtr im_src;      \
        !          4732:        if (zend_parse_parameters(1 TSRMLS_CC, "r", &SIM) == FAILURE) { \
        !          4733:                RETURN_FALSE;   \
        !          4734:        }       \
        !          4735:        ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd);      \
        !          4736:        if (im_src == NULL) {   \
        !          4737:                RETURN_FALSE;   \
        !          4738:        }
        !          4739: 
        !          4740: static void php_image_filter_negate(INTERNAL_FUNCTION_PARAMETERS)
        !          4741: {
        !          4742:        PHP_GD_SINGLE_RES
        !          4743: 
        !          4744:        if (gdImageNegate(im_src) == 1) {
        !          4745:                RETURN_TRUE;
        !          4746:        }
        !          4747: 
        !          4748:        RETURN_FALSE;
        !          4749: }
        !          4750: 
        !          4751: static void php_image_filter_grayscale(INTERNAL_FUNCTION_PARAMETERS)
        !          4752: {
        !          4753:        PHP_GD_SINGLE_RES
        !          4754: 
        !          4755:        if (gdImageGrayScale(im_src) == 1) {
        !          4756:                RETURN_TRUE;
        !          4757:        }
        !          4758: 
        !          4759:        RETURN_FALSE;
        !          4760: }
        !          4761: 
        !          4762: static void php_image_filter_brightness(INTERNAL_FUNCTION_PARAMETERS)
        !          4763: {
        !          4764:        zval *SIM;
        !          4765:        gdImagePtr im_src;
        !          4766:        long brightness, tmp;
        !          4767: 
        !          4768:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zll", &SIM, &tmp, &brightness) == FAILURE) {
        !          4769:                RETURN_FALSE;
        !          4770:        }
        !          4771: 
        !          4772:        ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd);
        !          4773: 
        !          4774:        if (im_src == NULL) {
        !          4775:                RETURN_FALSE;
        !          4776:        }
        !          4777: 
        !          4778:        if (gdImageBrightness(im_src, (int)brightness) == 1) {
        !          4779:                RETURN_TRUE;
        !          4780:        }
        !          4781: 
        !          4782:        RETURN_FALSE;
        !          4783: }
        !          4784: 
        !          4785: static void php_image_filter_contrast(INTERNAL_FUNCTION_PARAMETERS)
        !          4786: {
        !          4787:        zval *SIM;
        !          4788:        gdImagePtr im_src;
        !          4789:        long contrast, tmp;
        !          4790: 
        !          4791:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &SIM, &tmp, &contrast) == FAILURE) {
        !          4792:                RETURN_FALSE;
        !          4793:        }
        !          4794: 
        !          4795:        ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd);
        !          4796: 
        !          4797:        if (im_src == NULL) {
        !          4798:                RETURN_FALSE;
        !          4799:        }
        !          4800: 
        !          4801:        if (gdImageContrast(im_src, (int)contrast) == 1) {
        !          4802:                RETURN_TRUE;
        !          4803:        }
        !          4804: 
        !          4805:        RETURN_FALSE;
        !          4806: }
        !          4807: 
        !          4808: static void php_image_filter_colorize(INTERNAL_FUNCTION_PARAMETERS)
        !          4809: {
        !          4810:        zval *SIM;
        !          4811:        gdImagePtr im_src;
        !          4812:        long r,g,b,tmp;
        !          4813:        long a = 0;
        !          4814: 
        !          4815:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rllll|l", &SIM, &tmp, &r, &g, &b, &a) == FAILURE) {
        !          4816:                RETURN_FALSE;
        !          4817:        }
        !          4818: 
        !          4819:        ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd);
        !          4820: 
        !          4821:        if (im_src == NULL) {
        !          4822:                RETURN_FALSE;
        !          4823:        }
        !          4824: 
        !          4825:        if (gdImageColor(im_src, (int) r, (int) g, (int) b, (int) a) == 1) {
        !          4826:                RETURN_TRUE;
        !          4827:        }
        !          4828: 
        !          4829:        RETURN_FALSE;
        !          4830: }
        !          4831: 
        !          4832: static void php_image_filter_edgedetect(INTERNAL_FUNCTION_PARAMETERS)
        !          4833: {
        !          4834:        PHP_GD_SINGLE_RES
        !          4835: 
        !          4836:        if (gdImageEdgeDetectQuick(im_src) == 1) {
        !          4837:                RETURN_TRUE;
        !          4838:        }
        !          4839: 
        !          4840:        RETURN_FALSE;
        !          4841: }
        !          4842: 
        !          4843: static void php_image_filter_emboss(INTERNAL_FUNCTION_PARAMETERS)
        !          4844: {
        !          4845:        PHP_GD_SINGLE_RES
        !          4846: 
        !          4847:        if (gdImageEmboss(im_src) == 1) {
        !          4848:                RETURN_TRUE;
        !          4849:        }
        !          4850: 
        !          4851:        RETURN_FALSE;
        !          4852: }
        !          4853: 
        !          4854: static void php_image_filter_gaussian_blur(INTERNAL_FUNCTION_PARAMETERS)
        !          4855: {
        !          4856:        PHP_GD_SINGLE_RES
        !          4857: 
        !          4858:        if (gdImageGaussianBlur(im_src) == 1) {
        !          4859:                RETURN_TRUE;
        !          4860:        }
        !          4861: 
        !          4862:        RETURN_FALSE;
        !          4863: }
        !          4864: 
        !          4865: static void php_image_filter_selective_blur(INTERNAL_FUNCTION_PARAMETERS)
        !          4866: {
        !          4867:        PHP_GD_SINGLE_RES
        !          4868: 
        !          4869:        if (gdImageSelectiveBlur(im_src) == 1) {
        !          4870:                RETURN_TRUE;
        !          4871:        }
        !          4872: 
        !          4873:        RETURN_FALSE;
        !          4874: }
        !          4875: 
        !          4876: static void php_image_filter_mean_removal(INTERNAL_FUNCTION_PARAMETERS)
        !          4877: {
        !          4878:        PHP_GD_SINGLE_RES
        !          4879: 
        !          4880:        if (gdImageMeanRemoval(im_src) == 1) {
        !          4881:                RETURN_TRUE;
        !          4882:        }
        !          4883: 
        !          4884:        RETURN_FALSE;
        !          4885: }
        !          4886: 
        !          4887: static void php_image_filter_smooth(INTERNAL_FUNCTION_PARAMETERS)
        !          4888: {
        !          4889:        zval *SIM;
        !          4890:        long tmp;
        !          4891:        gdImagePtr im_src;
        !          4892:        double weight;
        !          4893: 
        !          4894:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rld", &SIM, &tmp, &weight) == FAILURE) {
        !          4895:                RETURN_FALSE;
        !          4896:        }
        !          4897: 
        !          4898:        ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd);
        !          4899: 
        !          4900:        if (im_src == NULL) {
        !          4901:                RETURN_FALSE;
        !          4902:        }
        !          4903: 
        !          4904:        if (gdImageSmooth(im_src, (float)weight)==1) {
        !          4905:                RETURN_TRUE;
        !          4906:        }
        !          4907: 
        !          4908:        RETURN_FALSE;
        !          4909: }
        !          4910: 
        !          4911: static void php_image_filter_pixelate(INTERNAL_FUNCTION_PARAMETERS)
        !          4912: {
        !          4913:        zval *IM;
        !          4914:        gdImagePtr im;
        !          4915:        long tmp, blocksize;
        !          4916:        zend_bool mode = 0;
        !          4917: 
        !          4918:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll|b", &IM, &tmp, &blocksize, &mode) == FAILURE) {
        !          4919:                RETURN_FALSE;
        !          4920:        }
        !          4921: 
        !          4922:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          4923: 
        !          4924:        if (im == NULL) {
        !          4925:                RETURN_FALSE;
        !          4926:        }
        !          4927: 
        !          4928:        if (gdImagePixelate(im, (int) blocksize, (const unsigned int) mode)) {
        !          4929:                RETURN_TRUE;
        !          4930:        }
        !          4931: 
        !          4932:        RETURN_FALSE;
        !          4933: }
        !          4934: 
        !          4935: /* {{{ proto bool imagefilter(resource src_im, int filtertype, [args] )
        !          4936:    Applies Filter an image using a custom angle */
        !          4937: PHP_FUNCTION(imagefilter)
        !          4938: {
        !          4939:        zval *tmp;
        !          4940: 
        !          4941:        typedef void (*image_filter)(INTERNAL_FUNCTION_PARAMETERS);
        !          4942:        long filtertype;
        !          4943:        image_filter filters[] =
        !          4944:        {
        !          4945:                php_image_filter_negate ,
        !          4946:                php_image_filter_grayscale,
        !          4947:                php_image_filter_brightness,
        !          4948:                php_image_filter_contrast,
        !          4949:                php_image_filter_colorize,
        !          4950:                php_image_filter_edgedetect,
        !          4951:                php_image_filter_emboss,
        !          4952:                php_image_filter_gaussian_blur,
        !          4953:                php_image_filter_selective_blur,
        !          4954:                php_image_filter_mean_removal,
        !          4955:                php_image_filter_smooth,
        !          4956:                php_image_filter_pixelate
        !          4957:        };
        !          4958: 
        !          4959:        if (ZEND_NUM_ARGS() < 2 || ZEND_NUM_ARGS() > IMAGE_FILTER_MAX_ARGS) {
        !          4960:                WRONG_PARAM_COUNT;
        !          4961:        } else if (zend_parse_parameters(2 TSRMLS_CC, "rl", &tmp, &filtertype) == FAILURE) {
        !          4962:                return;
        !          4963:        }
        !          4964: 
        !          4965:        if (filtertype >= 0 && filtertype <= IMAGE_FILTER_MAX) {
        !          4966:                filters[filtertype](INTERNAL_FUNCTION_PARAM_PASSTHRU);
        !          4967:        }
        !          4968: }
        !          4969: /* }}} */
        !          4970: 
        !          4971: /* {{{ proto resource imageconvolution(resource src_im, array matrix3x3, double div, double offset)
        !          4972:    Apply a 3x3 convolution matrix, using coefficient div and offset */
        !          4973: PHP_FUNCTION(imageconvolution)
        !          4974: {
        !          4975:        zval *SIM, *hash_matrix;
        !          4976:        zval **var = NULL, **var2 = NULL;
        !          4977:        gdImagePtr im_src = NULL;
        !          4978:        double div, offset;
        !          4979:        int nelem, i, j, res;
        !          4980:        float matrix[3][3] = {{0,0,0}, {0,0,0}, {0,0,0}};
        !          4981: 
        !          4982:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "radd", &SIM, &hash_matrix, &div, &offset) == FAILURE) {
        !          4983:                RETURN_FALSE;
        !          4984:        }
        !          4985: 
        !          4986:        ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd);
        !          4987: 
        !          4988:        nelem = zend_hash_num_elements(Z_ARRVAL_P(hash_matrix));
        !          4989:        if (nelem != 3) {
        !          4990:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must have 3x3 array");
        !          4991:                RETURN_FALSE;
        !          4992:        }
        !          4993: 
        !          4994:        for (i=0; i<3; i++) {
        !          4995:                if (zend_hash_index_find(Z_ARRVAL_P(hash_matrix), (i), (void **) &var) == SUCCESS && Z_TYPE_PP(var) == IS_ARRAY) {
        !          4996:                        if (Z_TYPE_PP(var) != IS_ARRAY || zend_hash_num_elements(Z_ARRVAL_PP(var)) != 3 ) {
        !          4997:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must have 3x3 array");
        !          4998:                                RETURN_FALSE;
        !          4999:                        }
        !          5000: 
        !          5001:                        for (j=0; j<3; j++) {
        !          5002:                                if (zend_hash_index_find(Z_ARRVAL_PP(var), (j), (void **) &var2) == SUCCESS) {
        !          5003:                                        SEPARATE_ZVAL(var2);
        !          5004:                                        convert_to_double(*var2);
        !          5005:                                        matrix[i][j] = Z_DVAL_PP(var2);
        !          5006:                                } else {
        !          5007:                                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must have a 3x3 matrix");
        !          5008:                                        RETURN_FALSE;
        !          5009:                                }
        !          5010:                        }
        !          5011:                }
        !          5012:        }
        !          5013:        res = gdImageConvolution(im_src, matrix, div, offset);
        !          5014: 
        !          5015:        if (res) {
        !          5016:                RETURN_TRUE;
        !          5017:        } else {
        !          5018:                RETURN_FALSE;
        !          5019:        }
        !          5020: }
        !          5021: /* }}} */
        !          5022: /* End section: Filters */
        !          5023: 
        !          5024: #ifdef HAVE_GD_BUNDLED
        !          5025: /* {{{ proto bool imageantialias(resource im, bool on)
        !          5026:    Should antialiased functions used or not*/
        !          5027: PHP_FUNCTION(imageantialias)
        !          5028: {
        !          5029:        zval *IM;
        !          5030:        zend_bool alias;
        !          5031:        gdImagePtr im;
        !          5032: 
        !          5033:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rb", &IM, &alias) == FAILURE) {
        !          5034:                return;
        !          5035:        }
        !          5036: 
        !          5037:        ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
        !          5038:        gdImageAntialias(im, alias);
        !          5039:        RETURN_TRUE;
        !          5040: }
        !          5041: /* }}} */
        !          5042: #endif
        !          5043: 
        !          5044: /*
        !          5045:  * Local variables:
        !          5046:  * tab-width: 4
        !          5047:  * c-basic-offset: 4
        !          5048:  * End:
        !          5049:  * vim600: sw=4 ts=4 fdm=marker
        !          5050:  * vim<600: sw=4 ts=4
        !          5051:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>