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, °rees, &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>