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