1999-04-16 12:15:38 +00:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2001-12-11 15:32:16 +00:00
| PHP Version 4 |
1999-04-16 12:15:38 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2001-12-11 15:32:16 +00:00
| Copyright ( c ) 1997 - 2002 The PHP Group |
1999-04-16 12:15:38 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2000-05-18 15:34:45 +00:00
| This source file is subject to version 2.02 of the PHP license , |
1999-07-16 13:13:16 +00:00
| that is bundled with this package in the file LICENSE , and is |
| available at through the world - wide - web at |
2000-05-18 15:34:45 +00:00
| http : //www.php.net/license/2_02.txt. |
1999-07-16 13:13:16 +00:00
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world - wide - web , please send a note to |
| license @ php . net so we can mail you a copy immediately . |
1999-04-16 12:15:38 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2002-02-28 08:29:35 +00:00
| Authors : Rasmus Lerdorf < rasmus @ php . net > |
| Stig Bakken < ssb @ fast . no > |
1999-04-16 12:15:38 +00:00
| Jim Winstead < jimw @ php . net > |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*/
/* $Id$ */
/* gd 1.2 is copyright 1994, 1995, Quest Protein Database Center,
Cold Spring Harbor Labs . */
/* Note that there is no code from the gd package in this file */
1999-04-23 20:06:01 +00:00
2001-05-24 10:07:29 +00:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
1999-04-16 12:15:38 +00:00
# include "php.h"
1999-04-22 00:25:57 +00:00
# include "ext/standard/head.h"
1999-04-16 12:15:38 +00:00
# include <math.h>
1999-04-26 17:26:37 +00:00
# include "SAPI.h"
1999-12-04 19:19:57 +00:00
# include "php_gd.h"
2000-11-29 15:25:42 +00:00
# include "ext/standard/info.h"
1999-04-16 12:15:38 +00:00
# if HAVE_SYS_WAIT_H
# include <sys / wait.h>
# endif
# if HAVE_UNISTD_H
# include <unistd.h>
# endif
2000-06-15 23:45:05 +00:00
# ifdef PHP_WIN32
1999-04-16 12:15:38 +00:00
# include <io.h>
# include <fcntl.h>
# endif
# if HAVE_LIBGD
2000-04-05 22:30:19 +00:00
2000-11-29 15:25:42 +00:00
static int le_gd , le_gd_font ;
# if HAVE_LIBT1
2002-06-28 12:46:07 +00:00
# include <t1lib.h>
2000-11-29 15:25:42 +00:00
static int le_ps_font , le_ps_enc ;
2002-06-28 12:35:30 +00:00
static void php_free_ps_font ( zend_rsrc_list_entry * rsrc TSRMLS_DC ) ;
static void php_free_ps_enc ( zend_rsrc_list_entry * rsrc TSRMLS_DC ) ;
2000-11-29 15:25:42 +00:00
# endif
2000-04-05 22:30:19 +00:00
1999-04-16 12:15:38 +00:00
# include <gd.h>
# include <gdfontt.h> /* 1 Tiny font */
# include <gdfonts.h> /* 2 Small font */
# include <gdfontmb.h> /* 3 Medium bold font */
# include <gdfontl.h> /* 4 Large font */
# include <gdfontg.h> /* 5 Giant font */
2002-06-25 22:23:41 +00:00
# ifdef HAVE_GD_WBMP
2002-06-26 18:32:27 +00:00
# include "libgd/wbmp.h"
2002-06-25 22:23:41 +00:00
# endif
1999-07-23 15:18:37 +00:00
# ifdef ENABLE_GD_TTF
1999-04-21 21:27:18 +00:00
# include "gdttf.h"
1999-04-16 12:15:38 +00:00
# endif
# ifndef M_PI
# define M_PI 3.14159265358979323846
# endif
1999-07-23 15:18:37 +00:00
# ifdef ENABLE_GD_TTF
2001-07-05 21:23:28 +00:00
static void php_imagettftext_common ( INTERNAL_FUNCTION_PARAMETERS , int , int ) ;
1999-04-16 12:15:38 +00:00
# endif
2001-02-01 15:40:35 +00:00
# if HAVE_LIBGD15
2000-09-26 09:08:02 +00:00
/* it's >= 1.5, i.e. has IOCtx */
# define USE_GD_IOCTX 1
# else
# undef USE_GD_IOCTX
# endif
2001-02-01 15:40:35 +00:00
# ifdef USE_GD_IOCTX
# include "gd_ctx.c"
# else
2001-05-29 07:46:07 +00:00
# define gdImageCreateFromGdCtx NULL
# define gdImageCreateFromGd2Ctx NULL
# define gdImageCreateFromGd2partCtx NULL
# define gdImageCreateFromGifCtx NULL
# define gdImageCreateFromJpegCtx NULL
# define gdImageCreateFromPngCtx NULL
# define gdImageCreateFromWBMPCtx NULL
2001-02-01 15:40:35 +00:00
typedef FILE gdIOCtx ;
2001-08-11 16:39:07 +00:00
# define CTX_PUTC(c, fp) fputc(c, fp)
2000-09-26 09:08:02 +00:00
# endif
2002-06-28 12:35:30 +00:00
# ifndef HAVE_GDIMAGECOLORRESOLVE
extern int gdImageColorResolve ( gdImagePtr , int , int , int ) ;
# endif
# if HAVE_COLORCLOSESTHWB
int gdImageColorClosestHWB ( gdImagePtr im , int r , int g , int b ) ;
# endif
2001-07-30 17:29:57 +00:00
static gdImagePtr _php_image_create_from_string ( zval * * Data , char * tn , gdImagePtr ( * ioctx_func_p ) ( ) TSRMLS_DC ) ;
2001-04-06 18:01:52 +00:00
static void _php_image_create_from ( INTERNAL_FUNCTION_PARAMETERS , int image_type , char * tn , gdImagePtr ( * func_p ) ( ) , gdImagePtr ( * ioctx_func_p ) ( ) ) ;
static void _php_image_output ( INTERNAL_FUNCTION_PARAMETERS , int image_type , char * tn , void ( * func_p ) ( ) ) ;
static int _php_image_type ( char data [ 8 ] ) ;
static void _php_image_convert ( INTERNAL_FUNCTION_PARAMETERS , int image_type ) ;
2001-04-01 05:42:07 +00:00
static void _php_image_bw_convert ( gdImagePtr im_org , gdIOCtx * out , int threshold ) ;
2001-02-01 15:40:35 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ gd_functions[]
*/
1999-04-16 12:15:38 +00:00
function_entry gd_functions [ ] = {
1999-07-27 19:44:46 +00:00
PHP_FE ( imagearc , NULL )
2002-07-26 13:24:45 +00:00
PHP_FE ( imageellipse , NULL )
1999-07-27 19:44:46 +00:00
PHP_FE ( imagechar , NULL )
PHP_FE ( imagecharup , NULL )
PHP_FE ( imagecolorallocate , NULL )
2002-06-24 19:31:44 +00:00
# if HAVE_LIBGD15
2000-06-25 02:55:31 +00:00
PHP_FE ( imagepalettecopy , NULL )
2002-06-27 23:05:11 +00:00
PHP_FE ( imagecreatefromstring , NULL )
2002-06-24 19:31:44 +00:00
# endif
1999-07-27 19:44:46 +00:00
PHP_FE ( imagecolorat , NULL )
PHP_FE ( imagecolorclosest , NULL )
2002-06-24 19:31:44 +00:00
# if HAVE_COLORCLOSESTHWB
2000-06-25 02:55:31 +00:00
PHP_FE ( imagecolorclosesthwb , NULL )
2002-06-24 19:31:44 +00:00
# endif
1999-07-27 19:44:46 +00:00
PHP_FE ( imagecolordeallocate , NULL )
PHP_FE ( imagecolorresolve , NULL )
PHP_FE ( imagecolorexact , NULL )
PHP_FE ( imagecolorset , NULL )
PHP_FE ( imagecolortransparent , NULL )
PHP_FE ( imagecolorstotal , NULL )
PHP_FE ( imagecolorsforindex , NULL )
PHP_FE ( imagecopy , NULL )
2002-06-24 19:31:44 +00:00
# if HAVE_LIBGD15
2000-06-25 02:55:31 +00:00
PHP_FE ( imagecopymerge , NULL )
2002-06-24 19:31:44 +00:00
PHP_FE ( imagecopymergegray , NULL )
# endif
1999-07-27 19:44:46 +00:00
PHP_FE ( imagecopyresized , NULL )
PHP_FE ( imagecreate , NULL )
2002-06-24 19:31:44 +00:00
# if HAVE_LIBGD20
2001-04-13 12:00:12 +00:00
PHP_FE ( imagecreatetruecolor , NULL )
2001-05-29 07:46:07 +00:00
PHP_FE ( imagetruecolortopalette , NULL )
2001-04-13 12:00:12 +00:00
PHP_FE ( imagesetthickness , NULL )
PHP_FE ( imagefilledarc , NULL )
2002-06-25 09:00:09 +00:00
PHP_FE ( imagefilledellipse , NULL )
2001-04-13 12:00:12 +00:00
PHP_FE ( imagealphablending , NULL )
2001-05-29 07:46:07 +00:00
PHP_FE ( imagecolorresolvealpha , NULL )
PHP_FE ( imagecolorclosestalpha , NULL )
2001-04-13 12:00:12 +00:00
PHP_FE ( imagecolorexactalpha , NULL )
PHP_FE ( imagecopyresampled , NULL )
2002-06-24 19:31:44 +00:00
# endif
# if HAVE_GD_IMAGESETTILE
2001-05-29 07:46:07 +00:00
PHP_FE ( imagesettile , NULL )
2002-06-24 19:31:44 +00:00
# endif
2001-04-13 12:00:12 +00:00
2002-06-24 19:31:44 +00:00
# if HAVE_GD_IMAGESETBRUSH
2001-04-13 12:00:12 +00:00
PHP_FE ( imagesetbrush , NULL )
2002-06-24 19:31:44 +00:00
# endif
2001-04-13 12:00:12 +00:00
PHP_FE ( imagesetstyle , NULL )
2002-03-02 12:32:31 +00:00
# ifdef HAVE_GD_PNG
1999-10-17 14:57:49 +00:00
PHP_FE ( imagecreatefrompng , NULL )
2002-03-02 12:32:31 +00:00
# endif
# ifdef HAVE_GD_GIF_READ
1999-07-27 19:44:46 +00:00
PHP_FE ( imagecreatefromgif , NULL )
2002-03-02 12:32:31 +00:00
# endif
# ifdef HAVE_GD_JPG
2000-03-13 05:58:50 +00:00
PHP_FE ( imagecreatefromjpeg , NULL )
2002-03-02 12:32:31 +00:00
# endif
# ifdef HAVE_GD_WBMP
2001-06-07 13:17:02 +00:00
PHP_FE ( imagecreatefromwbmp , NULL )
2002-03-02 12:32:31 +00:00
# endif
# ifdef HAVE_GD_XBM
2000-06-07 00:37:49 +00:00
PHP_FE ( imagecreatefromxbm , NULL )
2002-03-02 12:32:31 +00:00
# endif
# ifdef HAVE_GD_XPM
2000-06-07 00:37:49 +00:00
PHP_FE ( imagecreatefromxpm , NULL )
2002-03-02 12:32:31 +00:00
# endif
2001-05-29 07:46:07 +00:00
PHP_FE ( imagecreatefromgd , NULL )
2002-03-02 12:32:31 +00:00
# ifdef HAVE_GD_GD2
2001-05-29 07:46:07 +00:00
PHP_FE ( imagecreatefromgd2 , NULL )
PHP_FE ( imagecreatefromgd2part , NULL )
2002-03-02 12:32:31 +00:00
# endif
# ifdef HAVE_GD_PNG
2001-05-29 07:46:07 +00:00
PHP_FE ( imagepng , NULL )
2002-03-02 12:32:31 +00:00
# endif
# ifdef HAVE_GD_GIF_CREATE
2001-05-29 07:46:07 +00:00
PHP_FE ( imagegif , NULL )
2002-03-02 12:32:31 +00:00
# endif
# ifdef HAVE_GD_JPG
2001-05-29 07:46:07 +00:00
PHP_FE ( imagejpeg , NULL )
2002-03-02 12:32:31 +00:00
# endif
# ifdef HAVE_GD_WBMP
2001-05-29 07:46:07 +00:00
PHP_FE ( imagewbmp , NULL )
2002-03-02 12:32:31 +00:00
# endif
2001-05-29 07:46:07 +00:00
PHP_FE ( imagegd , NULL )
2002-03-02 12:32:31 +00:00
# ifdef HAVE_GD_GD2
2001-05-29 07:46:07 +00:00
PHP_FE ( imagegd2 , NULL )
2002-03-02 12:32:31 +00:00
# endif
2001-05-29 07:46:07 +00:00
1999-07-27 19:44:46 +00:00
PHP_FE ( imagedestroy , NULL )
2000-05-14 15:25:13 +00:00
PHP_FE ( imagegammacorrect , NULL )
1999-07-27 19:44:46 +00:00
PHP_FE ( imagefill , NULL )
PHP_FE ( imagefilledpolygon , NULL )
PHP_FE ( imagefilledrectangle , NULL )
PHP_FE ( imagefilltoborder , NULL )
PHP_FE ( imagefontwidth , NULL )
PHP_FE ( imagefontheight , NULL )
PHP_FE ( imageinterlace , NULL )
PHP_FE ( imageline , NULL )
PHP_FE ( imageloadfont , NULL )
PHP_FE ( imagepolygon , NULL )
PHP_FE ( imagerectangle , NULL )
PHP_FE ( imagesetpixel , NULL )
PHP_FE ( imagestring , NULL )
PHP_FE ( imagestringup , NULL )
PHP_FE ( imagesx , NULL )
PHP_FE ( imagesy , NULL )
PHP_FE ( imagedashedline , NULL )
2002-06-24 19:31:44 +00:00
2002-03-02 12:32:31 +00:00
# ifdef ENABLE_GD_TTF
1999-07-27 19:44:46 +00:00
PHP_FE ( imagettfbbox , NULL )
PHP_FE ( imagettftext , NULL )
2002-06-24 19:31:44 +00:00
# if HAVE_LIBGD20 && HAVE_LIBFREETYPE && HAVE_GD_STRINGFTEX
2002-03-02 12:32:31 +00:00
PHP_FE ( imageftbbox , NULL )
PHP_FE ( imagefttext , NULL )
# endif
2002-06-24 19:31:44 +00:00
# endif
2002-03-02 12:32:31 +00:00
# ifdef HAVE_LIBT1
2000-02-25 06:43:51 +00:00
PHP_FE ( imagepsloadfont , NULL )
/*
PHP_FE ( imagepscopyfont , NULL )
*/
PHP_FE ( imagepsfreefont , NULL )
PHP_FE ( imagepsencodefont , NULL )
PHP_FE ( imagepsextendfont , NULL )
PHP_FE ( imagepsslantfont , NULL )
PHP_FE ( imagepstext , NULL )
PHP_FE ( imagepsbbox , NULL )
2002-03-02 12:32:31 +00:00
# endif
2000-07-14 21:51:31 +00:00
PHP_FE ( imagetypes , NULL )
2001-01-24 09:24:26 +00:00
2002-03-02 12:32:31 +00:00
# if defined(HAVE_GD_JPG) && defined(HAVE_GD_WBMP)
2001-01-24 09:24:26 +00:00
PHP_FE ( jpeg2wbmp , NULL )
2002-03-02 12:32:31 +00:00
# endif
# if defined(HAVE_GD_PNG) && defined(HAVE_GD_WBMP)
2001-01-24 09:24:26 +00:00
PHP_FE ( png2wbmp , NULL )
2002-03-02 12:32:31 +00:00
# endif
# ifdef HAVE_GD_WBMP
2001-01-24 09:24:26 +00:00
PHP_FE ( image2wbmp , NULL )
2002-03-02 12:32:31 +00:00
# endif
1999-04-16 12:15:38 +00:00
{ NULL , NULL , NULL }
} ;
2001-06-05 13:12:10 +00:00
/* }}} */
1999-04-16 12:15:38 +00:00
1999-12-17 20:55:31 +00:00
zend_module_entry gd_module_entry = {
2001-10-13 13:12:30 +00:00
STANDARD_MODULE_HEADER ,
2001-10-11 23:33:59 +00:00
" gd " ,
2001-10-13 13:12:30 +00:00
gd_functions ,
PHP_MINIT ( gd ) ,
NULL ,
NULL ,
NULL ,
PHP_MINFO ( gd ) ,
NO_VERSION_YET ,
STANDARD_MODULE_PROPERTIES
1999-04-16 12:15:38 +00:00
} ;
2000-05-23 09:33:51 +00:00
# ifdef COMPILE_DL_GD
2000-05-02 00:30:36 +00:00
ZEND_GET_MODULE ( gd )
1999-04-16 12:15:38 +00:00
# endif
2001-06-05 13:12:10 +00:00
/* {{{ php_free_gd_image
*/
2001-07-31 05:44:11 +00:00
static void php_free_gd_image ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
2000-10-20 18:25:16 +00:00
{
gdImageDestroy ( ( gdImagePtr ) rsrc - > ptr ) ;
}
2001-06-05 13:12:10 +00:00
/* }}} */
1999-04-16 12:15:38 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ php_free_gd_font
*/
2001-07-31 05:44:11 +00:00
static void php_free_gd_font ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
1999-12-17 21:50:07 +00:00
{
2000-10-20 18:25:16 +00:00
gdFontPtr fp = ( gdFontPtr ) rsrc - > ptr ;
2001-07-31 05:44:11 +00:00
1999-12-17 21:50:07 +00:00
if ( fp - > data ) {
efree ( fp - > data ) ;
}
efree ( fp ) ;
}
2001-06-05 13:12:10 +00:00
/* }}} */
1999-12-17 21:50:07 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ PHP_MINIT_FUNCTION
*/
1999-07-27 19:44:46 +00:00
PHP_MINIT_FUNCTION ( gd )
1999-04-16 12:15:38 +00:00
{
2000-11-29 15:25:42 +00:00
le_gd = zend_register_list_destructors_ex ( php_free_gd_image , NULL , " gd " , module_number ) ;
le_gd_font = zend_register_list_destructors_ex ( php_free_gd_font , NULL , " gd font " , module_number ) ;
2000-02-25 06:43:51 +00:00
# if HAVE_LIBT1
T1_SetBitmapPad ( 8 ) ;
T1_InitLib ( NO_LOGFILE | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE ) ;
T1_SetLogLevel ( T1LOG_DEBUG ) ;
2000-11-29 15:25:42 +00:00
le_ps_font = zend_register_list_destructors_ex ( php_free_ps_font , NULL , " gd PS font " , module_number ) ;
le_ps_enc = zend_register_list_destructors_ex ( php_free_ps_enc , NULL , " gd PS encoding " , module_number ) ;
2000-02-25 06:43:51 +00:00
# endif
2000-07-14 22:07:57 +00:00
REGISTER_LONG_CONSTANT ( " IMG_GIF " , 1 , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_JPG " , 2 , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_JPEG " , 2 , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_PNG " , 4 , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_WBMP " , 8 , CONST_CS | CONST_PERSISTENT ) ;
2001-07-02 12:49:21 +00:00
REGISTER_LONG_CONSTANT ( " IMG_XPM " , 16 , CONST_CS | CONST_PERSISTENT ) ;
2001-04-13 12:00:12 +00:00
# ifdef gdTiled
/* special colours for gd */
REGISTER_LONG_CONSTANT ( " IMG_COLOR_TILED " , gdTiled , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_COLOR_STYLED " , gdStyled , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_COLOR_BRUSHED " , gdBrushed , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_COLOR_STYLEDBRUSHED " , gdStyledBrushed , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_COLOR_TRANSPARENT " , gdTransparent , CONST_CS | CONST_PERSISTENT ) ;
# endif
# if HAVE_LIBGD20
/* for imagefilledarc */
2001-05-18 20:52:40 +00:00
REGISTER_LONG_CONSTANT ( " IMG_ARC_ROUNDED " , gdArc , CONST_CS | CONST_PERSISTENT ) ;
2001-04-13 12:00:12 +00:00
REGISTER_LONG_CONSTANT ( " IMG_ARC_PIE " , gdPie , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_ARC_CHORD " , gdChord , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_ARC_NOFILL " , gdNoFill , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_ARC_EDGED " , gdEdged , CONST_CS | CONST_PERSISTENT ) ;
# endif
1999-04-16 12:15:38 +00:00
return SUCCESS ;
}
2001-06-05 13:12:10 +00:00
/* }}} */
1999-04-16 12:15:38 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ PHP_MINFO_FUNCTION
*/
1999-07-27 19:44:46 +00:00
PHP_MINFO_FUNCTION ( gd )
1999-05-09 13:57:09 +00:00
{
2000-04-05 22:30:19 +00:00
php_info_print_table_start ( ) ;
php_info_print_table_row ( 2 , " GD Support " , " enabled " ) ;
1999-04-16 12:15:38 +00:00
/* need to use a PHPAPI function here because it is external module in windows */
2000-04-05 22:30:19 +00:00
2002-06-09 12:44:33 +00:00
# if HAVE_GD_BUNDLED
php_info_print_table_row ( 2 , " GD Version " , " bundled (2.0 compatible) " ) ;
# elif HAVE_LIBGD20
2001-04-13 12:00:12 +00:00
php_info_print_table_row ( 2 , " GD Version " , " 2.0 or higher " ) ;
# elif HAVE_GDIMAGECOLORRESOLVE
2000-04-05 22:30:19 +00:00
php_info_print_table_row ( 2 , " GD Version " , " 1.6.2 or higher " ) ;
1999-11-29 23:21:52 +00:00
# elif HAVE_LIBGD13
2000-04-05 22:30:19 +00:00
php_info_print_table_row ( 2 , " GD Version " , " between 1.3 and 1.6.1 " ) ;
1999-04-16 12:15:38 +00:00
# else
2000-04-05 22:30:19 +00:00
php_info_print_table_row ( 2 , " GD Version " , " 1.2 " ) ;
1999-04-16 12:15:38 +00:00
# endif
1999-11-29 23:21:52 +00:00
1999-07-23 15:18:37 +00:00
# ifdef ENABLE_GD_TTF
2000-04-05 22:30:19 +00:00
php_info_print_table_row ( 2 , " FreeType Support " , " enabled " ) ;
1999-11-29 23:21:52 +00:00
# if HAVE_LIBFREETYPE
2000-04-05 22:30:19 +00:00
php_info_print_table_row ( 2 , " FreeType Linkage " , " with freetype " ) ;
1999-11-29 23:21:52 +00:00
# elif HAVE_LIBTTF
2000-04-05 22:30:19 +00:00
php_info_print_table_row ( 2 , " FreeType Linkage " , " with TTF library " ) ;
1999-11-29 23:21:52 +00:00
# else
2000-04-05 22:30:19 +00:00
php_info_print_table_row ( 2 , " FreeType Linkage " , " with unknown library " ) ;
1999-11-29 23:21:52 +00:00
# endif
# endif
2000-06-06 17:12:05 +00:00
# ifdef HAVE_LIBT1
php_info_print_table_row ( 2 , " T1Lib Support " , " enabled " ) ;
# endif
2000-04-05 22:30:19 +00:00
/* this next part is stupid ... if I knew better, I'd put them all on one row (cmv) */
2001-08-24 20:05:58 +00:00
# ifdef HAVE_GD_GIF_READ
php_info_print_table_row ( 2 , " GIF Read Support " , " enabled " ) ;
# endif
2001-08-26 01:10:10 +00:00
# ifdef HAVE_GD_GIF_CREATE
2001-08-24 20:05:58 +00:00
php_info_print_table_row ( 2 , " GIF Create Support " , " enabled " ) ;
1999-11-29 23:21:52 +00:00
# endif
2000-04-07 18:50:08 +00:00
# ifdef HAVE_GD_JPG
php_info_print_table_row ( 2 , " JPG Support " , " enabled " ) ;
2000-07-14 21:51:31 +00:00
# endif
2000-11-01 04:38:28 +00:00
# ifdef HAVE_GD_PNG
php_info_print_table_row ( 2 , " PNG Support " , " enabled " ) ;
# endif
2000-07-14 21:51:31 +00:00
# ifdef HAVE_GD_WBMP
php_info_print_table_row ( 2 , " WBMP Support " , " enabled " ) ;
2000-11-01 04:38:28 +00:00
# endif
# ifdef HAVE_GD_XBM
php_info_print_table_row ( 2 , " XBM Support " , " enabled " ) ;
1999-04-16 12:15:38 +00:00
# endif
2000-04-05 22:30:19 +00:00
php_info_print_table_end ( ) ;
1999-04-16 12:15:38 +00:00
}
2001-06-05 13:12:10 +00:00
/* }}} */
1999-04-16 12:15:38 +00:00
1999-08-05 16:25:10 +00:00
/* Need this for cpdf. See also comment in file.c php3i_get_le_fp() */
2001-02-20 18:00:44 +00:00
PHP_GD_API int phpi_get_le_gd ( void )
1999-12-17 21:50:07 +00:00
{
2000-11-29 15:25:42 +00:00
return le_gd ;
1999-08-05 16:25:10 +00:00
}
1999-10-17 14:57:49 +00:00
# ifndef HAVE_GDIMAGECOLORRESOLVE
2001-06-05 13:12:10 +00:00
/* {{{ gdImageColorResolve
*/
1999-04-16 12:15:38 +00:00
/********************************************************************/
/* gdImageColorResolve is a replacement for the old fragment: */
/* */
/* if ((color=gdImageColorExact(im,R,G,B)) < 0) */
/* if ((color=gdImageColorAllocate(im,R,G,B)) < 0) */
/* color=gdImageColorClosest(im,R,G,B); */
/* */
/* in a single function */
int
gdImageColorResolve ( gdImagePtr im , int r , int g , int b )
{
int c ;
int ct = - 1 ;
int op = - 1 ;
long rd , gd , bd , dist ;
long mindist = 3 * 255 * 255 ; /* init to max poss dist */
for ( c = 0 ; c < im - > colorsTotal ; c + + ) {
if ( im - > open [ c ] ) {
op = c ; /* Save open slot */
continue ; /* Color not in use */
}
rd = ( long ) ( im - > red [ c ] - r ) ;
gd = ( long ) ( im - > green [ c ] - g ) ;
bd = ( long ) ( im - > blue [ c ] - b ) ;
dist = rd * rd + gd * gd + bd * bd ;
if ( dist < mindist ) {
if ( dist = = 0 ) {
return c ; /* Return exact match color */
}
mindist = dist ;
ct = c ;
}
}
/* no exact match. We now know closest, but first try to allocate exact */
if ( op = = - 1 ) {
op = im - > colorsTotal ;
if ( op = = gdMaxColors ) { /* No room for more colors */
return ct ; /* Return closest available color */
}
im - > colorsTotal + + ;
}
im - > red [ op ] = r ;
im - > green [ op ] = g ;
im - > blue [ op ] = b ;
im - > open [ op ] = 0 ;
return op ; /* Return newly allocated color */
}
2001-06-05 13:12:10 +00:00
/* }}} */
1999-04-16 12:15:38 +00:00
1999-10-17 14:57:49 +00:00
# endif
2001-03-12 13:57:53 +00:00
# define FLIPWORD(a) (((a & 0xff000000) >> 24) | ((a & 0x00ff0000) >> 8) | ((a & 0x0000ff00) << 8) | ((a & 0x000000ff) << 24))
1999-04-16 12:15:38 +00:00
/* {{{ proto int imageloadfont(string filename)
1999-11-24 22:04:49 +00:00
Load a new font */
2000-11-23 14:56:09 +00:00
PHP_FUNCTION ( imageloadfont )
{
2000-02-28 16:52:03 +00:00
zval * * file ;
1999-04-16 12:15:38 +00:00
int hdr_size = sizeof ( gdFont ) - sizeof ( char * ) ;
2001-03-12 13:57:53 +00:00
int ind , body_size , n = 0 , b , i , body_size_check ;
1999-04-16 12:15:38 +00:00
gdFontPtr font ;
2002-03-16 01:28:57 +00:00
php_stream * stream ;
1999-04-16 12:15:38 +00:00
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & file ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-02-28 16:52:03 +00:00
convert_to_string_ex ( file ) ;
1999-04-16 12:15:38 +00:00
2002-03-17 22:50:59 +00:00
stream = php_stream_open_wrapper ( Z_STRVAL_PP ( file ) , " rb " , IGNORE_PATH | IGNORE_URL_WIN | REPORT_ERRORS , NULL ) ;
2002-03-15 21:03:08 +00:00
if ( stream = = NULL ) {
1999-04-16 12:15:38 +00:00
RETURN_FALSE ;
}
/* Only supports a architecture-dependent binary dump format
* at the moment .
* The file format is like this on machines with 32 - byte integers :
*
* byte 0 - 3 : ( int ) number of characters in the font
* byte 4 - 7 : ( int ) value of first character in the font ( often 32 , space )
* byte 8 - 11 : ( int ) pixel width of each character
* byte 12 - 15 : ( int ) pixel height of each character
* bytes 16 - : ( char ) array with character data , one byte per pixel
* in each character , for a total of
* ( nchars * width * height ) bytes .
*/
font = ( gdFontPtr ) emalloc ( sizeof ( gdFont ) ) ;
b = 0 ;
2002-03-15 21:03:08 +00:00
while ( b < hdr_size & & ( n = php_stream_read ( stream , ( char * ) & font [ b ] , hdr_size - b ) ) )
1999-04-16 12:15:38 +00:00
b + = n ;
if ( ! n ) {
2002-03-15 21:03:08 +00:00
php_stream_close ( stream ) ;
1999-04-16 12:15:38 +00:00
efree ( font ) ;
2002-03-15 21:03:08 +00:00
if ( php_stream_eof ( stream ) ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): End of file while reading header " , get_active_function_name ( TSRMLS_C ) ) ;
1999-04-16 12:15:38 +00:00
} else {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Error while reading header " , get_active_function_name ( TSRMLS_C ) ) ;
1999-04-16 12:15:38 +00:00
}
RETURN_FALSE ;
}
2002-03-15 21:03:08 +00:00
i = php_stream_tell ( stream ) ;
php_stream_seek ( stream , 0 , SEEK_END ) ;
body_size_check = php_stream_tell ( stream ) - hdr_size ;
php_stream_seek ( stream , i , SEEK_SET ) ;
1999-04-16 12:15:38 +00:00
body_size = font - > w * font - > h * font - > nchars ;
2001-03-12 13:57:53 +00:00
if ( body_size ! = body_size_check ) {
font - > w = FLIPWORD ( font - > w ) ;
font - > h = FLIPWORD ( font - > h ) ;
font - > nchars = FLIPWORD ( font - > nchars ) ;
body_size = font - > w * font - > h * font - > nchars ;
}
if ( body_size ! = body_size_check ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Error reading font " , get_active_function_name ( TSRMLS_C ) ) ;
2001-03-12 13:57:53 +00:00
efree ( font ) ;
RETURN_FALSE ;
}
1999-04-16 12:15:38 +00:00
font - > data = emalloc ( body_size ) ;
b = 0 ;
2002-03-15 21:03:08 +00:00
while ( b < body_size & & ( n = php_stream_read ( stream , & font - > data [ b ] , body_size - b ) ) )
1999-04-16 12:15:38 +00:00
b + = n ;
if ( ! n ) {
2002-03-15 21:03:08 +00:00
php_stream_close ( stream ) ;
1999-04-16 12:15:38 +00:00
efree ( font - > data ) ;
efree ( font ) ;
2002-03-15 21:03:08 +00:00
if ( php_stream_eof ( stream ) ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): End of file while reading body " , get_active_function_name ( TSRMLS_C ) ) ;
1999-04-16 12:15:38 +00:00
} else {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Error while reading body " , get_active_function_name ( TSRMLS_C ) ) ;
1999-04-16 12:15:38 +00:00
}
RETURN_FALSE ;
}
2002-03-15 21:03:08 +00:00
php_stream_close ( stream ) ;
1999-04-16 12:15:38 +00:00
/* Adding 5 to the font index so we will never have font indices
* that overlap with the old fonts ( with indices 1 - 5 ) . The first
* list index given out is always 1.
*/
2000-11-29 15:25:42 +00:00
ind = 5 + zend_list_insert ( font , le_gd_font ) ;
1999-04-16 12:15:38 +00:00
RETURN_LONG ( ind ) ;
}
/* }}} */
2001-04-13 12:00:12 +00:00
/* {{{ proto void imagesetstyle(resource im, array styles)
2001-06-11 14:39:13 +00:00
Set the line drawing styles for use with imageline and IMG_COLOR_STYLED . */
2001-04-13 12:00:12 +00:00
PHP_FUNCTION ( imagesetstyle )
{
2001-05-21 18:50:05 +00:00
zval * * IM , * * styles ;
2001-04-13 12:00:12 +00:00
gdImagePtr im ;
int * stylearr ;
int index ;
HashPosition pos ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & IM , & styles ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-04-13 12:00:12 +00:00
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
2001-06-11 15:21:47 +00:00
convert_to_array_ex ( styles ) ;
2001-04-13 12:00:12 +00:00
/* copy the style values in the stylearr */
stylearr = emalloc ( sizeof ( int ) * zend_hash_num_elements ( HASH_OF ( * styles ) ) ) ;
zend_hash_internal_pointer_reset_ex ( HASH_OF ( * styles ) , & pos ) ;
for ( index = 0 ; ; zend_hash_move_forward_ex ( HASH_OF ( * styles ) , & pos ) ) {
zval * * item ;
if ( zend_hash_get_current_data_ex ( HASH_OF ( * styles ) , ( void * * ) & item , & pos ) = = FAILURE )
break ;
convert_to_long_ex ( item ) ;
stylearr [ index + + ] = Z_LVAL_PP ( item ) ;
}
gdImageSetStyle ( im , stylearr , index ) ;
efree ( stylearr ) ;
RETURN_TRUE ;
}
/* }}} */
2002-06-24 19:31:44 +00:00
# if HAVE_LIBGD20
2001-04-13 12:00:12 +00:00
/* {{{ proto int imagecreatetruecolor(int x_size, int y_size)
Create a new true color image */
PHP_FUNCTION ( imagecreatetruecolor )
{
zval * * x_size , * * y_size ;
gdImagePtr im ;
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & x_size , & y_size ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-04-13 12:00:12 +00:00
}
convert_to_long_ex ( x_size ) ;
convert_to_long_ex ( y_size ) ;
im = gdImageCreateTrueColor ( Z_LVAL_PP ( x_size ) , Z_LVAL_PP ( y_size ) ) ;
ZEND_REGISTER_RESOURCE ( return_value , im , le_gd ) ;
}
/* }}} */
2001-12-06 18:37:05 +00:00
/* {{{ proto void imagetruecolortopalette(resource im, bool ditherFlag, int colorsWanted)
2001-10-08 18:39:42 +00:00
Convert a true colour image to a palette based image with a number of colours , optionally using dithering . */
2001-04-13 12:00:12 +00:00
PHP_FUNCTION ( imagetruecolortopalette )
{
zval * * IM , * * dither , * * ncolors ;
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 3 | | zend_get_parameters_ex ( 3 , & IM , & dither , & ncolors ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-04-13 12:00:12 +00:00
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
convert_to_boolean_ex ( dither ) ;
convert_to_long_ex ( ncolors ) ;
gdImageTrueColorToPalette ( im , Z_LVAL_PP ( dither ) , Z_LVAL_PP ( ncolors ) ) ;
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto void imagesetthickness(resource im, int thickness)
2001-10-08 18:39:42 +00:00
Set line thickness for drawing lines , ellipses , rectangles , polygons etc . */
2001-04-13 12:00:12 +00:00
PHP_FUNCTION ( imagesetthickness )
{
zval * * IM , * * thick ;
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & IM , & thick ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-04-13 12:00:12 +00:00
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
2001-06-11 13:57:47 +00:00
convert_to_long_ex ( thick ) ;
2001-04-13 12:00:12 +00:00
gdImageSetThickness ( im , Z_LVAL_PP ( thick ) ) ;
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto void imagefilledellipse(resource im, int cx, int cy, int w, int h, int color)
2001-10-08 18:39:42 +00:00
Draw an ellipse */
2001-04-13 12:00:12 +00:00
PHP_FUNCTION ( imagefilledellipse )
{
zval * * IM , * * cx , * * cy , * * w , * * h , * * color ;
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 6 | | zend_get_parameters_ex ( 6 , & IM , & cx , & cy , & w , & h , & color ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-04-13 12:00:12 +00:00
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
convert_to_long_ex ( cx ) ;
convert_to_long_ex ( cy ) ;
convert_to_long_ex ( w ) ;
convert_to_long_ex ( h ) ;
convert_to_long_ex ( color ) ;
gdImageFilledEllipse ( im , Z_LVAL_PP ( cx ) , Z_LVAL_PP ( cy ) , Z_LVAL_PP ( w ) , Z_LVAL_PP ( h ) , Z_LVAL_PP ( color ) ) ;
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto int imagefilledarc(int im, int cx, int cy, int w, int h, int s, int e, int col, int style)
Draw a filled partial ellipse */
PHP_FUNCTION ( imagefilledarc )
{
zval * * IM , * * cx , * * cy , * * w , * * h , * * ST , * * E , * * col , * * style ;
gdImagePtr im ;
2001-08-11 16:39:07 +00:00
int e , st ;
2001-04-13 12:00:12 +00:00
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 9 | | zend_get_parameters_ex ( 9 , & IM , & cx , & cy , & w , & h , & ST , & E , & col , & style ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-04-13 12:00:12 +00:00
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
convert_to_long_ex ( cx ) ;
convert_to_long_ex ( cy ) ;
convert_to_long_ex ( w ) ;
convert_to_long_ex ( h ) ;
convert_to_long_ex ( ST ) ;
convert_to_long_ex ( E ) ;
convert_to_long_ex ( col ) ;
convert_to_long_ex ( style ) ;
e = Z_LVAL_PP ( E ) ;
st = Z_LVAL_PP ( ST ) ;
if ( e < 0 ) e % = 360 ;
if ( st < 0 ) st % = 360 ;
2001-08-11 16:39:07 +00:00
gdImageFilledArc ( im , Z_LVAL_PP ( cx ) , Z_LVAL_PP ( cy ) , Z_LVAL_PP ( w ) , Z_LVAL_PP ( h ) , st , e , Z_LVAL_PP ( col ) , Z_LVAL_PP ( style ) ) ;
2001-04-13 12:00:12 +00:00
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto void imagealphablending(resource im, bool on)
Turn alpha blending mode on or off for the given image */
PHP_FUNCTION ( imagealphablending )
{
zval * * IM , * * blend ;
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & IM , & blend ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-04-13 12:00:12 +00:00
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
convert_to_boolean_ex ( blend ) ;
gdImageAlphaBlending ( im , Z_LVAL_PP ( blend ) ) ;
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto int imagecolorresolvealpha(resource im, int red, int green, int blue, int alpha)
Resolve / Allocate a colour with an alpha level . Works for true colour and palette based images */
PHP_FUNCTION ( imagecolorresolvealpha )
{
zval * * IM , * * red , * * green , * * blue , * * alpha ;
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 5 | | zend_get_parameters_ex ( 5 , & IM , & red , & green , & blue , & alpha ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-04-13 12:00:12 +00:00
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
convert_to_long_ex ( red ) ;
convert_to_long_ex ( green ) ;
convert_to_long_ex ( blue ) ;
convert_to_long_ex ( alpha ) ;
RETURN_LONG ( gdImageColorResolveAlpha ( im , Z_LVAL_PP ( red ) , Z_LVAL_PP ( green ) , Z_LVAL_PP ( blue ) , Z_LVAL_PP ( alpha ) ) ) ;
}
/* }}} */
/* {{{ proto int imagecolorclosestalpha(resource im, int red, int green, int blue, int alpha)
2001-10-08 18:39:42 +00:00
Find the closest matching colour with alpha transparency */
2001-04-13 12:00:12 +00:00
PHP_FUNCTION ( imagecolorclosestalpha )
{
zval * * IM , * * red , * * green , * * blue , * * alpha ;
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 5 | | zend_get_parameters_ex ( 5 , & IM , & red , & green , & blue , & alpha ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-04-13 12:00:12 +00:00
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
convert_to_long_ex ( red ) ;
convert_to_long_ex ( green ) ;
convert_to_long_ex ( blue ) ;
convert_to_long_ex ( alpha ) ;
RETURN_LONG ( gdImageColorClosestAlpha ( im , Z_LVAL_PP ( red ) , Z_LVAL_PP ( green ) , Z_LVAL_PP ( blue ) , Z_LVAL_PP ( alpha ) ) ) ;
}
/* }}} */
/* {{{ proto int imagecolorexactalpha(resource im, int red, int green, int blue, int alpha)
2001-10-08 18:39:42 +00:00
Find exact match for colour with transparency */
2001-04-13 12:00:12 +00:00
PHP_FUNCTION ( imagecolorexactalpha )
{
zval * * IM , * * red , * * green , * * blue , * * alpha ;
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 5 | | zend_get_parameters_ex ( 5 , & IM , & red , & green , & blue , & alpha ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-04-13 12:00:12 +00:00
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
convert_to_long_ex ( red ) ;
convert_to_long_ex ( green ) ;
convert_to_long_ex ( blue ) ;
convert_to_long_ex ( alpha ) ;
RETURN_LONG ( gdImageColorExactAlpha ( im , Z_LVAL_PP ( red ) , Z_LVAL_PP ( green ) , Z_LVAL_PP ( blue ) , Z_LVAL_PP ( alpha ) ) ) ;
}
/* }}} */
/* {{{ proto int imagecopyresampled(int dst_im, int 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)
Copy and resize part of an image using resampling to help ensure clarity */
PHP_FUNCTION ( imagecopyresampled )
{
zval * * SIM , * * DIM , * * SX , * * SY , * * SW , * * SH , * * DX , * * DY , * * DW , * * DH ;
gdImagePtr im_dst , im_src ;
int srcH , srcW , dstH , dstW , srcY , srcX , dstY , dstX ;
if ( ZEND_NUM_ARGS ( ) ! = 10 | |
2001-07-30 17:29:57 +00:00
zend_get_parameters_ex ( 10 , & DIM , & SIM , & DX , & DY , & SX , & SY , & DW , & DH , & SW , & SH ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-04-13 12:00:12 +00:00
}
ZEND_FETCH_RESOURCE ( im_dst , gdImagePtr , DIM , - 1 , " Image " , le_gd ) ;
ZEND_FETCH_RESOURCE ( im_src , gdImagePtr , SIM , - 1 , " Image " , le_gd ) ;
convert_to_long_ex ( SX ) ;
convert_to_long_ex ( SY ) ;
convert_to_long_ex ( SW ) ;
convert_to_long_ex ( SH ) ;
convert_to_long_ex ( DX ) ;
convert_to_long_ex ( DY ) ;
convert_to_long_ex ( DW ) ;
convert_to_long_ex ( DH ) ;
srcX = Z_LVAL_PP ( SX ) ;
srcY = Z_LVAL_PP ( SY ) ;
srcH = Z_LVAL_PP ( SH ) ;
srcW = Z_LVAL_PP ( SW ) ;
dstX = Z_LVAL_PP ( DX ) ;
dstY = Z_LVAL_PP ( DY ) ;
dstH = Z_LVAL_PP ( DH ) ;
dstW = Z_LVAL_PP ( DW ) ;
gdImageCopyResampled ( im_dst , im_src , dstX , dstY , srcX , srcY , dstW , dstH , srcW , srcH ) ;
RETURN_TRUE ;
}
2002-06-24 19:31:44 +00:00
/* }}} */
# endif
2001-04-13 12:00:12 +00:00
2002-06-24 19:31:44 +00:00
# if HAVE_GD_IMAGESETTILE
2001-04-13 12:00:12 +00:00
/* {{{ proto int imagesettile(resource image, resource tile)
2001-10-08 18:39:42 +00:00
Set the tile image to $ tile when filling $ image with the " IMG_COLOR_TILED " color */
2001-04-13 12:00:12 +00:00
PHP_FUNCTION ( imagesettile )
{
zval * * IM , * * TILE ;
gdImagePtr im , tile ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & IM , & TILE ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-04-13 12:00:12 +00:00
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
ZEND_FETCH_RESOURCE ( tile , gdImagePtr , TILE , - 1 , " Image " , le_gd ) ;
2001-08-11 16:39:07 +00:00
gdImageSetTile ( im , tile ) ;
2001-04-13 12:00:12 +00:00
RETURN_TRUE ;
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif
2001-04-13 12:00:12 +00:00
2002-06-24 19:31:44 +00:00
# if HAVE_GD_IMAGESETBRUSH
2001-04-13 12:00:12 +00:00
/* {{{ proto int imagesetbrush(resource image, resource brush)
2001-10-08 18:39:42 +00:00
Set the brush image to $ brush when filling $ image with the " IMG_COLOR_BRUSHED " color */
2001-04-13 12:00:12 +00:00
PHP_FUNCTION ( imagesetbrush )
{
zval * * IM , * * TILE ;
gdImagePtr im , tile ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & IM , & TILE ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-04-13 12:00:12 +00:00
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
ZEND_FETCH_RESOURCE ( tile , gdImagePtr , TILE , - 1 , " Image " , le_gd ) ;
2001-08-11 16:39:07 +00:00
gdImageSetBrush ( im , tile ) ;
2001-04-13 12:00:12 +00:00
RETURN_TRUE ;
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif
2001-04-13 12:00:12 +00:00
1999-04-16 12:15:38 +00:00
/* {{{ proto int imagecreate(int x_size, int y_size)
1999-11-24 22:04:49 +00:00
Create a new image */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagecreate )
{
2000-02-28 16:52:03 +00:00
zval * * x_size , * * y_size ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & x_size , & y_size ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( x_size ) ;
convert_to_long_ex ( y_size ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
im = gdImageCreate ( Z_LVAL_PP ( x_size ) , Z_LVAL_PP ( y_size ) ) ;
1999-04-16 12:15:38 +00:00
2000-11-29 15:25:42 +00:00
ZEND_REGISTER_RESOURCE ( return_value , im , le_gd ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
2000-07-14 21:51:31 +00:00
/* {{{ proto int imagetypes(void)
2001-05-29 07:46:07 +00:00
Return the types of images supported in a bitfield - 1 = GIF , 2 = JPEG , 4 = PNG , 8 = WBMP , 16 = XPM */
2000-07-14 21:51:31 +00:00
PHP_FUNCTION ( imagetypes )
{
int ret = 0 ;
2002-02-01 08:53:47 +00:00
# ifdef HAVE_GD_GIF_CREATE
2000-07-14 21:51:31 +00:00
ret = 1 ;
# endif
# ifdef HAVE_GD_JPG
ret | = 2 ;
# endif
# ifdef HAVE_GD_PNG
ret | = 4 ;
# endif
# ifdef HAVE_GD_WBMP
ret | = 8 ;
2001-05-29 07:46:07 +00:00
# endif
# ifdef HAVE_GD_XPM
ret | = 16 ;
2000-07-14 21:51:31 +00:00
# endif
2001-08-13 07:55:39 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 0 ) {
WRONG_PARAM_COUNT ;
}
2001-08-13 06:43:47 +00:00
2000-07-14 21:51:31 +00:00
RETURN_LONG ( ret ) ;
}
2001-06-05 13:12:10 +00:00
/* }}} */
1999-10-17 14:57:49 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ _php_image_type
*/
2001-08-07 16:35:35 +00:00
static const char php_sig_gd2 [ 3 ] = { ' g ' , ' d ' , ' 2 ' } ;
2000-11-03 20:31:36 +00:00
static int _php_image_type ( char data [ 8 ] )
2000-11-03 19:53:42 +00:00
{
2000-11-08 14:56:09 +00:00
# ifdef HAVE_LIBGD15
2000-11-03 19:53:42 +00:00
/* Based on ext/standard/images.c */
2002-06-28 09:23:50 +00:00
if ( data = = NULL | | strlen ( data ) < = 0 )
2000-11-03 20:31:36 +00:00
return - 1 ;
2001-08-07 16:15:45 +00:00
if ( ! memcmp ( data , php_sig_gd2 , 3 ) )
return PHP_GDIMG_TYPE_GD2 ;
else if ( ! memcmp ( data , php_sig_jpg , 3 ) )
2000-11-03 20:31:36 +00:00
return PHP_GDIMG_TYPE_JPG ;
else if ( ! memcmp ( data , php_sig_png , 3 ) ) {
if ( ! memcmp ( data , php_sig_png , 8 ) )
return PHP_GDIMG_TYPE_PNG ;
}
else if ( ! memcmp ( data , php_sig_gif , 3 ) )
return PHP_GDIMG_TYPE_GIF ;
2002-04-11 20:32:03 +00:00
# ifdef HAVE_GD_WBMP
2000-11-03 20:31:36 +00:00
else {
gdIOCtx * io_ctx ;
io_ctx = gdNewDynamicCtx ( 8 , data ) ;
if ( io_ctx ) {
2002-06-25 22:23:41 +00:00
if ( getmbi ( ( int ( * ) ( void * ) ) gdGetC , io_ctx ) = = 0 & & skipheader ( ( int ( * ) ( void * ) ) gdGetC , io_ctx ) = = 0 ) {
2000-11-03 20:31:36 +00:00
io_ctx - > free ( io_ctx ) ;
return PHP_GDIMG_TYPE_WBM ;
} else
io_ctx - > free ( io_ctx ) ;
}
}
2000-11-03 20:44:04 +00:00
# endif
2000-11-03 19:53:42 +00:00
return - 1 ;
2000-11-08 14:56:09 +00:00
# endif
2000-11-03 19:53:42 +00:00
}
2001-06-05 13:12:10 +00:00
/* }}} */
2000-11-03 19:53:42 +00:00
2002-06-27 23:05:11 +00:00
# ifdef HAVE_LIBGD15
2001-06-05 13:12:10 +00:00
/* {{{ _php_image_create_from_string
*/
2001-07-30 17:29:57 +00:00
gdImagePtr _php_image_create_from_string ( zval * * data , char * tn , gdImagePtr ( * ioctx_func_p ) ( ) TSRMLS_DC )
2000-11-03 20:31:36 +00:00
{
gdImagePtr im ;
gdIOCtx * io_ctx ;
2000-11-03 19:53:42 +00:00
2001-08-11 16:39:07 +00:00
io_ctx = gdNewDynamicCtx ( Z_STRLEN_PP ( data ) , Z_STRVAL_PP ( data ) ) ;
2000-11-03 19:53:42 +00:00
2000-11-03 20:31:36 +00:00
if ( ! io_ctx ) {
return NULL ;
2000-11-03 19:53:42 +00:00
}
im = ( * ioctx_func_p ) ( io_ctx ) ;
2000-11-03 20:31:36 +00:00
if ( ! im ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Passed data is not in '%s' format " , get_active_function_name ( TSRMLS_C ) , tn ) ;
2000-11-03 20:31:36 +00:00
return NULL ;
}
2000-11-03 19:53:42 +00:00
2000-11-03 20:31:36 +00:00
return im ;
2000-11-03 19:53:42 +00:00
}
2001-06-05 13:12:10 +00:00
/* }}} */
2000-11-03 19:53:42 +00:00
2000-11-03 20:31:36 +00:00
/* {{{ proto int imagecreatefromstring(string image)
Create a new image from the image stream in the string */
2001-07-30 17:29:57 +00:00
PHP_FUNCTION ( imagecreatefromstring )
2000-11-03 19:53:42 +00:00
{
2000-11-03 20:31:36 +00:00
zval * * data ;
gdImagePtr im ;
int imtype ;
char sig [ 8 ] ;
2000-11-03 19:53:42 +00:00
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & data ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-11-23 14:56:09 +00:00
}
convert_to_string_ex ( data ) ;
memcpy ( sig , Z_STRVAL_PP ( data ) , 8 ) ;
2000-11-03 20:31:36 +00:00
imtype = _php_image_type ( sig ) ;
switch ( imtype ) {
case PHP_GDIMG_TYPE_JPG :
# ifdef HAVE_GD_JPG
2001-07-30 17:29:57 +00:00
im = _php_image_create_from_string ( data , " JPEG " , gdImageCreateFromJpegCtx TSRMLS_CC ) ;
2000-11-03 20:31:36 +00:00
# else
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): No JPEG support in this PHP build " , get_active_function_name ( TSRMLS_C ) ) ;
2000-11-04 20:43:53 +00:00
RETURN_FALSE ;
2000-11-03 20:31:36 +00:00
# endif
break ;
case PHP_GDIMG_TYPE_PNG :
# ifdef HAVE_GD_PNG
2001-07-30 17:29:57 +00:00
im = _php_image_create_from_string ( data , " PNG " , gdImageCreateFromPngCtx TSRMLS_CC ) ;
2000-11-03 20:31:36 +00:00
# else
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): No PNG support in this PHP build " , get_active_function_name ( TSRMLS_C ) ) ;
2000-11-04 20:43:53 +00:00
RETURN_FALSE ;
2000-11-03 20:31:36 +00:00
# endif
break ;
case PHP_GDIMG_TYPE_GIF :
2001-08-24 20:05:58 +00:00
# ifdef HAVE_GD_GIF_READ
2001-07-30 17:29:57 +00:00
im = _php_image_create_from_string ( data , " GIF " , gdImageCreateFromGifCtx TSRMLS_CC ) ;
2000-11-03 20:31:36 +00:00
# else
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): No GIF support in this PHP build " , get_active_function_name ( TSRMLS_C ) ) ;
2000-11-04 20:43:53 +00:00
RETURN_FALSE ;
2000-11-03 20:31:36 +00:00
# endif
break ;
case PHP_GDIMG_TYPE_WBM :
# ifdef HAVE_GD_WBMP
2001-08-07 16:15:45 +00:00
im = _php_image_create_from_string ( data , " WBMP " , gdImageCreateFromWBMPCtx TSRMLS_CC ) ;
2000-11-03 20:31:36 +00:00
# else
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): No WBMP support in this PHP build " , get_active_function_name ( TSRMLS_C ) ) ;
2000-11-04 20:43:53 +00:00
RETURN_FALSE ;
2000-11-03 20:31:36 +00:00
# endif
2001-08-07 16:15:45 +00:00
break ;
case PHP_GDIMG_TYPE_GD2 :
# ifdef HAVE_GD_GD2
im = _php_image_create_from_string ( data , " GD2 " , gdImageCreateFromGd2Ctx TSRMLS_CC ) ;
# else
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): No GD2 support in this PHP build " , get_active_function_name ( TSRMLS_C ) ) ;
2001-08-07 16:15:45 +00:00
RETURN_FALSE ;
# endif
break ;
2000-11-03 20:31:36 +00:00
default :
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Data is not in a recognized format. " , get_active_function_name ( TSRMLS_C ) ) ;
2000-11-03 20:31:36 +00:00
RETURN_FALSE ;
}
if ( ! im ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Couldn't create GD Image Stream out of Data " , get_active_function_name ( TSRMLS_C ) ) ;
2000-11-03 19:53:42 +00:00
RETURN_FALSE ;
2000-11-03 20:31:36 +00:00
}
2000-11-03 19:53:42 +00:00
2000-11-29 15:25:42 +00:00
ZEND_REGISTER_RESOURCE ( return_value , im , le_gd ) ;
2000-11-03 19:53:42 +00:00
}
2000-11-03 20:31:36 +00:00
/* }}} */
2002-06-27 23:05:11 +00:00
# endif
2000-11-03 19:53:42 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ _php_image_create_from
*/
2000-11-23 14:56:09 +00:00
static void _php_image_create_from ( INTERNAL_FUNCTION_PARAMETERS , int image_type , char * tn , gdImagePtr ( * func_p ) ( ) , gdImagePtr ( * ioctx_func_p ) ( ) )
{
2001-05-29 07:46:07 +00:00
zval * * file , * * srcx , * * srcy , * * width , * * height ;
2002-03-15 21:03:08 +00:00
gdImagePtr im = NULL ;
2000-06-07 23:04:39 +00:00
char * fn = NULL ;
2002-03-16 01:28:57 +00:00
php_stream * stream ;
2002-03-15 21:03:08 +00:00
FILE * fp = NULL ;
2001-05-29 07:46:07 +00:00
int argc = ZEND_NUM_ARGS ( ) ;
2002-06-04 02:33:10 +00:00
if ( ( image_type = = PHP_GDIMG_TYPE_GD2PART & & argc ! = 5 ) | |
( image_type ! = PHP_GDIMG_TYPE_GD2PART & & argc ! = 1 ) | |
zend_get_parameters_ex ( argc , & file , & srcx , & srcy , & width , & height ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-02-28 16:52:03 +00:00
}
2001-05-29 07:46:07 +00:00
2000-02-28 16:52:03 +00:00
convert_to_string_ex ( file ) ;
2000-11-23 14:56:09 +00:00
2001-05-29 07:46:07 +00:00
if ( argc = = 4 & & image_type = = PHP_GDIMG_TYPE_GD2PART ) {
multi_convert_to_long_ex ( 4 , srcx , srcy , width , height ) ;
}
2000-11-23 14:56:09 +00:00
fn = Z_STRVAL_PP ( file ) ;
2002-03-17 22:50:59 +00:00
stream = php_stream_open_wrapper ( fn , " rb " , REPORT_ERRORS | IGNORE_PATH | IGNORE_URL_WIN , NULL ) ;
2002-03-15 21:03:08 +00:00
if ( stream = = NULL ) {
2000-02-28 16:52:03 +00:00
RETURN_FALSE ;
}
2000-06-07 23:04:39 +00:00
2000-09-26 09:08:02 +00:00
# ifndef USE_GD_IOCTX
ioctx_func_p = NULL ; /* don't allow sockets without IOCtx */
# endif
2000-06-07 23:04:39 +00:00
2002-03-15 21:03:08 +00:00
/* try and avoid allocating a FILE* if the stream is not naturally a FILE* */
if ( php_stream_is ( stream , PHP_STREAM_IS_STDIO ) ) {
2002-03-21 22:35:02 +00:00
if ( FAILURE = = php_stream_cast ( stream , PHP_STREAM_AS_STDIO , ( void * * ) & fp , REPORT_ERRORS ) ) {
goto out_err ;
}
2000-09-26 09:08:02 +00:00
}
2002-03-15 21:03:08 +00:00
else if ( ioctx_func_p ) {
2000-09-26 09:08:02 +00:00
# ifdef USE_GD_IOCTX
2002-03-15 21:03:08 +00:00
/* we can create an io context */
2000-09-26 09:08:02 +00:00
gdIOCtx * io_ctx ;
2001-04-01 05:42:07 +00:00
size_t buff_size ;
2002-03-15 21:03:08 +00:00
char * buff ;
2000-09-26 09:08:02 +00:00
2002-03-15 21:03:08 +00:00
/* needs to be malloc (persistent) - GD will free() it later */
2002-03-16 13:48:57 +00:00
buff_size = php_stream_copy_to_mem ( stream , & buff , PHP_STREAM_COPY_ALL , 1 ) ;
2000-09-26 09:08:02 +00:00
2001-02-01 15:40:35 +00:00
if ( ! buff_size ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Cannot read image data " , get_active_function_name ( TSRMLS_C ) ) ;
2002-03-15 21:03:08 +00:00
goto out_err ;
2001-02-01 15:40:35 +00:00
}
2001-08-11 16:39:07 +00:00
io_ctx = gdNewDynamicCtx ( buff_size , buff ) ;
2000-09-26 09:08:02 +00:00
if ( ! io_ctx ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Cannot allocate GD IO context " , get_active_function_name ( TSRMLS_C ) ) ;
2002-03-15 21:03:08 +00:00
goto out_err ;
2000-09-26 09:08:02 +00:00
}
2001-05-29 07:46:07 +00:00
if ( image_type = = PHP_GDIMG_TYPE_GD2PART ) {
im = ( * ioctx_func_p ) ( io_ctx , Z_LVAL_PP ( srcx ) , Z_LVAL_PP ( srcy ) , Z_LVAL_PP ( width ) , Z_LVAL_PP ( height ) ) ;
} else {
im = ( * ioctx_func_p ) ( io_ctx ) ;
}
2000-09-26 09:08:02 +00:00
io_ctx - > free ( io_ctx ) ;
2002-03-15 21:03:08 +00:00
# endif
}
else {
/* try and force the stream to be FILE* */
if ( FAILURE = = php_stream_cast ( stream , PHP_STREAM_AS_STDIO | PHP_STREAM_CAST_TRY_HARD , ( void * * ) & fp , REPORT_ERRORS ) )
goto out_err ;
}
if ( ! im & & fp ) {
2001-05-29 07:46:07 +00:00
if ( image_type = = PHP_GDIMG_TYPE_GD2PART ) {
im = ( * func_p ) ( fp , Z_LVAL_PP ( srcx ) , Z_LVAL_PP ( srcy ) , Z_LVAL_PP ( width ) , Z_LVAL_PP ( height ) ) ;
} else {
im = ( * func_p ) ( fp ) ;
}
2000-09-26 09:08:02 +00:00
fflush ( fp ) ;
}
2000-02-28 16:52:03 +00:00
2002-03-15 21:03:08 +00:00
if ( im ) {
ZEND_REGISTER_RESOURCE ( return_value , im , le_gd ) ;
2002-06-15 17:46:44 +00:00
php_stream_close ( stream ) ;
2002-03-15 21:03:08 +00:00
return ;
2000-04-21 02:23:16 +00:00
}
2000-06-07 00:37:49 +00:00
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): '%s' is not a valid %s file " , get_active_function_name ( TSRMLS_C ) , fn , tn ) ;
2002-03-15 21:03:08 +00:00
out_err :
php_stream_close ( stream ) ;
RETURN_FALSE ;
2000-06-07 00:37:49 +00:00
}
2001-06-05 13:12:10 +00:00
/* }}} */
2000-06-07 00:37:49 +00:00
2002-06-24 19:31:44 +00:00
# ifdef HAVE_GD_GIF_READ
2000-06-07 00:37:49 +00:00
/* {{{ proto int imagecreatefromgif(string filename)
Create a new image from GIF file or URL */
PHP_FUNCTION ( imagecreatefromgif )
{
2001-08-11 16:39:07 +00:00
_php_image_create_from ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_GIF , " GIF " , gdImageCreateFromGif , gdImageCreateFromGifCtx ) ;
2000-06-07 00:37:49 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif /* HAVE_GD_GIF_READ */
2000-06-07 00:37:49 +00:00
2002-06-24 19:31:44 +00:00
# ifdef HAVE_GD_JPG
2000-06-07 00:37:49 +00:00
/* {{{ proto int imagecreatefromjpeg(string filename)
Create a new image from JPEG file or URL */
PHP_FUNCTION ( imagecreatefromjpeg )
{
2001-08-11 16:39:07 +00:00
_php_image_create_from ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_JPG , " JPEG " , gdImageCreateFromJpeg , gdImageCreateFromJpegCtx ) ;
2000-06-07 00:37:49 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif /* HAVE_GD_JPG */
2000-06-07 00:37:49 +00:00
2002-06-24 19:31:44 +00:00
# ifdef HAVE_GD_PNG
2000-06-07 00:37:49 +00:00
/* {{{ proto int imagecreatefrompng(string filename)
Create a new image from PNG file or URL */
PHP_FUNCTION ( imagecreatefrompng )
{
2001-08-11 16:39:07 +00:00
_php_image_create_from ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_PNG , " PNG " , gdImageCreateFromPng , gdImageCreateFromPngCtx ) ;
1999-10-17 14:57:49 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif /* HAVE_GD_PNG */
1999-10-17 14:57:49 +00:00
2002-06-24 19:31:44 +00:00
# ifdef HAVE_GD_XBM
2000-06-07 00:37:49 +00:00
/* {{{ proto int imagecreatefromxbm(string filename)
Create a new image from XBM file or URL */
PHP_FUNCTION ( imagecreatefromxbm )
1999-12-17 21:50:07 +00:00
{
2001-08-11 16:39:07 +00:00
_php_image_create_from ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_XBM , " XBM " , gdImageCreateFromXbm , NULL ) ;
2000-06-07 00:37:49 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif /* HAVE_GD_XBM */
2000-06-07 00:37:49 +00:00
2001-12-06 17:51:48 +00:00
/* {{{ proto int imagecreatefromxpm(string filename)
2000-06-07 00:37:49 +00:00
Create a new image from XPM file or URL */
PHP_FUNCTION ( imagecreatefromxpm )
{
/*
# ifdef HAVE_GD_XPM
2001-08-11 16:39:07 +00:00
_php_image_create_from ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_XPM , " XPM " , gdImageCreateFromXpm , NULL ) ;
2000-06-07 00:37:49 +00:00
# else
*/
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): No XPM support in this PHP build " , get_active_function_name ( TSRMLS_C ) ) ;
2000-06-07 00:37:49 +00:00
RETURN_FALSE ;
/*
# endif
*/
}
/* }}} */
2002-06-24 19:31:44 +00:00
# ifdef HAVE_GD_WBMP
2000-06-25 01:44:15 +00:00
/* {{{ proto int imagecreatefromwbmp(string filename)
Create a new image from WBMP file or URL */
PHP_FUNCTION ( imagecreatefromwbmp )
{
2001-08-11 16:39:07 +00:00
_php_image_create_from ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_WBM , " WBMP " , gdImageCreateFromWBMP , gdImageCreateFromWBMPCtx ) ;
2000-06-25 01:44:15 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif /* HAVE_GD_WBMP */
2000-06-25 01:44:15 +00:00
2001-05-29 07:46:07 +00:00
/* {{{ proto int imagecreatefromgd(string filename)
Create a new image from GD file or URL */
PHP_FUNCTION ( imagecreatefromgd )
{
2001-08-11 16:39:07 +00:00
_php_image_create_from ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_GD , " GD " , gdImageCreateFromGd , gdImageCreateFromGdCtx ) ;
2001-05-29 07:46:07 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# ifdef HAVE_GD_GD2
2001-05-29 07:46:07 +00:00
/* {{{ proto int imagecreatefromgd2(string filename)
Create a new image from GD2 file or URL */
PHP_FUNCTION ( imagecreatefromgd2 )
{
2001-08-11 16:39:07 +00:00
_php_image_create_from ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_GD2 , " GD2 " , gdImageCreateFromGd2 , gdImageCreateFromGd2Ctx ) ;
2001-05-29 07:46:07 +00:00
}
/* }}} */
/* {{{ proto int imagecreatefromgd2part(string filename, int srcX, int srcY, int width, int height)
Create a new image from a given part of GD2 file or URL */
PHP_FUNCTION ( imagecreatefromgd2part )
{
2001-08-11 16:39:07 +00:00
_php_image_create_from ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_GD2PART , " GD2 " , gdImageCreateFromGd2Part , gdImageCreateFromGd2PartCtx ) ;
2001-05-29 07:46:07 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif /* HAVE_GD_GD2 */
2001-05-29 07:46:07 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ _php_image_output
*/
2000-11-23 14:56:09 +00:00
static void _php_image_output ( INTERNAL_FUNCTION_PARAMETERS , int image_type , char * tn , void ( * func_p ) ( ) )
{
2000-06-07 00:37:49 +00:00
zval * * imgind , * * file , * * quality ;
2000-02-28 16:52:03 +00:00
gdImagePtr im ;
2000-06-07 23:04:39 +00:00
char * fn = NULL ;
2000-02-28 16:52:03 +00:00
FILE * fp ;
2000-11-23 14:56:09 +00:00
int argc = ZEND_NUM_ARGS ( ) ;
2001-04-01 05:42:07 +00:00
int q = - 1 , i ;
2000-02-28 16:52:03 +00:00
2001-04-01 05:42:07 +00:00
/* The quality parameter for Wbmp stands for the threshold when called from image2wbmp() */
/* When called from imagewbmp() the quality parameter stands for the foreground color. Default: black. */
2001-01-24 09:24:26 +00:00
2001-07-30 17:29:57 +00:00
if ( argc < 1 | | argc > 3 | | zend_get_parameters_ex ( argc , & imgind , & file , & quality ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-02-28 16:52:03 +00:00
}
2000-11-23 14:56:09 +00:00
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , imgind , - 1 , " Image " , le_gd ) ;
2000-02-28 16:52:03 +00:00
2000-06-07 23:04:39 +00:00
if ( argc > 1 ) {
convert_to_string_ex ( file ) ;
fn = Z_STRVAL_PP ( file ) ;
if ( argc = = 3 ) {
convert_to_long_ex ( quality ) ;
q = Z_LVAL_PP ( quality ) ;
}
2000-06-07 00:37:49 +00:00
}
2000-06-07 23:04:39 +00:00
if ( ( argc = = 2 ) | | ( argc = = 3 & & Z_STRLEN_PP ( file ) ) ) {
2001-07-31 07:09:49 +00:00
if ( ! fn | | fn = = empty_string | | php_check_open_basedir ( fn TSRMLS_CC ) ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Invalid filename '%s' " , get_active_function_name ( TSRMLS_C ) , fn ) ;
2000-02-28 16:52:03 +00:00
RETURN_FALSE ;
}
2001-04-30 12:45:02 +00:00
fp = VCWD_FOPEN ( fn , " wb " ) ;
2000-02-28 16:52:03 +00:00
if ( ! fp ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Unable to open '%s' for writing " , get_active_function_name ( TSRMLS_C ) , fn ) ;
2000-02-28 16:52:03 +00:00
RETURN_FALSE ;
}
2001-01-24 09:24:26 +00:00
switch ( image_type ) {
2001-04-01 05:42:07 +00:00
case PHP_GDIMG_CONVERT_WBM :
if ( q < 0 | | q > 255 ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Invalid threshold value '%d'. It must be between 0 and 255 " , get_active_function_name ( TSRMLS_C ) , q ) ;
2001-04-01 05:42:07 +00:00
}
2001-01-24 09:24:26 +00:00
case PHP_GDIMG_TYPE_JPG :
( * func_p ) ( im , fp , q ) ;
break ;
case PHP_GDIMG_TYPE_WBM :
2001-04-01 06:20:45 +00:00
for ( i = 0 ; i < gdImageColorsTotal ( im ) ; i + + ) {
if ( gdImageRed ( im , i ) = = 0 ) break ;
2001-01-24 09:24:26 +00:00
}
2001-04-01 05:42:07 +00:00
( * func_p ) ( im , i , fp ) ;
2001-01-24 09:24:26 +00:00
break ;
default :
( * func_p ) ( im , fp ) ;
break ;
2000-06-07 00:37:49 +00:00
}
2000-02-28 16:52:03 +00:00
fflush ( fp ) ;
fclose ( fp ) ;
2000-06-07 00:37:49 +00:00
} else {
2000-02-28 16:52:03 +00:00
int b ;
FILE * tmp ;
char buf [ 4096 ] ;
2000-06-07 23:04:39 +00:00
2000-02-28 16:52:03 +00:00
tmp = tmpfile ( ) ;
if ( tmp = = NULL ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Unable to open temporary file " , get_active_function_name ( TSRMLS_C ) ) ;
2000-02-28 16:52:03 +00:00
RETURN_FALSE ;
}
2001-01-24 09:24:26 +00:00
2001-02-15 14:49:01 +00:00
switch ( image_type ) {
2001-04-01 05:42:07 +00:00
case PHP_GDIMG_CONVERT_WBM :
if ( q < 0 | | q > 255 ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Invalid threshold value '%d'. It must be between 0 and 255 " , get_active_function_name ( TSRMLS_C ) , q ) ;
2001-04-01 05:42:07 +00:00
}
2001-02-15 14:49:01 +00:00
case PHP_GDIMG_TYPE_JPG :
( * func_p ) ( im , tmp , q ) ;
break ;
case PHP_GDIMG_TYPE_WBM :
2001-04-01 06:20:45 +00:00
for ( i = 0 ; i < gdImageColorsTotal ( im ) ; i + + ) {
if ( gdImageRed ( im , i ) = = 0 ) break ;
2001-02-15 14:49:01 +00:00
}
( * func_p ) ( im , q , tmp ) ;
break ;
default :
( * func_p ) ( im , tmp ) ;
break ;
}
fseek ( tmp , 0 , SEEK_SET ) ;
1999-10-17 14:57:49 +00:00
# if APACHE && defined(CHARSET_EBCDIC)
2001-02-15 14:49:01 +00:00
/* XXX this is unlikely to work any more thies@thieso.net */
/* This is a binary file already: avoid EBCDIC->ASCII conversion */
ap_bsetflag ( php3_rqst - > connection - > client , B_EBCDIC2ASCII , 0 ) ;
# endif
while ( ( b = fread ( buf , 1 , sizeof ( buf ) , tmp ) ) > 0 ) {
2001-08-05 16:21:33 +00:00
php_write ( buf , b TSRMLS_CC ) ;
2001-02-15 14:49:01 +00:00
}
1999-10-17 14:57:49 +00:00
fclose ( tmp ) ;
/* the temporary file is automatically deleted */
2000-06-07 00:37:49 +00:00
}
1999-10-17 14:57:49 +00:00
RETURN_TRUE ;
2000-06-07 00:37:49 +00:00
}
2001-06-05 13:12:10 +00:00
/* }}} */
2000-06-07 00:37:49 +00:00
2002-06-24 19:31:44 +00:00
# ifdef HAVE_GD_GIF_CREATE
2000-06-07 23:04:39 +00:00
/* {{{ proto int imagegif(int im [, string filename])
Output GIF image to browser or file */
PHP_FUNCTION ( imagegif )
{
2001-05-21 19:28:22 +00:00
# ifdef HAVE_GD_GIF_CTX
2001-02-01 15:40:35 +00:00
_php_image_output_ctx ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_GIF , " GIF " , gdImageGifCtx ) ;
# else
2000-06-07 23:04:39 +00:00
_php_image_output ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_GIF , " GIF " , gdImageGif ) ;
2001-02-01 15:40:35 +00:00
# endif
2000-06-07 23:04:39 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif /* HAVE_GD_GIF_CREATE */
2000-06-07 23:04:39 +00:00
2002-06-24 19:31:44 +00:00
# ifdef HAVE_GD_PNG
2000-06-07 00:37:49 +00:00
/* {{{ proto int imagepng(int im [, string filename])
Output PNG image to browser or file */
PHP_FUNCTION ( imagepng )
{
2001-02-01 15:40:35 +00:00
# ifdef USE_GD_IOCTX
_php_image_output_ctx ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_PNG , " PNG " , gdImagePngCtx ) ;
# else
2000-06-07 23:04:39 +00:00
_php_image_output ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_PNG , " PNG " , gdImagePng ) ;
2001-02-01 15:40:35 +00:00
# endif
1999-10-17 14:57:49 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif /* HAVE_GD_PNG */
1999-10-17 14:57:49 +00:00
2002-06-24 19:31:44 +00:00
# ifdef HAVE_GD_JPG
2000-06-07 00:37:49 +00:00
/* {{{ proto int imagejpeg(int im [, string filename [, int quality]])
Output JPEG image to browser or file */
PHP_FUNCTION ( imagejpeg )
2000-03-13 05:58:50 +00:00
{
2001-02-01 15:40:35 +00:00
# ifdef USE_GD_IOCTX
_php_image_output_ctx ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_JPG , " JPEG " , gdImageJpegCtx ) ;
# else
2000-06-07 23:04:39 +00:00
_php_image_output ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_JPG , " JPEG " , gdImageJpeg ) ;
2001-02-01 15:40:35 +00:00
# endif
2000-03-13 05:58:50 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif /* HAVE_GD_JPG */
2000-03-13 05:58:50 +00:00
2002-06-24 19:31:44 +00:00
# ifdef HAVE_GD_WBMP
2001-04-01 05:42:07 +00:00
/* {{{ proto int imagewbmp(int im [, string filename, [, int foreground]])
2000-06-07 00:37:49 +00:00
Output WBMP image to browser or file */
PHP_FUNCTION ( imagewbmp )
2000-03-13 05:58:50 +00:00
{
2001-02-01 15:40:35 +00:00
# ifdef USE_GD_IOCTX
2001-04-01 05:42:07 +00:00
_php_image_output_ctx ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_WBM , " WBMP " , gdImageWBMPCtx ) ;
2001-02-01 15:40:35 +00:00
# else
2001-04-01 05:42:07 +00:00
_php_image_output ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_WBM , " WBMP " , gdImageWBMP ) ;
2001-02-01 15:40:35 +00:00
# endif
2000-03-13 05:58:50 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif /* HAVE_GD_WBMP */
2000-03-13 05:58:50 +00:00
2001-05-29 07:46:07 +00:00
/* {{{ proto int imagegd(int im [, string filename])
Output GD image to browser or file */
PHP_FUNCTION ( imagegd )
{
_php_image_output ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_GD , " GD " , gdImageGd ) ;
}
/* }}} */
2002-06-24 19:31:44 +00:00
# ifdef HAVE_GD_GD2
2001-05-29 07:46:07 +00:00
/* {{{ proto int imagegd2(int im [, string filename])
Output GD2 image to browser or file */
PHP_FUNCTION ( imagegd2 )
{
_php_image_output ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_GD2 , " GD2 " , gdImageGd2 ) ;
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif /* HAVE_GD_GD2 */
2001-05-29 07:46:07 +00:00
1999-04-16 12:15:38 +00:00
/* {{{ proto int imagedestroy(int im)
1999-11-24 22:04:49 +00:00
Destroy an image */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagedestroy )
{
2000-11-23 14:56:09 +00:00
zval * * IM ;
2000-02-28 16:52:03 +00:00
gdImagePtr im ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & IM ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
zend_list_delete ( Z_LVAL_PP ( IM ) ) ;
1999-04-16 12:15:38 +00:00
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto int imagecolorallocate(int im, int red, int green, int blue)
1999-11-24 22:04:49 +00:00
Allocate a color for an image */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagecolorallocate )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * red , * * green , * * blue ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 4 | | zend_get_parameters_ex ( 4 , & IM , & red , & green , & blue ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( red ) ;
convert_to_long_ex ( green ) ;
convert_to_long_ex ( blue ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
RETURN_LONG ( gdImageColorAllocate ( im , Z_LVAL_PP ( red ) , Z_LVAL_PP ( green ) , Z_LVAL_PP ( blue ) ) ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# if HAVE_LIBGD15
2000-06-25 02:55:31 +00:00
/* {{{ proto int imagepalettecopy(int dst, int src)
Copy the palette from the src image onto the dst image */
PHP_FUNCTION ( imagepalettecopy )
{
zval * * dstim , * * srcim ;
gdImagePtr dst , src ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & dstim , & srcim ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-06-25 02:55:31 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( dst , gdImagePtr , dstim , - 1 , " Image " , le_gd ) ;
ZEND_FETCH_RESOURCE ( src , gdImagePtr , srcim , - 1 , " Image " , le_gd ) ;
2000-06-25 02:55:31 +00:00
gdImagePaletteCopy ( dst , src ) ;
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif
2000-06-25 02:55:31 +00:00
1999-04-16 12:15:38 +00:00
/* {{{ proto int imagecolorat(int im, int x, int y)
1999-11-24 22:04:49 +00:00
Get the index of the color of a pixel */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagecolorat )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * x , * * y ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 3 | | zend_get_parameters_ex ( 3 , & IM , & x , & y ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
2000-11-23 14:56:09 +00:00
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( x ) ;
convert_to_long_ex ( y ) ;
2001-11-10 15:06:09 +00:00
# if HAVE_LIBGD20
if ( gdImageTrueColor ( im ) ) {
if ( im - > tpixels & & gdImageBoundsSafe ( im , Z_LVAL_PP ( x ) , Z_LVAL_PP ( y ) ) ) {
2001-11-16 11:59:04 +00:00
RETURN_LONG ( gdImageTrueColorPixel ( im , Z_LVAL_PP ( x ) , Z_LVAL_PP ( y ) ) ) ;
2001-11-10 15:06:09 +00:00
} else {
2002-06-28 06:43:17 +00:00
php_error ( E_NOTICE , " %s(): %ld,%ld is out of bounds " , get_active_function_name ( TSRMLS_C ) , Z_LVAL_PP ( x ) , Z_LVAL_PP ( y ) ) ;
2001-11-10 15:06:09 +00:00
RETURN_FALSE ;
}
} else {
# endif
if ( im - > pixels & & gdImageBoundsSafe ( im , Z_LVAL_PP ( x ) , Z_LVAL_PP ( y ) ) ) {
1999-04-16 12:15:38 +00:00
# if HAVE_LIBGD13
2001-11-10 15:06:09 +00:00
RETURN_LONG ( im - > pixels [ Z_LVAL_PP ( y ) ] [ Z_LVAL_PP ( x ) ] ) ;
1999-04-16 12:15:38 +00:00
# else
2001-11-10 15:06:09 +00:00
RETURN_LONG ( im - > pixels [ Z_LVAL_PP ( x ) ] [ Z_LVAL_PP ( y ) ] ) ;
1999-04-16 12:15:38 +00:00
# endif
2001-11-10 15:06:09 +00:00
} else {
2002-06-28 06:43:17 +00:00
php_error ( E_NOTICE , " %s(): %ld,%ld is out of bounds " , get_active_function_name ( TSRMLS_C ) , Z_LVAL_PP ( x ) , Z_LVAL_PP ( y ) ) ;
2001-11-10 15:06:09 +00:00
RETURN_FALSE ;
}
# if HAVE_LIBGD20
1999-04-16 12:15:38 +00:00
}
2001-11-10 15:06:09 +00:00
# endif
1999-04-16 12:15:38 +00:00
}
/* }}} */
/* {{{ proto int imagecolorclosest(int im, int red, int green, int blue)
1999-11-24 22:04:49 +00:00
Get the index of the closest color to the specified color */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagecolorclosest )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * red , * * green , * * blue ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 4 | | zend_get_parameters_ex ( 4 , & IM , & red , & green , & blue ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( red ) ;
convert_to_long_ex ( green ) ;
convert_to_long_ex ( blue ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
RETURN_LONG ( gdImageColorClosest ( im , Z_LVAL_PP ( red ) , Z_LVAL_PP ( green ) , Z_LVAL_PP ( blue ) ) ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# if HAVE_COLORCLOSESTHWB
2000-06-25 02:55:31 +00:00
/* {{{ proto int imagecolorclosesthwb(int im, int red, int green, int blue)
Get the index of the color which has the hue , white and blackness nearest to the given color */
PHP_FUNCTION ( imagecolorclosesthwb )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * red , * * green , * * blue ;
2000-06-25 02:55:31 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 4 | | zend_get_parameters_ex ( 4 , & IM , & red , & green , & blue ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-06-25 02:55:31 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
2000-06-25 02:55:31 +00:00
2000-11-23 14:56:09 +00:00
convert_to_long_ex ( red ) ;
convert_to_long_ex ( green ) ;
convert_to_long_ex ( blue ) ;
2000-06-25 02:55:31 +00:00
2000-11-23 14:56:09 +00:00
RETURN_LONG ( gdImageColorClosestHWB ( im , Z_LVAL_PP ( red ) , Z_LVAL_PP ( green ) , Z_LVAL_PP ( blue ) ) ) ;
2000-06-25 02:55:31 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif
2000-06-25 02:55:31 +00:00
1999-04-16 12:15:38 +00:00
/* {{{ proto int imagecolordeallocate(int im, int index)
1999-11-24 22:04:49 +00:00
De - allocate a color for an image */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagecolordeallocate )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * index ;
2000-02-28 16:52:03 +00:00
int col ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & IM , & index ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( index ) ;
2000-11-23 14:56:09 +00:00
col = Z_LVAL_PP ( index ) ;
1999-04-16 12:15:38 +00:00
if ( col > = 0 & & col < gdImageColorsTotal ( im ) ) {
gdImageColorDeallocate ( im , col ) ;
RETURN_TRUE ;
2000-11-23 14:56:09 +00:00
} else {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Color index %d out of range " ,
2002-06-15 18:14:19 +00:00
get_active_function_name ( TSRMLS_C ) , col ) ;
2000-02-28 16:52:03 +00:00
RETURN_FALSE ;
}
1999-04-16 12:15:38 +00:00
}
/* }}} */
/* {{{ proto int imagecolorresolve(int im, int red, int green, int blue)
1999-11-24 22:04:49 +00:00
Get the index of the specified color or its closest possible alternative */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagecolorresolve )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * red , * * green , * * blue ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 4 | | zend_get_parameters_ex ( 4 , & IM , & red , & green , & blue ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( red ) ;
convert_to_long_ex ( green ) ;
convert_to_long_ex ( blue ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
RETURN_LONG ( gdImageColorResolve ( im , Z_LVAL_PP ( red ) , Z_LVAL_PP ( green ) , Z_LVAL_PP ( blue ) ) ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
/* {{{ proto int imagecolorexact(int im, int red, int green, int blue)
1999-11-24 22:04:49 +00:00
Get the index of the specified color */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagecolorexact )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * red , * * green , * * blue ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 4 | | zend_get_parameters_ex ( 4 , & IM , & red , & green , & blue ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( red ) ;
convert_to_long_ex ( green ) ;
convert_to_long_ex ( blue ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
RETURN_LONG ( gdImageColorExact ( im , Z_LVAL_PP ( red ) , Z_LVAL_PP ( green ) , Z_LVAL_PP ( blue ) ) ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
/* {{{ proto int imagecolorset(int im, int col, int red, int green, int blue)
1999-11-24 22:04:49 +00:00
Set the color for the specified palette index */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagecolorset )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * color , * * red , * * green , * * blue ;
1999-04-16 12:15:38 +00:00
int col ;
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 5 | | zend_get_parameters_ex ( 5 , & IM , & color , & red , & green , & blue ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( color ) ;
convert_to_long_ex ( red ) ;
convert_to_long_ex ( green ) ;
convert_to_long_ex ( blue ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
col = Z_LVAL_PP ( color ) ;
1999-04-16 12:15:38 +00:00
if ( col > = 0 & & col < gdImageColorsTotal ( im ) ) {
2000-11-23 14:56:09 +00:00
im - > red [ col ] = Z_LVAL_PP ( red ) ;
im - > green [ col ] = Z_LVAL_PP ( green ) ;
im - > blue [ col ] = Z_LVAL_PP ( blue ) ;
} else {
1999-04-16 12:15:38 +00:00
RETURN_FALSE ;
}
}
/* }}} */
/* {{{ proto array imagecolorsforindex(int im, int col)
1999-11-24 22:04:49 +00:00
Get the colors for an index */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagecolorsforindex )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * index ;
2000-02-28 16:52:03 +00:00
int col ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & IM , & index ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( index ) ;
2000-11-23 14:56:09 +00:00
col = Z_LVAL_PP ( index ) ;
2001-11-10 15:06:09 +00:00
# if HAVE_LIBGD20
if ( ( col > = 0 & & gdImageTrueColor ( im ) ) | | ( ! gdImageTrueColor ( im ) & & col > = 0 & & col < gdImageColorsTotal ( im ) ) ) {
if ( array_init ( return_value ) = = FAILURE ) {
RETURN_FALSE ;
}
add_assoc_long ( return_value , " red " , gdImageRed ( im , col ) ) ;
add_assoc_long ( return_value , " green " , gdImageGreen ( im , col ) ) ;
add_assoc_long ( return_value , " blue " , gdImageBlue ( im , col ) ) ;
add_assoc_long ( return_value , " alpha " , gdImageAlpha ( im , col ) ) ;
}
# else
1999-04-16 12:15:38 +00:00
if ( col > = 0 & & col < gdImageColorsTotal ( im ) ) {
if ( array_init ( return_value ) = = FAILURE ) {
RETURN_FALSE ;
}
2000-11-23 14:56:09 +00:00
add_assoc_long ( return_value , " red " , im - > red [ col ] ) ;
2001-08-11 16:39:07 +00:00
add_assoc_long ( return_value , " green " , im - > green [ col ] ) ;
2000-11-23 14:56:09 +00:00
add_assoc_long ( return_value , " blue " , im - > blue [ col ] ) ;
2001-11-10 15:06:09 +00:00
}
# endif
else {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Color index %d out of range " ,
2002-06-15 18:14:19 +00:00
get_active_function_name ( TSRMLS_C ) , col ) ;
1999-04-16 12:15:38 +00:00
RETURN_FALSE ;
}
}
/* }}} */
2001-09-21 21:59:27 +00:00
/* {{{ proto int imagegammacorrect(int im, float inputgamma, float outputgamma)
2000-05-23 22:28:07 +00:00
Apply a gamma correction to a GD image */
2000-05-14 15:25:13 +00:00
PHP_FUNCTION ( imagegammacorrect )
{
zval * * IM , * * inputgamma , * * outputgamma ;
gdImagePtr im ;
int i ;
2000-11-23 14:56:09 +00:00
double input , output ;
2000-05-14 15:25:13 +00:00
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 3 | | zend_get_parameters_ex ( 3 , & IM , & inputgamma , & outputgamma ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-05-14 15:25:13 +00:00
}
convert_to_double_ex ( inputgamma ) ;
convert_to_double_ex ( outputgamma ) ;
2000-11-23 14:56:09 +00:00
input = Z_DVAL_PP ( inputgamma ) ;
output = Z_DVAL_PP ( outputgamma ) ;
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
2000-05-14 15:25:13 +00:00
2001-07-05 21:23:28 +00:00
# if HAVE_LIBGD20
if ( gdImageTrueColor ( im ) ) {
int x , y , c ;
for ( y = 0 ; y < gdImageSY ( im ) ; y + + ) {
for ( x = 0 ; x < gdImageSX ( im ) ; x + + ) {
c = gdImageGetPixel ( im , x , y ) ;
gdImageSetPixel ( im , x , y ,
gdTrueColor (
( int ) ( ( pow ( ( pow ( ( gdTrueColorGetRed ( c ) / 255.0 ) , input ) ) , 1.0 / output ) * 255 ) + .5 ) ,
( int ) ( ( pow ( ( pow ( ( gdTrueColorGetGreen ( c ) / 255.0 ) , input ) ) , 1.0 / output ) * 255 ) + .5 ) ,
( int ) ( ( pow ( ( pow ( ( gdTrueColorGetBlue ( c ) / 255.0 ) , input ) ) , 1.0 / output ) * 255 ) + .5 )
)
) ;
}
}
RETURN_TRUE ;
}
# endif
2000-05-14 15:25:13 +00:00
for ( i = 0 ; i < gdImageColorsTotal ( im ) ; i + + ) {
2000-11-23 14:56:09 +00:00
im - > red [ i ] = ( int ) ( ( pow ( ( pow ( ( im - > red [ i ] / 255.0 ) , input ) ) , 1.0 / output ) * 255 ) + .5 ) ;
im - > green [ i ] = ( int ) ( ( pow ( ( pow ( ( im - > green [ i ] / 255.0 ) , input ) ) , 1.0 / output ) * 255 ) + .5 ) ;
im - > blue [ i ] = ( int ) ( ( pow ( ( pow ( ( im - > blue [ i ] / 255.0 ) , input ) ) , 1.0 / output ) * 255 ) + .5 ) ;
2000-05-14 15:25:13 +00:00
}
RETURN_TRUE ;
}
2000-05-23 22:28:07 +00:00
/* }}} */
2000-05-14 15:25:13 +00:00
1999-04-16 12:15:38 +00:00
/* {{{ proto int imagesetpixel(int im, int x, int y, int col)
1999-11-24 22:04:49 +00:00
Set a single pixel */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagesetpixel )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * x , * * y , * * col ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 4 | | zend_get_parameters_ex ( 4 , & IM , & x , & y , & col ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
convert_to_long_ex ( x ) ;
convert_to_long_ex ( y ) ;
convert_to_long_ex ( col ) ;
1999-04-16 12:15:38 +00:00
2001-08-11 16:39:07 +00:00
gdImageSetPixel ( im , Z_LVAL_PP ( x ) , Z_LVAL_PP ( y ) , Z_LVAL_PP ( col ) ) ;
1999-04-16 12:15:38 +00:00
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto int imageline(int im, int x1, int y1, int x2, int y2, int col)
1999-11-24 22:04:49 +00:00
Draw a line */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imageline )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * x1 , * * y1 , * * x2 , * * y2 , * * col ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 6 | | zend_get_parameters_ex ( 6 , & IM , & x1 , & y1 , & x2 , & y2 , & col ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
convert_to_long_ex ( x1 ) ;
convert_to_long_ex ( y1 ) ;
convert_to_long_ex ( x2 ) ;
convert_to_long_ex ( y2 ) ;
convert_to_long_ex ( col ) ;
1999-04-16 12:15:38 +00:00
2001-08-11 16:39:07 +00:00
gdImageLine ( im , Z_LVAL_PP ( x1 ) , Z_LVAL_PP ( y1 ) , Z_LVAL_PP ( x2 ) , Z_LVAL_PP ( y2 ) , Z_LVAL_PP ( col ) ) ;
1999-04-16 12:15:38 +00:00
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto int imagedashedline(int im, int x1, int y1, int x2, int y2, int col)
1999-11-24 22:04:49 +00:00
Draw a dashed line */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagedashedline )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * x1 , * * y1 , * * x2 , * * y2 , * * col ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 6 | | zend_get_parameters_ex ( 6 , & IM , & x1 , & y1 , & x2 , & y2 , & col ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
convert_to_long_ex ( x1 ) ;
convert_to_long_ex ( y1 ) ;
convert_to_long_ex ( x2 ) ;
convert_to_long_ex ( y2 ) ;
convert_to_long_ex ( col ) ;
1999-04-16 12:15:38 +00:00
2001-08-11 16:39:07 +00:00
gdImageDashedLine ( im , Z_LVAL_PP ( x1 ) , Z_LVAL_PP ( y1 ) , Z_LVAL_PP ( x2 ) , Z_LVAL_PP ( y2 ) , Z_LVAL_PP ( col ) ) ;
1999-04-16 12:15:38 +00:00
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto int imagerectangle(int im, int x1, int y1, int x2, int y2, int col)
1999-11-24 22:04:49 +00:00
Draw a rectangle */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagerectangle )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * x1 , * * y1 , * * x2 , * * y2 , * * col ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 6 | | zend_get_parameters_ex ( 6 , & IM , & x1 , & y1 , & x2 , & y2 , & col ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
convert_to_long_ex ( x1 ) ;
convert_to_long_ex ( y1 ) ;
convert_to_long_ex ( x2 ) ;
convert_to_long_ex ( y2 ) ;
convert_to_long_ex ( col ) ;
1999-04-16 12:15:38 +00:00
2001-08-11 16:39:07 +00:00
gdImageRectangle ( im , Z_LVAL_PP ( x1 ) , Z_LVAL_PP ( y1 ) , Z_LVAL_PP ( x2 ) , Z_LVAL_PP ( y2 ) , Z_LVAL_PP ( col ) ) ;
1999-04-16 12:15:38 +00:00
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto int imagefilledrectangle(int im, int x1, int y1, int x2, int y2, int col)
1999-11-24 22:04:49 +00:00
Draw a filled rectangle */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagefilledrectangle )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * x1 , * * y1 , * * x2 , * * y2 , * * col ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 6 | | zend_get_parameters_ex ( 6 , & IM , & x1 , & y1 , & x2 , & y2 , & col ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
convert_to_long_ex ( x1 ) ;
convert_to_long_ex ( y1 ) ;
convert_to_long_ex ( x2 ) ;
convert_to_long_ex ( y2 ) ;
convert_to_long_ex ( col ) ;
1999-04-16 12:15:38 +00:00
2001-08-11 16:39:07 +00:00
gdImageFilledRectangle ( im , Z_LVAL_PP ( x1 ) , Z_LVAL_PP ( y1 ) , Z_LVAL_PP ( x2 ) , Z_LVAL_PP ( y2 ) , Z_LVAL_PP ( col ) ) ;
1999-04-16 12:15:38 +00:00
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto int imagearc(int im, int cx, int cy, int w, int h, int s, int e, int col)
1999-11-24 22:04:49 +00:00
Draw a partial ellipse */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagearc )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * cx , * * cy , * * w , * * h , * * ST , * * E , * * col ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-08-11 16:39:07 +00:00
int e , st ;
1999-04-16 12:15:38 +00:00
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 8 | | zend_get_parameters_ex ( 8 , & IM , & cx , & cy , & w , & h , & ST , & E , & col ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
convert_to_long_ex ( cx ) ;
convert_to_long_ex ( cy ) ;
convert_to_long_ex ( w ) ;
convert_to_long_ex ( h ) ;
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( ST ) ;
convert_to_long_ex ( E ) ;
2000-11-23 14:56:09 +00:00
convert_to_long_ex ( col ) ;
2000-02-28 16:52:03 +00:00
2000-11-23 14:56:09 +00:00
e = Z_LVAL_PP ( E ) ;
st = Z_LVAL_PP ( ST ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
if ( e < 0 ) e % = 360 ;
if ( st < 0 ) st % = 360 ;
1999-04-16 12:15:38 +00:00
2001-08-11 16:39:07 +00:00
gdImageArc ( im , Z_LVAL_PP ( cx ) , Z_LVAL_PP ( cy ) , Z_LVAL_PP ( w ) , Z_LVAL_PP ( h ) , st , e , Z_LVAL_PP ( col ) ) ;
1999-04-16 12:15:38 +00:00
RETURN_TRUE ;
}
/* }}} */
2002-07-28 10:00:37 +00:00
/* {{{ proto void imageellipse(resource im, int cx, int cy, int w, int h, int color)
Draw an ellipse */
PHP_FUNCTION ( imageellipse )
{
zval * * IM , * * cx , * * cy , * * w , * * h , * * color ;
gdImagePtr im ;
if ( ZEND_NUM_ARGS ( ) ! = 6 | | zend_get_parameters_ex ( 6 , & IM , & cx , & cy , & w , & h , & color ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
convert_to_long_ex ( cx ) ;
convert_to_long_ex ( cy ) ;
convert_to_long_ex ( w ) ;
convert_to_long_ex ( h ) ;
convert_to_long_ex ( color ) ;
# ifdef HAVE_GD_IMAGEELLIPSE /* this function is missing from GD 2.0.1 */
gdImageEllipse ( im , Z_LVAL_PP ( cx ) , Z_LVAL_PP ( cy ) , Z_LVAL_PP ( w ) , Z_LVAL_PP ( h ) , Z_LVAL_PP ( color ) ) ;
# else
gdImageArc ( im , Z_LVAL_PP ( cx ) , Z_LVAL_PP ( cy ) , Z_LVAL_PP ( w ) , Z_LVAL_PP ( h ) , 0 , 360 , Z_LVAL_PP ( color ) ) ;
# endif
RETURN_TRUE ;
}
/* }}} */
1999-04-16 12:15:38 +00:00
/* {{{ proto int imagefilltoborder(int im, int x, int y, int border, int col)
1999-11-24 22:04:49 +00:00
Flood fill to specific color */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagefilltoborder )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * x , * * y , * * border , * * col ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 5 | | zend_get_parameters_ex ( 5 , & IM , & x , & y , & border , & col ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
convert_to_long_ex ( x ) ;
convert_to_long_ex ( y ) ;
convert_to_long_ex ( border ) ;
convert_to_long_ex ( col ) ;
1999-04-16 12:15:38 +00:00
2001-08-11 16:39:07 +00:00
gdImageFillToBorder ( im , Z_LVAL_PP ( x ) , Z_LVAL_PP ( y ) , Z_LVAL_PP ( border ) , Z_LVAL_PP ( col ) ) ;
1999-04-16 12:15:38 +00:00
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto int imagefill(int im, int x, int y, int col)
1999-11-24 22:04:49 +00:00
Flood fill */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagefill )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * x , * * y , * * col ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 4 | | zend_get_parameters_ex ( 4 , & IM , & x , & y , & col ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
convert_to_long_ex ( x ) ;
convert_to_long_ex ( y ) ;
convert_to_long_ex ( col ) ;
1999-04-16 12:15:38 +00:00
2001-08-11 16:39:07 +00:00
gdImageFill ( im , Z_LVAL_PP ( x ) , Z_LVAL_PP ( y ) , Z_LVAL_PP ( col ) ) ;
1999-04-16 12:15:38 +00:00
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto int imagecolorstotal(int im)
1999-11-24 22:04:49 +00:00
Find out the number of colors in an image ' s palette */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagecolorstotal )
{
2000-02-28 16:52:03 +00:00
zval * * IM ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & IM ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-23 14:56:09 +00:00
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
RETURN_LONG ( gdImageColorsTotal ( im ) ) ;
}
/* }}} */
/* {{{ proto int imagecolortransparent(int im [, int col])
1999-11-24 22:04:49 +00:00
Define a color as transparent */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imagecolortransparent )
{
2000-08-22 04:11:57 +00:00
zval * * IM , * * COL ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2000-06-05 19:47:54 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
1999-04-16 12:15:38 +00:00
case 1 :
2000-02-28 16:52:03 +00:00
if ( zend_get_parameters_ex ( 1 , & IM ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
break ;
case 2 :
2000-02-28 16:52:03 +00:00
if ( zend_get_parameters_ex ( 2 , & IM , & COL ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( COL ) ;
1999-04-16 12:15:38 +00:00
break ;
default :
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-08-22 04:11:57 +00:00
if ( ZEND_NUM_ARGS ( ) > 1 ) {
gdImageColorTransparent ( im , Z_LVAL_PP ( COL ) ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-23 14:56:09 +00:00
RETURN_LONG ( gdImageGetTransparent ( im ) ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
/* {{{ proto int imageinterlace(int im [, int interlace])
1999-11-24 22:04:49 +00:00
Enable or disable interlace */
1999-07-23 16:03:18 +00:00
PHP_FUNCTION ( imageinterlace )
{
2000-11-23 14:56:09 +00:00
zval * * IM , * * INT ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2000-06-05 19:47:54 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
1999-04-16 12:15:38 +00:00
case 1 :
2000-02-28 16:52:03 +00:00
if ( zend_get_parameters_ex ( 1 , & IM ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
break ;
case 2 :
2000-02-28 16:52:03 +00:00
if ( zend_get_parameters_ex ( 2 , & IM , & INT ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( INT ) ;
1999-04-16 12:15:38 +00:00
break ;
default :
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
if ( ZEND_NUM_ARGS ( ) > 1 ) {
2001-08-11 16:39:07 +00:00
gdImageInterlace ( im , Z_LVAL_PP ( INT ) ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-23 14:56:09 +00:00
RETURN_LONG ( gdImageGetInterlaced ( im ) ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
2001-06-05 13:12:10 +00:00
/* {{{ php_imagepolygon
arg = 0 normal polygon
1999-04-16 12:15:38 +00:00
arg = 1 filled polygon */
/* im, points, num_points, col */
2001-06-07 13:17:02 +00:00
static void php_imagepolygon ( INTERNAL_FUNCTION_PARAMETERS , int filled )
{
2000-02-28 16:52:03 +00:00
zval * * IM , * * POINTS , * * NPOINTS , * * COL ;
pval * * var = NULL ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2000-05-01 18:56:58 +00:00
gdPointPtr points ;
1999-04-16 12:15:38 +00:00
int npoints , col , nelem , i ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 4 | | zend_get_parameters_ex ( 4 , & IM , & POINTS , & NPOINTS , & COL ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( NPOINTS ) ;
convert_to_long_ex ( COL ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
npoints = Z_LVAL_PP ( NPOINTS ) ;
col = Z_LVAL_PP ( COL ) ;
1999-04-16 12:15:38 +00:00
2001-09-25 22:49:04 +00:00
if ( Z_TYPE_PP ( POINTS ) ! = IS_ARRAY ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): 2nd argument to imagepolygon not an array " , get_active_function_name ( TSRMLS_C ) ) ;
1999-04-16 12:15:38 +00:00
RETURN_FALSE ;
}
2001-09-25 22:49:04 +00:00
nelem = zend_hash_num_elements ( Z_ARRVAL_PP ( POINTS ) ) ;
1999-04-16 12:15:38 +00:00
if ( nelem < 6 ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): You must have at least 3 points in your array " , get_active_function_name ( TSRMLS_C ) ) ;
1999-04-16 12:15:38 +00:00
RETURN_FALSE ;
}
if ( nelem < npoints * 2 ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Trying to use %d points in array with only %d points " , get_active_function_name ( TSRMLS_C ) , npoints , nelem / 2 ) ;
1999-04-16 12:15:38 +00:00
RETURN_FALSE ;
}
2000-05-01 18:56:58 +00:00
points = ( gdPointPtr ) emalloc ( npoints * sizeof ( gdPoint ) ) ;
1999-04-16 12:15:38 +00:00
for ( i = 0 ; i < npoints ; i + + ) {
2001-09-25 22:49:04 +00:00
if ( zend_hash_index_find ( Z_ARRVAL_PP ( POINTS ) , ( i * 2 ) , ( void * * ) & var ) = = SUCCESS ) {
2000-02-28 16:52:03 +00:00
SEPARATE_ZVAL ( ( var ) ) ;
1999-07-23 16:03:18 +00:00
convert_to_long ( * var ) ;
2000-11-23 14:56:09 +00:00
points [ i ] . x = Z_LVAL_PP ( var ) ;
1999-04-16 12:15:38 +00:00
}
2001-09-25 22:49:04 +00:00
if ( zend_hash_index_find ( Z_ARRVAL_PP ( POINTS ) , ( i * 2 ) + 1 , ( void * * ) & var ) = = SUCCESS ) {
1999-07-23 16:03:18 +00:00
SEPARATE_ZVAL ( var ) ;
convert_to_long ( * var ) ;
2000-11-23 14:56:09 +00:00
points [ i ] . y = Z_LVAL_PP ( var ) ;
1999-04-16 12:15:38 +00:00
}
}
if ( filled ) {
gdImageFilledPolygon ( im , points , npoints , col ) ;
2000-11-23 14:56:09 +00:00
} else {
1999-04-16 12:15:38 +00:00
gdImagePolygon ( im , points , npoints , col ) ;
}
2000-05-01 18:56:58 +00:00
efree ( points ) ;
1999-04-16 12:15:38 +00:00
RETURN_TRUE ;
}
2001-06-05 13:12:10 +00:00
/* }}} */
1999-04-16 12:15:38 +00:00
/* {{{ proto int imagepolygon(int im, array point, int num_points, int col)
1999-11-24 22:04:49 +00:00
Draw a polygon */
1999-05-21 10:06:25 +00:00
PHP_FUNCTION ( imagepolygon )
1999-04-16 12:15:38 +00:00
{
1999-12-17 21:50:07 +00:00
php_imagepolygon ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
/* {{{ proto int imagefilledpolygon(int im, array point, int num_points, int col)
1999-11-24 22:04:49 +00:00
Draw a filled polygon */
1999-05-21 10:06:25 +00:00
PHP_FUNCTION ( imagefilledpolygon )
1999-04-16 12:15:38 +00:00
{
1999-12-17 21:50:07 +00:00
php_imagepolygon ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
2001-06-05 13:12:10 +00:00
/* {{{ php_find_gd_font
*/
1999-12-17 21:50:07 +00:00
static gdFontPtr php_find_gd_font ( int size )
1999-04-16 12:15:38 +00:00
{
gdFontPtr font ;
int ind_type ;
2001-07-30 20:27:11 +00:00
TSRMLS_FETCH ( ) ;
1999-04-16 12:15:38 +00:00
switch ( size ) {
case 1 :
font = gdFontTiny ;
break ;
case 2 :
font = gdFontSmall ;
break ;
case 3 :
font = gdFontMediumBold ;
break ;
case 4 :
font = gdFontLarge ;
break ;
case 5 :
font = gdFontGiant ;
break ;
default :
1999-12-17 19:51:39 +00:00
font = zend_list_find ( size - 5 , & ind_type ) ;
2000-11-29 15:25:42 +00:00
if ( ! font | | ind_type ! = le_gd_font ) {
1999-04-16 12:15:38 +00:00
if ( size < 1 ) {
font = gdFontTiny ;
} else {
font = gdFontGiant ;
}
}
break ;
}
return font ;
}
2001-06-05 13:12:10 +00:00
/* }}} */
1999-04-16 12:15:38 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ php_imagefontsize
1999-04-16 12:15:38 +00:00
* arg = 0 ImageFontWidth
* arg = 1 ImageFontHeight
*/
1999-12-17 21:50:07 +00:00
static void php_imagefontsize ( INTERNAL_FUNCTION_PARAMETERS , int arg )
1999-04-16 12:15:38 +00:00
{
2000-11-23 14:56:09 +00:00
zval * * SIZE ;
1999-04-16 12:15:38 +00:00
gdFontPtr font ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & SIZE ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-23 14:56:09 +00:00
convert_to_long_ex ( SIZE ) ;
font = php_find_gd_font ( Z_LVAL_PP ( SIZE ) ) ;
1999-04-16 12:15:38 +00:00
RETURN_LONG ( arg ? font - > h : font - > w ) ;
}
2001-06-05 13:12:10 +00:00
/* }}} */
1999-04-16 12:15:38 +00:00
/* {{{ proto int imagefontwidth(int font)
1999-11-24 22:04:49 +00:00
Get font width */
1999-05-21 10:06:25 +00:00
PHP_FUNCTION ( imagefontwidth )
1999-04-16 12:15:38 +00:00
{
1999-12-17 21:50:07 +00:00
php_imagefontsize ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
/* {{{ proto int imagefontheight(int font)
2000-01-24 20:25:57 +00:00
Get font height */
1999-05-21 10:06:25 +00:00
PHP_FUNCTION ( imagefontheight )
1999-04-16 12:15:38 +00:00
{
1999-12-17 21:50:07 +00:00
php_imagefontsize ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
2001-06-05 13:12:10 +00:00
/* {{{ php_gdimagecharup
* workaround for a bug in gd 1.2 */
2001-08-22 08:34:04 +00:00
static void php_gdimagecharup ( gdImagePtr im , gdFontPtr f , int x , int y , int c , int color )
1999-04-16 12:15:38 +00:00
{
int cx , cy , px , py , fline ;
cx = 0 ;
cy = 0 ;
if ( ( c < f - > offset ) | | ( c > = ( f - > offset + f - > nchars ) ) ) {
return ;
}
fline = ( c - f - > offset ) * f - > h * f - > w ;
for ( py = y ; ( py > ( y - f - > w ) ) ; py - - ) {
for ( px = x ; ( px < ( x + f - > h ) ) ; px + + ) {
if ( f - > data [ fline + cy * f - > w + cx ] ) {
gdImageSetPixel ( im , px , py , color ) ;
}
cy + + ;
}
cy = 0 ;
cx + + ;
}
}
2001-06-05 13:12:10 +00:00
/* }}} */
1999-04-16 12:15:38 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ php_imagechar
1999-04-16 12:15:38 +00:00
* arg = 0 ImageChar
* arg = 1 ImageCharUp
* arg = 2 ImageString
* arg = 3 ImageStringUp
*/
2000-11-23 14:56:09 +00:00
static void php_imagechar ( INTERNAL_FUNCTION_PARAMETERS , int mode )
{
2000-02-28 16:52:03 +00:00
zval * * IM , * * SIZE , * * X , * * Y , * * C , * * COL ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
int ch = 0 , col , x , y , size , i , l = 0 ;
2000-02-08 22:21:43 +00:00
unsigned char * str = NULL ;
1999-04-16 12:15:38 +00:00
gdFontPtr font ;
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 6 | | zend_get_parameters_ex ( 6 , & IM , & SIZE , & X , & Y , & C , & COL ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( SIZE ) ;
convert_to_long_ex ( X ) ;
convert_to_long_ex ( Y ) ;
convert_to_string_ex ( C ) ;
convert_to_long_ex ( COL ) ;
1999-04-16 12:15:38 +00:00
2000-11-23 14:56:09 +00:00
col = Z_LVAL_PP ( COL ) ;
1999-04-16 12:15:38 +00:00
if ( mode < 2 ) {
2000-11-23 14:56:09 +00:00
ch = ( int ) ( ( unsigned char ) * ( Z_STRVAL_PP ( C ) ) ) ;
1999-04-16 12:15:38 +00:00
} else {
2000-11-23 14:56:09 +00:00
str = ( unsigned char * ) estrndup ( Z_STRVAL_PP ( C ) , Z_STRLEN_PP ( C ) ) ;
2000-02-08 22:21:43 +00:00
l = strlen ( str ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-23 14:56:09 +00:00
y = Z_LVAL_PP ( Y ) ;
x = Z_LVAL_PP ( X ) ;
size = Z_LVAL_PP ( SIZE ) ;
1999-04-16 12:15:38 +00:00
1999-12-17 21:50:07 +00:00
font = php_find_gd_font ( size ) ;
1999-04-16 12:15:38 +00:00
switch ( mode ) {
case 0 :
gdImageChar ( im , font , x , y , ch , col ) ;
break ;
case 1 :
1999-12-17 21:50:07 +00:00
php_gdimagecharup ( im , font , x , y , ch , col ) ;
1999-04-16 12:15:38 +00:00
break ;
case 2 :
for ( i = 0 ; ( i < l ) ; i + + ) {
2000-02-08 22:21:43 +00:00
gdImageChar ( im , font , x , y , ( int ) ( ( unsigned char ) str [ i ] ) ,
1999-04-16 12:15:38 +00:00
col ) ;
x + = font - > w ;
}
break ;
case 3 : {
for ( i = 0 ; ( i < l ) ; i + + ) {
2000-02-08 22:21:43 +00:00
/* php_gdimagecharup(im, font, x, y, (int)str[i], col); */
gdImageCharUp ( im , font , x , y , ( int ) str [ i ] , col ) ;
1999-04-16 12:15:38 +00:00
y - = font - > w ;
}
break ;
}
}
2000-02-08 22:21:43 +00:00
if ( str ) {
efree ( str ) ;
1999-04-16 12:15:38 +00:00
}
RETURN_TRUE ;
2001-06-05 13:12:10 +00:00
}
/* }}} */
1999-04-16 12:15:38 +00:00
/* {{{ proto int imagechar(int im, int font, int x, int y, string c, int col)
1999-11-24 22:04:49 +00:00
Draw a character */
2000-11-23 14:56:09 +00:00
PHP_FUNCTION ( imagechar )
{
1999-12-17 21:50:07 +00:00
php_imagechar ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
/* {{{ proto int imagecharup(int im, int font, int x, int y, string c, int col)
1999-11-24 22:04:49 +00:00
Draw a character rotated 90 degrees counter - clockwise */
2000-11-23 14:56:09 +00:00
PHP_FUNCTION ( imagecharup )
{
1999-12-17 21:50:07 +00:00
php_imagechar ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
/* {{{ proto int imagestring(int im, int font, int x, int y, string str, int col)
1999-11-24 22:04:49 +00:00
Draw a string horizontally */
2000-11-23 14:56:09 +00:00
PHP_FUNCTION ( imagestring )
{
1999-12-17 21:50:07 +00:00
php_imagechar ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 2 ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
/* {{{ proto int imagestringup(int im, int font, int x, int y, string str, int col)
1999-11-24 22:04:49 +00:00
Draw a string vertically - rotated 90 degrees counter - clockwise */
2000-11-23 14:56:09 +00:00
PHP_FUNCTION ( imagestringup )
{
1999-12-17 21:50:07 +00:00
php_imagechar ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 3 ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
2000-03-13 20:36:59 +00:00
/* {{{ proto int imagecopy(int dst_im, int src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h)
1999-11-24 22:04:49 +00:00
Copy part of an image */
1999-05-21 10:06:25 +00:00
PHP_FUNCTION ( imagecopy )
1999-04-16 12:15:38 +00:00
{
2000-02-28 16:52:03 +00:00
zval * * SIM , * * DIM , * * SX , * * SY , * * SW , * * SH , * * DX , * * DY ;
2000-11-23 14:56:09 +00:00
gdImagePtr im_dst , im_src ;
1999-04-16 12:15:38 +00:00
int srcH , srcW , srcY , srcX , dstY , dstX ;
2000-11-23 14:56:09 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 8 | |
2001-07-30 17:29:57 +00:00
zend_get_parameters_ex ( 8 , & DIM , & SIM , & DX , & DY , & SX , & SY , & SW , & SH ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im_src , gdImagePtr , SIM , - 1 , " Image " , le_gd ) ;
ZEND_FETCH_RESOURCE ( im_dst , gdImagePtr , DIM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( SX ) ;
convert_to_long_ex ( SY ) ;
convert_to_long_ex ( SW ) ;
convert_to_long_ex ( SH ) ;
convert_to_long_ex ( DX ) ;
convert_to_long_ex ( DY ) ;
2000-11-23 14:56:09 +00:00
srcX = Z_LVAL_PP ( SX ) ;
srcY = Z_LVAL_PP ( SY ) ;
srcH = Z_LVAL_PP ( SH ) ;
srcW = Z_LVAL_PP ( SW ) ;
dstX = Z_LVAL_PP ( DX ) ;
dstY = Z_LVAL_PP ( DY ) ;
1999-04-16 12:15:38 +00:00
gdImageCopy ( im_dst , im_src , dstX , dstY , srcX , srcY , srcW , srcH ) ;
RETURN_TRUE ;
}
/* }}} */
2002-06-24 19:31:44 +00:00
# if HAVE_LIBGD15
2000-06-25 03:06:38 +00:00
/* {{{ proto int imagecopymerge(int src_im, int dst_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct)
2000-06-25 10:59:42 +00:00
Merge one part of an image with another */
2000-06-25 02:55:31 +00:00
PHP_FUNCTION ( imagecopymerge )
{
zval * * SIM , * * DIM , * * SX , * * SY , * * SW , * * SH , * * DX , * * DY , * * PCT ;
2000-11-23 14:56:09 +00:00
gdImagePtr im_dst , im_src ;
2000-06-25 02:55:31 +00:00
int srcH , srcW , srcY , srcX , dstY , dstX , pct ;
if ( ZEND_NUM_ARGS ( ) ! = 9 | |
2001-07-30 17:29:57 +00:00
zend_get_parameters_ex ( 9 , & DIM , & SIM , & DX , & DY , & SX , & SY , & SW , & SH , & PCT ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-06-25 02:55:31 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im_src , gdImagePtr , SIM , - 1 , " Image " , le_gd ) ;
ZEND_FETCH_RESOURCE ( im_dst , gdImagePtr , DIM , - 1 , " Image " , le_gd ) ;
2000-06-25 02:55:31 +00:00
convert_to_long_ex ( SX ) ;
convert_to_long_ex ( SY ) ;
convert_to_long_ex ( SW ) ;
convert_to_long_ex ( SH ) ;
convert_to_long_ex ( DX ) ;
convert_to_long_ex ( DY ) ;
convert_to_long_ex ( PCT ) ;
srcX = Z_LVAL_PP ( SX ) ;
srcY = Z_LVAL_PP ( SY ) ;
srcH = Z_LVAL_PP ( SH ) ;
srcW = Z_LVAL_PP ( SW ) ;
2000-06-25 03:12:38 +00:00
dstX = Z_LVAL_PP ( DX ) ;
2000-06-25 02:55:31 +00:00
dstY = Z_LVAL_PP ( DY ) ;
pct = Z_LVAL_PP ( PCT ) ;
gdImageCopyMerge ( im_dst , im_src , dstX , dstY , srcX , srcY , srcW , srcH , pct ) ;
RETURN_TRUE ;
}
2000-06-25 03:06:38 +00:00
/* }}} */
2000-06-25 02:55:31 +00:00
2001-04-13 12:00:12 +00:00
/* {{{ proto int imagecopymergegray(int src_im, int dst_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct)
Merge one part of an image with another */
PHP_FUNCTION ( imagecopymergegray )
{
zval * * SIM , * * DIM , * * SX , * * SY , * * SW , * * SH , * * DX , * * DY , * * PCT ;
gdImagePtr im_dst , im_src ;
int srcH , srcW , srcY , srcX , dstY , dstX , pct ;
if ( ZEND_NUM_ARGS ( ) ! = 9 | |
2001-07-30 17:29:57 +00:00
zend_get_parameters_ex ( 9 , & DIM , & SIM , & DX , & DY , & SX , & SY , & SW , & SH , & PCT ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-04-13 12:00:12 +00:00
}
ZEND_FETCH_RESOURCE ( im_src , gdImagePtr , SIM , - 1 , " Image " , le_gd ) ;
ZEND_FETCH_RESOURCE ( im_dst , gdImagePtr , DIM , - 1 , " Image " , le_gd ) ;
convert_to_long_ex ( SX ) ;
convert_to_long_ex ( SY ) ;
convert_to_long_ex ( SW ) ;
convert_to_long_ex ( SH ) ;
convert_to_long_ex ( DX ) ;
convert_to_long_ex ( DY ) ;
convert_to_long_ex ( PCT ) ;
srcX = Z_LVAL_PP ( SX ) ;
srcY = Z_LVAL_PP ( SY ) ;
srcH = Z_LVAL_PP ( SH ) ;
srcW = Z_LVAL_PP ( SW ) ;
dstX = Z_LVAL_PP ( DX ) ;
dstY = Z_LVAL_PP ( DY ) ;
pct = Z_LVAL_PP ( PCT ) ;
gdImageCopyMergeGray ( im_dst , im_src , dstX , dstY , srcX , srcY , srcW , srcH , pct ) ;
RETURN_TRUE ;
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif
2001-04-13 12:00:12 +00:00
2000-06-18 16:31:52 +00:00
/* {{{ proto int imagecopyresized(int dst_im, int 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)
1999-11-24 22:04:49 +00:00
Copy and resize part of an image */
1999-05-21 10:06:25 +00:00
PHP_FUNCTION ( imagecopyresized )
1999-04-16 12:15:38 +00:00
{
2000-02-28 16:52:03 +00:00
zval * * SIM , * * DIM , * * SX , * * SY , * * SW , * * SH , * * DX , * * DY , * * DW , * * DH ;
2000-11-23 14:56:09 +00:00
gdImagePtr im_dst , im_src ;
1999-04-16 12:15:38 +00:00
int srcH , srcW , dstH , dstW , srcY , srcX , dstY , dstX ;
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 10 | |
2001-07-30 17:29:57 +00:00
zend_get_parameters_ex ( 10 , & DIM , & SIM , & DX , & DY , & SX , & SY , & DW , & DH , & SW , & SH ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im_dst , gdImagePtr , DIM , - 1 , " Image " , le_gd ) ;
ZEND_FETCH_RESOURCE ( im_src , gdImagePtr , SIM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( SX ) ;
convert_to_long_ex ( SY ) ;
convert_to_long_ex ( SW ) ;
convert_to_long_ex ( SH ) ;
convert_to_long_ex ( DX ) ;
convert_to_long_ex ( DY ) ;
convert_to_long_ex ( DW ) ;
convert_to_long_ex ( DH ) ;
2000-11-23 14:56:09 +00:00
srcX = Z_LVAL_PP ( SX ) ;
srcY = Z_LVAL_PP ( SY ) ;
srcH = Z_LVAL_PP ( SH ) ;
srcW = Z_LVAL_PP ( SW ) ;
dstX = Z_LVAL_PP ( DX ) ;
dstY = Z_LVAL_PP ( DY ) ;
dstH = Z_LVAL_PP ( DH ) ;
dstW = Z_LVAL_PP ( DW ) ;
gdImageCopyResized ( im_dst , im_src , dstX , dstY , srcX , srcY , dstW , dstH , srcW , srcH ) ;
1999-04-16 12:15:38 +00:00
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto int imagesx(int im)
1999-11-24 22:04:49 +00:00
Get image width */
1999-07-27 19:44:46 +00:00
PHP_FUNCTION ( imagesx )
1999-04-16 12:15:38 +00:00
{
2000-02-28 16:52:03 +00:00
zval * * IM ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & IM ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
RETURN_LONG ( gdImageSX ( im ) ) ;
}
/* }}} */
/* {{{ proto int imagesy(int im)
2000-01-24 20:25:57 +00:00
Get image height */
1999-07-27 19:44:46 +00:00
PHP_FUNCTION ( imagesy )
1999-04-16 12:15:38 +00:00
{
2000-02-28 16:52:03 +00:00
zval * * IM ;
1999-04-16 12:15:38 +00:00
gdImagePtr im ;
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & IM ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
RETURN_LONG ( gdImageSY ( im ) ) ;
}
/* }}} */
1999-07-23 15:18:37 +00:00
# ifdef ENABLE_GD_TTF
1999-04-16 12:15:38 +00:00
# define TTFTEXT_DRAW 0
# define TTFTEXT_BBOX 1
2000-05-02 14:10:51 +00:00
# endif
1999-04-16 12:15:38 +00:00
2002-06-24 19:31:44 +00:00
# ifdef ENABLE_GD_TTF
2001-07-05 21:23:28 +00:00
2002-06-24 19:31:44 +00:00
# if HAVE_LIBGD20 && HAVE_LIBFREETYPE && HAVE_GD_STRINGFTEX
2001-07-05 21:23:28 +00:00
/* {{{ proto array imageftbbox(int size, int angle, string font_file, string text[, array extrainfo])
Give the bounding box of a text using fonts via freetype2 */
PHP_FUNCTION ( imageftbbox )
{
php_imagettftext_common ( INTERNAL_FUNCTION_PARAM_PASSTHRU , TTFTEXT_BBOX , 1 ) ;
}
/* }}} */
2001-12-06 17:51:48 +00:00
/* {{{ proto array imagefttext(int im, int size, int angle, int x, int y, int col, string font_file, string text, [array extrainfo])
Write text to the image using fonts via freetype2 */
2001-07-05 21:23:28 +00:00
PHP_FUNCTION ( imagefttext )
{
php_imagettftext_common ( INTERNAL_FUNCTION_PARAM_PASSTHRU , TTFTEXT_DRAW , 1 ) ;
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif
2001-07-05 21:23:28 +00:00
1999-04-16 12:15:38 +00:00
/* {{{ proto array imagettfbbox(int size, int angle, string font_file, string text)
1999-11-24 22:04:49 +00:00
Give the bounding box of a text using TrueType fonts */
1999-05-21 10:06:25 +00:00
PHP_FUNCTION ( imagettfbbox )
1999-04-16 12:15:38 +00:00
{
2001-07-05 21:23:28 +00:00
php_imagettftext_common ( INTERNAL_FUNCTION_PARAM_PASSTHRU , TTFTEXT_BBOX , 0 ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
/* {{{ proto array imagettftext(int im, int size, int angle, int x, int y, int col, string font_file, string text)
1999-11-24 22:04:49 +00:00
Write text to the image using a TrueType font */
1999-05-21 10:06:25 +00:00
PHP_FUNCTION ( imagettftext )
1999-04-16 12:15:38 +00:00
{
2001-07-05 21:23:28 +00:00
php_imagettftext_common ( INTERNAL_FUNCTION_PARAM_PASSTHRU , TTFTEXT_DRAW , 0 ) ;
1999-04-16 12:15:38 +00:00
}
/* }}} */
2001-06-05 13:12:10 +00:00
/* {{{ php_imagettftext_common
*/
2001-09-06 23:10:37 +00:00
static void php_imagettftext_common ( INTERNAL_FUNCTION_PARAMETERS , int mode , int extended )
1999-04-16 12:15:38 +00:00
{
2001-07-05 21:23:28 +00:00
zval * * IM , * * PTSIZE , * * ANGLE , * * X , * * Y , * * C , * * FONTNAME , * * COL , * * EXT = NULL ;
2000-05-24 08:58:40 +00:00
gdImagePtr im = NULL ;
2000-11-23 14:56:09 +00:00
int col , x , y , l = 0 , i , brect [ 8 ] ;
1999-04-16 12:15:38 +00:00
double ptsize , angle ;
2000-02-08 22:21:43 +00:00
unsigned char * str = NULL , * fontname = NULL ;
2000-02-28 16:52:03 +00:00
char * error ;
2001-07-05 21:23:28 +00:00
int argc ;
# if HAVE_GD_STRINGFTEX
gdFTStringExtra strex ;
# endif
# if !HAVE_GD_STRINGFTEX
if ( extended ) {
2002-02-28 23:08:48 +00:00
zend_error ( E_WARNING , " %s(): gdImageStringFTEx not supported in this PHP build " , get_active_function_name ( TSRMLS_C ) ) ;
2001-07-05 21:23:28 +00:00
RETURN_FALSE ;
}
# endif
argc = ZEND_NUM_ARGS ( ) ;
1999-04-16 12:15:38 +00:00
if ( mode = = TTFTEXT_BBOX ) {
2001-07-05 21:23:28 +00:00
if ( ( extended & & argc ! = 5 ) | | ( ! extended & & argc ! = 4 ) | |
2001-07-30 17:29:57 +00:00
zend_get_parameters_ex ( argc , & PTSIZE , & ANGLE , & FONTNAME , & C , & EXT ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
} else {
2001-07-05 21:23:28 +00:00
if ( ( extended & & argc ! = 9 ) | | ( ! extended & & argc ! = 8 ) | |
2001-07-30 17:29:57 +00:00
zend_get_parameters_ex ( argc , & IM , & PTSIZE , & ANGLE , & X , & Y , & COL , & FONTNAME , & C , & EXT ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
1999-04-16 12:15:38 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( im , gdImagePtr , IM , - 1 , " Image " , le_gd ) ;
1999-04-16 12:15:38 +00:00
}
2000-02-28 16:52:03 +00:00
convert_to_double_ex ( PTSIZE ) ;
convert_to_double_ex ( ANGLE ) ;
convert_to_string_ex ( FONTNAME ) ;
convert_to_string_ex ( C ) ;
2000-11-23 14:56:09 +00:00
1999-04-16 12:15:38 +00:00
if ( mode = = TTFTEXT_BBOX ) {
2000-11-23 14:56:09 +00:00
im = NULL ;
1999-04-16 12:15:38 +00:00
col = x = y = - 1 ;
} else {
2000-02-28 16:52:03 +00:00
convert_to_long_ex ( X ) ;
convert_to_long_ex ( Y ) ;
convert_to_long_ex ( COL ) ;
2000-11-23 14:56:09 +00:00
col = Z_LVAL_PP ( COL ) ;
y = Z_LVAL_PP ( Y ) ;
x = Z_LVAL_PP ( X ) ;
2001-07-05 21:23:28 +00:00
# if HAVE_GD_STRINGFTEX
if ( EXT ) {
/* parse extended info */
HashPosition pos ;
convert_to_array_ex ( EXT ) ;
memset ( & strex , 0 , sizeof ( strex ) ) ;
/* walk the assoc array */
zend_hash_internal_pointer_reset_ex ( HASH_OF ( * EXT ) , & pos ) ;
do {
zval * * item ;
char * key ;
if ( zend_hash_get_current_key_ex ( HASH_OF ( * EXT ) , & key , NULL , NULL , 0 , & pos ) = = FAILURE )
continue ;
if ( zend_hash_get_current_data_ex ( HASH_OF ( * EXT ) , ( void * * ) & item , & pos ) = = FAILURE )
continue ;
if ( strcmp ( " linespacing " , key ) = = 0 ) {
convert_to_double_ex ( item ) ;
strex . flags | = gdFTEX_LINESPACE ;
strex . linespacing = Z_DVAL_PP ( item ) ;
}
} while ( zend_hash_move_forward_ex ( HASH_OF ( * EXT ) , & pos ) = = SUCCESS ) ;
}
# endif
2000-02-28 16:52:03 +00:00
}
2000-11-23 14:56:09 +00:00
ptsize = Z_DVAL_PP ( PTSIZE ) ;
angle = Z_DVAL_PP ( ANGLE ) * ( M_PI / 180 ) ; /* convert to radians */
2000-02-28 16:52:03 +00:00
2000-11-23 14:56:09 +00:00
str = ( unsigned char * ) Z_STRVAL_PP ( C ) ;
2000-02-08 22:21:43 +00:00
l = strlen ( str ) ;
1999-04-16 12:15:38 +00:00
2001-07-20 11:25:13 +00:00
# ifdef VIRTUAL_DIR
2001-08-05 01:43:02 +00:00
if ( virtual_filepath ( Z_STRVAL_PP ( FONTNAME ) , & fontname TSRMLS_CC ) ) {
2001-07-20 11:25:13 +00:00
fontname = ( unsigned char * ) Z_STRVAL_PP ( FONTNAME ) ;
}
# else
fontname = ( unsigned char * ) Z_STRVAL_PP ( FONTNAME ) ;
# endif
2001-07-05 21:23:28 +00:00
2001-09-06 23:10:37 +00:00
# ifdef USE_GD_IMGSTRTTF
# if HAVE_GD_STRINGFTEX
2001-07-05 21:23:28 +00:00
if ( extended ) {
error = gdImageStringFTEx ( im , brect , col , fontname , ptsize , angle , x , y , str , & strex ) ;
}
else
2001-09-06 23:10:37 +00:00
# endif
2001-10-24 10:42:31 +00:00
2001-09-06 23:10:37 +00:00
# if HAVE_GD_STRINGFT
2001-04-13 12:00:12 +00:00
error = gdImageStringFT ( im , brect , col , fontname , ptsize , angle , x , y , str ) ;
2001-10-24 10:42:31 +00:00
# elif HAVE_GD_STRINGTTF
2000-10-16 13:50:30 +00:00
error = gdImageStringTTF ( im , brect , col , fontname , ptsize , angle , x , y , str ) ;
2001-04-13 12:00:12 +00:00
# endif
2001-09-06 23:10:37 +00:00
# else /* !USE_GD_IMGSTRTTF */
2000-02-08 22:21:43 +00:00
error = gdttf ( im , brect , col , fontname , ptsize , angle , x , y , str ) ;
2000-10-16 13:50:30 +00:00
# endif
1999-04-16 12:15:38 +00:00
2001-09-06 23:10:37 +00:00
1999-04-16 12:15:38 +00:00
if ( error ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): %s " , get_active_function_name ( TSRMLS_C ) , error ) ;
1999-04-16 12:15:38 +00:00
RETURN_FALSE ;
}
if ( array_init ( return_value ) = = FAILURE ) {
RETURN_FALSE ;
}
/* return array with the text's bounding box */
for ( i = 0 ; i < 8 ; i + + ) {
add_next_index_long ( return_value , brect [ i ] ) ;
}
}
2001-06-05 13:12:10 +00:00
/* }}} */
2000-02-25 06:43:51 +00:00
# endif /* ENABLE_GD_TTF */
# if HAVE_LIBT1
2001-06-05 13:12:10 +00:00
/* {{{ php_free_ps_font
*/
2002-06-28 12:35:30 +00:00
static void php_free_ps_font ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
2000-02-25 06:43:51 +00:00
{
2000-10-20 18:25:16 +00:00
int * font = ( int * ) rsrc - > ptr ;
2001-07-31 05:44:11 +00:00
2000-02-25 06:43:51 +00:00
T1_DeleteFont ( * font ) ;
efree ( font ) ;
}
2001-06-05 13:12:10 +00:00
/* }}} */
2000-02-25 06:43:51 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ php_free_ps_enc
*/
2002-06-28 12:35:30 +00:00
static void php_free_ps_enc ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
2000-02-25 06:43:51 +00:00
{
2000-10-20 18:25:16 +00:00
char * * enc = ( char * * ) rsrc - > ptr ;
2001-07-31 05:44:11 +00:00
2000-02-25 06:43:51 +00:00
T1_DeleteEncoding ( enc ) ;
}
2001-06-05 13:12:10 +00:00
/* }}} */
2000-02-25 06:43:51 +00:00
/* {{{ proto int imagepsloadfont(string pathname)
Load a new font from specified file */
PHP_FUNCTION ( imagepsloadfont )
{
zval * * file ;
2000-11-23 14:56:09 +00:00
int f_ind , * font ;
2000-02-25 06:43:51 +00:00
2001-07-30 17:29:57 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & file ) = = FAILURE ) {
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-02-25 06:43:51 +00:00
}
convert_to_string_ex ( file ) ;
2000-11-23 14:56:09 +00:00
f_ind = T1_AddFont ( Z_STRVAL_PP ( file ) ) ;
2000-02-25 06:43:51 +00:00
if ( f_ind < 0 ) {
switch ( f_ind ) {
case - 1 :
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Couldn't find the font file " , get_active_function_name ( TSRMLS_C ) ) ;
2000-02-25 06:43:51 +00:00
RETURN_FALSE ;
break ;
case - 2 :
case - 3 :
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Memory allocation fault in t1lib " , get_active_function_name ( TSRMLS_C ) ) ;
2000-02-25 06:43:51 +00:00
RETURN_FALSE ;
break ;
default :
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): An unknown error occurred in t1lib " , get_active_function_name ( TSRMLS_C ) ) ;
2000-02-25 06:43:51 +00:00
RETURN_FALSE ;
break ;
}
}
2000-06-16 10:09:12 +00:00
if ( T1_LoadFont ( f_ind ) ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Couldn't load the font " , get_active_function_name ( TSRMLS_C ) ) ;
2000-06-16 10:09:12 +00:00
RETURN_FALSE ;
}
2000-02-25 06:43:51 +00:00
font = ( int * ) emalloc ( sizeof ( int ) ) ;
* font = f_ind ;
2000-11-29 15:25:42 +00:00
ZEND_REGISTER_RESOURCE ( return_value , font , le_ps_font ) ;
2000-02-25 06:43:51 +00:00
}
/* }}} */
2001-12-06 18:37:05 +00:00
/* {{{ proto int imagepscopyfont(int font_index)
Make a copy of a font for purposes like extending or reenconding */
/* The function in t1lib which this function uses seem to be buggy...
2000-02-25 06:43:51 +00:00
PHP_FUNCTION ( imagepscopyfont )
{
2000-11-23 14:56:09 +00:00
zval * * fnt ;
2000-02-25 06:43:51 +00:00
int l_ind , type ;
gd_ps_font * nf_ind , * of_ind ;
2000-11-23 14:56:09 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & fnt ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-02-25 06:43:51 +00:00
}
2000-11-23 14:56:09 +00:00
convert_to_long_ex ( fnt ) ;
2000-02-25 06:43:51 +00:00
2000-11-23 14:56:09 +00:00
of_ind = zend_list_find ( Z_LVAL_PP ( fnt ) , & type ) ;
2000-02-25 06:43:51 +00:00
2000-11-29 15:25:42 +00:00
if ( type ! = le_ps_font ) {
2000-11-23 14:56:09 +00:00
php_error ( E_WARNING , " %d is not a Type 1 font index " , Z_LVAL_PP ( fnt ) ) ;
2000-02-25 06:43:51 +00:00
RETURN_FALSE ;
}
nf_ind = emalloc ( sizeof ( gd_ps_font ) ) ;
nf_ind - > font_id = T1_CopyFont ( of_ind - > font_id ) ;
if ( nf_ind - > font_id < 0 ) {
l_ind = nf_ind - > font_id ;
efree ( nf_ind ) ;
switch ( l_ind ) {
case - 1 :
php_error ( E_WARNING , " FontID %d is not loaded in memory " , l_ind ) ;
RETURN_FALSE ;
break ;
case - 2 :
php_error ( E_WARNING , " Tried to copy a logical font " ) ;
RETURN_FALSE ;
break ;
case - 3 :
php_error ( E_WARNING , " Memory allocation fault in t1lib " ) ;
RETURN_FALSE ;
break ;
default :
php_error ( E_WARNING , " An unknown error occurred in t1lib " ) ;
RETURN_FALSE ;
break ;
}
}
nf_ind - > extend = 1 ;
2000-11-29 15:25:42 +00:00
l_ind = zend_list_insert ( nf_ind , le_ps_font ) ;
2000-02-25 06:43:51 +00:00
RETURN_LONG ( l_ind ) ;
}
*/
/* }}} */
/* {{{ proto bool imagepsfreefont(int font_index)
Free memory used by a font */
PHP_FUNCTION ( imagepsfreefont )
{
zval * * fnt ;
int * f_ind ;
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & fnt ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-02-25 06:43:51 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( f_ind , int * , fnt , - 1 , " Type 1 font " , le_ps_font ) ;
2000-02-25 06:43:51 +00:00
2000-11-23 14:56:09 +00:00
zend_list_delete ( Z_LVAL_PP ( fnt ) ) ;
2000-02-25 06:43:51 +00:00
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto bool imagepsencodefont(int font_index, string filename)
To change a fonts character encoding vector */
PHP_FUNCTION ( imagepsencodefont )
{
zval * * fnt , * * enc ;
char * * enc_vector ;
int * f_ind ;
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & fnt , & enc ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-02-25 06:43:51 +00:00
}
convert_to_string_ex ( enc ) ;
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( f_ind , int * , fnt , - 1 , " Type 1 font " , le_ps_font ) ;
2000-02-25 06:43:51 +00:00
2000-11-23 14:56:09 +00:00
if ( ( enc_vector = T1_LoadEncoding ( Z_STRVAL_PP ( enc ) ) ) = = NULL ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Couldn't load encoding vector from %s " , get_active_function_name ( TSRMLS_C ) , Z_STRVAL_PP ( enc ) ) ;
2000-02-25 06:43:51 +00:00
RETURN_FALSE ;
}
T1_DeleteAllSizes ( * f_ind ) ;
if ( T1_ReencodeFont ( * f_ind , enc_vector ) ) {
T1_DeleteEncoding ( enc_vector ) ;
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Couldn't reencode font " , get_active_function_name ( TSRMLS_C ) ) ;
2000-02-25 06:43:51 +00:00
RETURN_FALSE ;
}
2000-11-29 15:25:42 +00:00
zend_list_insert ( enc_vector , le_ps_enc ) ;
2000-02-25 06:43:51 +00:00
RETURN_TRUE ;
}
/* }}} */
2001-09-21 21:59:27 +00:00
/* {{{ proto bool imagepsextendfont(int font_index, float extend)
2000-02-25 06:43:51 +00:00
Extend or or condense ( if extend < 1 ) a font */
PHP_FUNCTION ( imagepsextendfont )
{
zval * * fnt , * * ext ;
int * f_ind ;
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & fnt , & ext ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-02-25 06:43:51 +00:00
}
convert_to_double_ex ( ext ) ;
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( f_ind , int * , fnt , - 1 , " Type 1 font " , le_ps_font ) ;
2000-02-25 06:43:51 +00:00
2002-06-28 09:53:25 +00:00
T1_DeleteAllSizes ( * f_ind ) ;
2000-11-23 14:56:09 +00:00
if ( T1_ExtendFont ( * f_ind , Z_DVAL_PP ( ext ) ) ! = 0 ) RETURN_FALSE ;
2000-02-25 06:43:51 +00:00
RETURN_TRUE ;
}
/* }}} */
2001-09-21 21:59:27 +00:00
/* {{{ proto bool imagepsslantfont(int font_index, float slant)
2000-02-25 06:43:51 +00:00
Slant a font */
PHP_FUNCTION ( imagepsslantfont )
{
zval * * fnt , * * slt ;
int * f_ind ;
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & fnt , & slt ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-02-25 06:43:51 +00:00
}
convert_to_double_ex ( slt ) ;
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( f_ind , int * , fnt , - 1 , " Type 1 font " , le_ps_font ) ;
2000-02-25 06:43:51 +00:00
2000-11-23 14:56:09 +00:00
if ( T1_SlantFont ( * f_ind , Z_DVAL_PP ( slt ) ) ! = 0 ) RETURN_FALSE ;
2000-02-25 06:43:51 +00:00
RETURN_TRUE ;
}
/* }}} */
2001-09-21 21:59:27 +00:00
/* {{{ proto array imagepstext(int image, string text, int font, int size, int xcoord, int ycoord [, int space, int tightness, float angle, int antialias])
2000-02-25 06:43:51 +00:00
Rasterize a string over an image */
PHP_FUNCTION ( imagepstext )
{
zval * * img , * * str , * * fnt , * * sz , * * fg , * * bg , * * sp , * * px , * * py , * * aas , * * wd , * * ang ;
int i , j , x , y ;
2000-02-28 16:52:03 +00:00
int space ;
2000-02-25 06:43:51 +00:00
int * f_ind ;
int h_lines , v_lines , c_ind ;
2001-08-11 16:39:07 +00:00
int rd , gr , bl , fg_rd , fg_gr , fg_bl , bg_rd , bg_gr , bg_bl , _fg , _bg ;
2000-02-25 06:43:51 +00:00
int aa [ 16 ] , aa_steps ;
int width , amount_kern , add_width ;
double angle , extend ;
unsigned long aa_greys [ ] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 } ;
gdImagePtr bg_img ;
GLYPH * str_img ;
T1_OUTLINE * char_path , * str_path ;
T1_TMATRIX * transform = NULL ;
2000-11-23 14:56:09 +00:00
char * _str ;
2000-06-05 19:47:54 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
2000-02-25 06:43:51 +00:00
case 8 :
if ( zend_get_parameters_ex ( 8 , & img , & str , & fnt , & sz , & fg , & bg , & px , & py ) = = FAILURE ) {
RETURN_FALSE ;
}
space = 0 ;
aa_steps = 4 ;
width = 0 ;
angle = 0 ;
break ;
case 12 :
if ( zend_get_parameters_ex ( 12 , & img , & str , & fnt , & sz , & fg , & bg , & px , & py , & sp , & wd , & ang , & aas ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_long_ex ( sp ) ;
convert_to_long_ex ( aas ) ;
convert_to_long_ex ( wd ) ;
convert_to_double_ex ( ang ) ;
2000-11-23 14:56:09 +00:00
space = Z_LVAL_PP ( sp ) ;
aa_steps = Z_LVAL_PP ( aas ) ;
width = Z_LVAL_PP ( wd ) ;
angle = Z_DVAL_PP ( ang ) ;
2000-02-25 06:43:51 +00:00
break ;
default :
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-02-25 06:43:51 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( bg_img , gdImagePtr , img , - 1 , " Image " , le_gd ) ;
ZEND_FETCH_RESOURCE ( f_ind , int * , fnt , - 1 , " Type 1 font " , le_ps_font ) ;
2000-02-25 06:43:51 +00:00
2000-11-23 14:56:09 +00:00
x = Z_LVAL_PP ( px ) ;
y = Z_LVAL_PP ( py ) ;
_fg = Z_LVAL_PP ( fg ) ;
_bg = Z_LVAL_PP ( bg ) ;
fg_rd = gdImageRed ( bg_img , _fg ) ;
fg_gr = gdImageGreen ( bg_img , _fg ) ;
fg_bl = gdImageBlue ( bg_img , _fg ) ;
bg_rd = gdImageRed ( bg_img , _bg ) ;
bg_gr = gdImageGreen ( bg_img , _bg ) ;
bg_bl = gdImageBlue ( bg_img , _bg ) ;
2000-02-25 06:43:51 +00:00
for ( i = 0 ; i < aa_steps ; i + + ) {
rd = bg_rd + ( double ) ( fg_rd - bg_rd ) / aa_steps * ( i + 1 ) ;
gr = bg_gr + ( double ) ( fg_gr - bg_gr ) / aa_steps * ( i + 1 ) ;
bl = bg_bl + ( double ) ( fg_bl - bg_bl ) / aa_steps * ( i + 1 ) ;
aa [ i ] = gdImageColorResolve ( bg_img , rd , gr , bl ) ;
}
T1_AASetBitsPerPixel ( 8 ) ;
switch ( aa_steps ) {
case 4 :
T1_AASetGrayValues ( 0 , 1 , 2 , 3 , 4 ) ;
T1_AASetLevel ( T1_AA_LOW ) ;
break ;
case 16 :
T1_AAHSetGrayValues ( aa_greys ) ;
T1_AASetLevel ( T1_AA_HIGH ) ;
break ;
default :
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Invalid value %d as number of steps for antialiasing " , get_active_function_name ( TSRMLS_C ) , aa_steps ) ;
2000-02-25 06:43:51 +00:00
RETURN_FALSE ;
}
if ( angle ) {
transform = T1_RotateMatrix ( NULL , angle ) ;
}
2000-11-23 14:56:09 +00:00
_str = Z_STRVAL_PP ( str ) ;
2000-02-25 06:43:51 +00:00
if ( width ) {
extend = T1_GetExtend ( * f_ind ) ;
2000-11-23 14:56:09 +00:00
str_path = T1_GetCharOutline ( * f_ind , _str [ 0 ] , Z_LVAL_PP ( sz ) , transform ) ;
2000-02-25 06:43:51 +00:00
2000-11-23 14:56:09 +00:00
for ( i = 1 ; i < Z_STRLEN_PP ( str ) ; i + + ) {
amount_kern = ( int ) T1_GetKerning ( * f_ind , _str [ i - 1 ] , _str [ i ] ) ;
amount_kern + = _str [ i - 1 ] = = ' ' ? space : 0 ;
2000-02-25 06:43:51 +00:00
add_width = ( int ) ( amount_kern + width ) / extend ;
2000-11-23 14:56:09 +00:00
char_path = T1_GetMoveOutline ( * f_ind , add_width , 0 , 0 , Z_LVAL_PP ( sz ) , transform ) ;
2000-02-25 06:43:51 +00:00
str_path = T1_ConcatOutlines ( str_path , char_path ) ;
2000-11-23 14:56:09 +00:00
char_path = T1_GetCharOutline ( * f_ind , _str [ i ] , Z_LVAL_PP ( sz ) , transform ) ;
2000-02-25 06:43:51 +00:00
str_path = T1_ConcatOutlines ( str_path , char_path ) ;
}
str_img = T1_AAFillOutline ( str_path , 0 ) ;
} else {
2000-11-23 14:56:09 +00:00
str_img = T1_AASetString ( * f_ind , _str , Z_STRLEN_PP ( str ) , space , T1_KERNING , Z_LVAL_PP ( sz ) , transform ) ;
2000-02-25 06:43:51 +00:00
}
2000-06-16 10:09:12 +00:00
if ( T1_errno ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): libt1 returned error %d " , get_active_function_name ( TSRMLS_C ) , T1_errno ) ;
2000-06-16 10:09:12 +00:00
RETURN_FALSE ;
}
2000-02-25 06:43:51 +00:00
h_lines = str_img - > metrics . ascent - str_img - > metrics . descent ;
v_lines = str_img - > metrics . rightSideBearing - str_img - > metrics . leftSideBearing ;
for ( i = 0 ; i < v_lines ; i + + ) {
for ( j = 0 ; j < h_lines ; j + + ) {
switch ( str_img - > bits [ j * v_lines + i ] ) {
case 0 :
break ;
default :
c_ind = aa [ str_img - > bits [ j * v_lines + i ] - 1 ] ;
gdImageSetPixel ( bg_img , x + str_img - > metrics . leftSideBearing + i , y - str_img - > metrics . ascent + j , c_ind ) ;
}
}
}
if ( array_init ( return_value ) = = FAILURE ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Couldn't initialize array for returning bounding box " , get_active_function_name ( TSRMLS_C ) ) ;
2000-02-25 06:43:51 +00:00
RETURN_FALSE ;
}
add_next_index_long ( return_value , str_img - > metrics . leftSideBearing ) ;
add_next_index_long ( return_value , str_img - > metrics . descent ) ;
add_next_index_long ( return_value , str_img - > metrics . rightSideBearing ) ;
add_next_index_long ( return_value , str_img - > metrics . ascent ) ;
}
/* }}} */
/* {{{ proto array imagepsbbox(string text, int font, int size [, int space, int tightness, int angle])
Return the bounding box needed by a string if rasterized */
PHP_FUNCTION ( imagepsbbox )
{
zval * * str , * * fnt , * * sz , * * sp , * * wd , * * ang ;
2001-07-30 20:27:11 +00:00
int i , space , add_width = 0 , char_width , amount_kern ;
2000-02-25 06:43:51 +00:00
int cur_x , cur_y , dx , dy ;
int x1 , y1 , x2 , y2 , x3 , y3 , x4 , y4 ;
int * f_ind ;
int per_char = 0 ;
2000-02-28 16:52:03 +00:00
double angle , sin_a = 0 , cos_a = 0 ;
2000-02-25 06:43:51 +00:00
BBox char_bbox , str_bbox = { 0 , 0 , 0 , 0 } ;
2000-06-05 19:47:54 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
2000-02-25 06:43:51 +00:00
case 3 :
if ( zend_get_parameters_ex ( 3 , & str , & fnt , & sz ) = = FAILURE ) {
RETURN_FALSE ;
}
space = 0 ;
break ;
case 6 :
if ( zend_get_parameters_ex ( 6 , & str , & fnt , & sz , & sp , & wd , & ang ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_long_ex ( sp ) ;
convert_to_long_ex ( wd ) ;
convert_to_double_ex ( ang ) ;
2000-11-23 14:56:09 +00:00
space = Z_LVAL_PP ( sp ) ;
add_width = Z_LVAL_PP ( wd ) ;
angle = Z_DVAL_PP ( ang ) * M_PI / 180 ;
2000-02-25 06:43:51 +00:00
sin_a = sin ( angle ) ;
cos_a = cos ( angle ) ;
per_char = add_width | | angle ? 1 : 0 ;
break ;
default :
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
2000-02-25 06:43:51 +00:00
}
2000-11-29 15:25:42 +00:00
ZEND_FETCH_RESOURCE ( f_ind , int * , fnt , - 1 , " Type 1 font " , le_ps_font ) ;
2000-02-25 06:43:51 +00:00
2000-11-23 14:56:09 +00:00
convert_to_string_ex ( str ) ;
convert_to_long_ex ( sz ) ;
2000-02-25 06:43:51 +00:00
# define max(a, b) (a > b ? a : b)
# define min(a, b) (a < b ? a : b)
# define new_x(a, b) (int) ((a) * cos_a - (b) * sin_a)
# define new_y(a, b) (int) ((a) * sin_a + (b) * cos_a)
if ( per_char ) {
space + = T1_GetCharWidth ( * f_ind , ' ' ) ;
cur_x = cur_y = 0 ;
2001-09-25 21:58:48 +00:00
for ( i = 0 ; i < Z_STRLEN_PP ( str ) ; i + + ) {
if ( Z_STRVAL_PP ( str ) [ i ] = = ' ' ) {
2000-02-25 06:43:51 +00:00
char_bbox . llx = char_bbox . lly = char_bbox . ury = 0 ;
char_bbox . urx = char_width = space ;
} else {
2001-09-25 21:58:48 +00:00
char_bbox = T1_GetCharBBox ( * f_ind , Z_STRVAL_PP ( str ) [ i ] ) ;
char_width = T1_GetCharWidth ( * f_ind , Z_STRVAL_PP ( str ) [ i ] ) ;
2000-02-25 06:43:51 +00:00
}
2001-09-25 21:58:48 +00:00
amount_kern = i ? T1_GetKerning ( * f_ind , Z_STRVAL_PP ( str ) [ i - 1 ] , Z_STRVAL_PP ( str ) [ i ] ) : 0 ;
2000-02-25 06:43:51 +00:00
/* Transfer character bounding box to right place */
x1 = new_x ( char_bbox . llx , char_bbox . lly ) + cur_x ;
y1 = new_y ( char_bbox . llx , char_bbox . lly ) + cur_y ;
x2 = new_x ( char_bbox . llx , char_bbox . ury ) + cur_x ;
y2 = new_y ( char_bbox . llx , char_bbox . ury ) + cur_y ;
x3 = new_x ( char_bbox . urx , char_bbox . ury ) + cur_x ;
y3 = new_y ( char_bbox . urx , char_bbox . ury ) + cur_y ;
x4 = new_x ( char_bbox . urx , char_bbox . lly ) + cur_x ;
y4 = new_y ( char_bbox . urx , char_bbox . lly ) + cur_y ;
/* Find min & max values and compare them with current bounding box */
str_bbox . llx = min ( str_bbox . llx , min ( x1 , min ( x2 , min ( x3 , x4 ) ) ) ) ;
str_bbox . lly = min ( str_bbox . lly , min ( y1 , min ( y2 , min ( y3 , y4 ) ) ) ) ;
str_bbox . urx = max ( str_bbox . urx , max ( x1 , max ( x2 , max ( x3 , x4 ) ) ) ) ;
str_bbox . ury = max ( str_bbox . ury , max ( y1 , max ( y2 , max ( y3 , y4 ) ) ) ) ;
/* Move to the next base point */
dx = new_x ( char_width + add_width + amount_kern , 0 ) ;
dy = new_y ( char_width + add_width + amount_kern , 0 ) ;
cur_x + = dx ;
cur_y + = dy ;
/*
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 ) ;
*/
}
} else {
2001-09-25 21:58:48 +00:00
str_bbox = T1_GetStringBBox ( * f_ind , Z_STRVAL_PP ( str ) , Z_STRLEN_PP ( str ) , space , T1_KERNING ) ;
2000-02-25 06:43:51 +00:00
}
if ( T1_errno ) RETURN_FALSE ;
if ( array_init ( return_value ) = = FAILURE ) {
RETURN_FALSE ;
}
/*
printf ( " %d %d %d %d \n " , str_bbox . llx , str_bbox . lly , str_bbox . urx , str_bbox . ury ) ;
*/
2001-09-25 21:58:48 +00:00
add_next_index_long ( return_value , ( int ) ceil ( ( ( double ) str_bbox . llx ) * Z_LVAL_PP ( sz ) / 1000 ) ) ;
add_next_index_long ( return_value , ( int ) ceil ( ( ( double ) str_bbox . lly ) * Z_LVAL_PP ( sz ) / 1000 ) ) ;
add_next_index_long ( return_value , ( int ) ceil ( ( ( double ) str_bbox . urx ) * Z_LVAL_PP ( sz ) / 1000 ) ) ;
add_next_index_long ( return_value , ( int ) ceil ( ( ( double ) str_bbox . ury ) * Z_LVAL_PP ( sz ) / 1000 ) ) ;
2000-02-25 06:43:51 +00:00
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif
2000-02-25 06:43:51 +00:00
2002-06-24 19:31:44 +00:00
# ifdef HAVE_GD_WBMP
2001-01-24 09:24:26 +00:00
/* {{{ proto int image2wbmp(int im [, string filename [, int threshold]])
Output WBMP image to browser or file */
PHP_FUNCTION ( image2wbmp )
{
2001-04-01 05:42:07 +00:00
_php_image_output ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_CONVERT_WBM , " WBMP " , _php_image_bw_convert ) ;
2001-01-24 09:24:26 +00:00
}
2001-06-05 13:12:10 +00:00
/* }}} */
2002-06-24 19:31:44 +00:00
# endif /* HAVE_GD_WBMP */
2001-01-24 09:24:26 +00:00
2002-06-24 19:31:44 +00:00
# if defined(HAVE_GD_JPG) && defined(HAVE_GD_WBMP)
2002-01-02 01:25:48 +00:00
/* {{{ proto void jpeg2wbmp (string f_org, string f_dest, int d_height, int d_width, int threshold)
2001-01-27 14:20:06 +00:00
Convert JPEG image to WBMP image */
2001-01-24 09:24:26 +00:00
PHP_FUNCTION ( jpeg2wbmp )
{
_php_image_convert ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_JPG ) ;
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif
2001-01-24 09:24:26 +00:00
2002-06-24 19:31:44 +00:00
# if defined(HAVE_GD_PNG) && defined(HAVE_GD_WBMP)
2002-01-02 01:25:48 +00:00
/* {{{ proto void png2wbmp (string f_org, string f_dest, int d_height, int d_width, int threshold)
2001-01-27 14:20:06 +00:00
Convert PNG image to WBMP image */
2001-01-24 09:24:26 +00:00
PHP_FUNCTION ( png2wbmp )
{
_php_image_convert ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_GDIMG_TYPE_PNG ) ;
}
/* }}} */
2002-06-24 19:31:44 +00:00
# endif
2001-01-24 09:24:26 +00:00
2001-01-25 20:52:52 +00:00
# ifdef HAVE_GD_WBMP
2001-06-05 13:12:10 +00:00
/* {{{ _php_image_bw_convert
* It converts a gd Image to bw using a threshold value */
2001-04-01 05:42:07 +00:00
static void _php_image_bw_convert ( gdImagePtr im_org , gdIOCtx * out , int threshold )
{
2001-01-24 09:24:26 +00:00
gdImagePtr im_dest ;
int white , black ;
int color , color_org , median ;
int dest_height = gdImageSY ( im_org ) ;
int dest_width = gdImageSX ( im_org ) ;
2001-08-11 16:39:07 +00:00
int x , y ;
2001-07-30 20:27:11 +00:00
TSRMLS_FETCH ( ) ;
2001-01-24 09:24:26 +00:00
im_dest = gdImageCreate ( dest_width , dest_height ) ;
if ( im_dest = = NULL ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Unable to allocate temporary buffer " , get_active_function_name ( TSRMLS_C ) ) ;
2001-01-24 09:24:26 +00:00
return ;
}
white = gdImageColorAllocate ( im_dest , 255 , 255 , 255 ) ;
if ( white = = - 1 ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Unable to allocate the colors for the destination buffer " , get_active_function_name ( TSRMLS_C ) ) ;
2001-01-24 09:24:26 +00:00
return ;
}
black = gdImageColorAllocate ( im_dest , 0 , 0 , 0 ) ;
if ( black = = - 1 ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Unable to allocate the colors for the destination buffer " , get_active_function_name ( TSRMLS_C ) ) ;
2001-01-24 09:24:26 +00:00
return ;
}
for ( y = 0 ; y < dest_height ; y + + ) {
for ( x = 0 ; x < dest_width ; x + + ) {
color_org = gdImageGetPixel ( im_org , x , y ) ;
median = ( im_org - > red [ color_org ] + im_org - > green [ color_org ] + im_org - > blue [ color_org ] ) / 3 ;
if ( median < threshold ) {
color = black ;
}
else {
color = white ;
}
gdImageSetPixel ( im_dest , x , y , color ) ;
}
}
2001-04-01 05:42:07 +00:00
# ifdef USE_GD_IOCTX
gdImageWBMPCtx ( im_dest , black , out ) ;
# else
2001-01-24 09:24:26 +00:00
gdImageWBMP ( im_dest , black , out ) ;
2001-04-01 05:42:07 +00:00
# endif
2001-01-24 09:24:26 +00:00
2001-04-01 05:42:07 +00:00
}
2001-06-05 13:12:10 +00:00
/* }}} */
2001-01-24 09:24:26 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ _php_image_convert
* _php_image_convert converts jpeg / png images to wbmp and resizes them as needed */
2001-06-07 13:17:02 +00:00
static void _php_image_convert ( INTERNAL_FUNCTION_PARAMETERS , int image_type )
{
2001-01-24 09:24:26 +00:00
zval * * f_org , * * f_dest , * * height , * * width , * * threshold ;
gdImagePtr im_org , im_dest , im_tmp ;
char * fn_org = NULL ;
char * fn_dest = NULL ;
2001-08-11 16:39:07 +00:00
FILE * org , * dest ;
2001-01-24 09:24:26 +00:00
int argc ;
int dest_height = - 1 ;
int dest_width = - 1 ;
int org_height , org_width ;
int white , black ;
int color , color_org , median ;
int int_threshold ;
int x , y ;
float x_ratio , y_ratio ;
argc = ZEND_NUM_ARGS ( ) ;
2002-01-02 01:25:48 +00:00
if ( argc ! = 5 | | zend_get_parameters_ex ( argc , & f_org , & f_dest , & height , & width , & threshold ) = = FAILURE ) {
2001-07-30 17:29:57 +00:00
ZEND_WRONG_PARAM_COUNT ( ) ;
2001-01-24 09:24:26 +00:00
}
2002-01-02 01:25:48 +00:00
convert_to_string_ex ( f_org ) ;
convert_to_string_ex ( f_dest ) ;
fn_org = Z_STRVAL_PP ( f_org ) ;
fn_dest = Z_STRVAL_PP ( f_dest ) ;
convert_to_long_ex ( height ) ;
dest_height = Z_LVAL_PP ( height ) ;
convert_to_long_ex ( width ) ;
dest_width = Z_LVAL_PP ( width ) ;
convert_to_long_ex ( threshold ) ;
int_threshold = Z_LVAL_PP ( threshold ) ;
/* Check threshold value */
if ( int_threshold < 0 | | int_threshold > 8 ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Invalid threshold value '%d' " , get_active_function_name ( TSRMLS_C ) , int_threshold ) ;
2002-01-02 01:25:48 +00:00
RETURN_FALSE ;
}
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
/* Check origin file */
if ( ! fn_org | | fn_org = = empty_string | | php_check_open_basedir ( fn_org TSRMLS_CC ) ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Invalid origin filename '%s' " , get_active_function_name ( TSRMLS_C ) , fn_org ) ;
2002-01-02 01:25:48 +00:00
RETURN_FALSE ;
}
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
/* Check destination file */
if ( ! fn_dest | | fn_dest = = empty_string | | php_check_open_basedir ( fn_dest TSRMLS_CC ) ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Invalid destination filename '%s' " , get_active_function_name ( TSRMLS_C ) , fn_dest ) ;
2002-01-02 01:25:48 +00:00
RETURN_FALSE ;
}
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
/* Open origin file */
org = VCWD_FOPEN ( fn_org , " rb " ) ;
if ( ! org ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Unable to open '%s' for reading " , get_active_function_name ( TSRMLS_C ) , fn_org ) ;
2002-01-02 01:25:48 +00:00
RETURN_FALSE ;
}
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
/* Open destination file */
dest = VCWD_FOPEN ( fn_dest , " wb " ) ;
if ( ! dest ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Unable to open '%s' for writing " , get_active_function_name ( TSRMLS_C ) , fn_dest ) ;
2002-01-02 01:25:48 +00:00
RETURN_FALSE ;
}
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
switch ( image_type ) {
2001-08-24 20:05:58 +00:00
# ifdef HAVE_GD_GIF_READ
2002-01-02 01:25:48 +00:00
case PHP_GDIMG_TYPE_GIF :
im_org = gdImageCreateFromGif ( org ) ;
if ( im_org = = NULL ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Unable to open '%s' Not a valid GIF file " , get_active_function_name ( TSRMLS_C ) , fn_dest ) ;
2002-01-02 01:25:48 +00:00
RETURN_FALSE ;
}
break ;
2001-08-24 20:05:58 +00:00
# endif /* HAVE_GD_GIF_READ */
2001-02-09 21:14:30 +00:00
# ifdef HAVE_GD_JPG
2002-01-02 01:25:48 +00:00
case PHP_GDIMG_TYPE_JPG :
im_org = gdImageCreateFromJpeg ( org ) ;
if ( im_org = = NULL ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Unable to open '%s' Not a valid JPEG file " , get_active_function_name ( TSRMLS_C ) , fn_dest ) ;
2002-01-02 01:25:48 +00:00
RETURN_FALSE ;
}
break ;
2001-02-09 21:14:30 +00:00
# endif /* HAVE_GD_JPG */
# ifdef HAVE_GD_PNG
2002-01-02 01:25:48 +00:00
case PHP_GDIMG_TYPE_PNG :
im_org = gdImageCreateFromPng ( org ) ;
if ( im_org = = NULL ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Unable to open '%s' Not a valid PNG file " , get_active_function_name ( TSRMLS_C ) , fn_dest ) ;
2002-01-02 01:25:48 +00:00
RETURN_FALSE ;
}
break ;
2001-02-09 21:14:30 +00:00
# endif /* HAVE_GD_PNG */
2002-01-02 01:25:48 +00:00
default :
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Format not supported " , get_active_function_name ( TSRMLS_C ) ) ;
2002-01-02 01:25:48 +00:00
RETURN_FALSE ;
break ;
}
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
org_width = gdImageSX ( im_org ) ;
org_height = gdImageSY ( im_org ) ;
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
x_ratio = ( float ) org_width / ( float ) dest_width ;
y_ratio = ( float ) org_height / ( float ) dest_height ;
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
if ( x_ratio > 1 & & y_ratio > 1 ) {
if ( y_ratio > x_ratio ) {
x_ratio = y_ratio ;
2001-01-24 09:24:26 +00:00
}
else {
2002-01-02 01:25:48 +00:00
y_ratio = x_ratio ;
2001-01-24 09:24:26 +00:00
}
2002-01-02 01:25:48 +00:00
dest_width = ( int ) ( org_width / x_ratio ) ;
dest_height = ( int ) ( org_height / y_ratio ) ;
}
else {
x_ratio = ( float ) dest_width / ( float ) org_width ;
y_ratio = ( float ) dest_height / ( float ) org_height ;
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
if ( y_ratio < x_ratio ) {
x_ratio = y_ratio ;
2001-01-24 09:24:26 +00:00
}
2002-01-02 01:25:48 +00:00
else {
y_ratio = x_ratio ;
}
dest_width = ( int ) ( org_width * x_ratio ) ;
dest_height = ( int ) ( org_height * y_ratio ) ;
}
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
im_tmp = gdImageCreate ( dest_width , dest_height ) ;
if ( im_tmp = = NULL ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Unable to allocate temporary buffer " , get_active_function_name ( TSRMLS_C ) ) ;
2002-01-02 01:25:48 +00:00
RETURN_FALSE ;
}
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
gdImageCopyResized ( im_tmp , im_org , 0 , 0 , 0 , 0 , dest_width , dest_height , org_width , org_height ) ;
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
gdImageDestroy ( im_org ) ;
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
fclose ( org ) ;
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
im_dest = gdImageCreate ( dest_width , dest_height ) ;
if ( im_dest = = NULL ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Unable to allocate destination buffer " , get_active_function_name ( TSRMLS_C ) ) ;
2002-01-02 01:25:48 +00:00
RETURN_FALSE ;
}
white = gdImageColorAllocate ( im_dest , 255 , 255 , 255 ) ;
if ( white = = - 1 ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Unable to allocate the colors for the destination buffer " , get_active_function_name ( TSRMLS_C ) ) ;
2002-01-02 01:25:48 +00:00
RETURN_FALSE ;
}
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
black = gdImageColorAllocate ( im_dest , 0 , 0 , 0 ) ;
if ( black = = - 1 ) {
2002-06-28 06:43:17 +00:00
php_error ( E_WARNING , " %s(): Unable to allocate the colors for the destination buffer " , get_active_function_name ( TSRMLS_C ) ) ;
2002-01-02 01:25:48 +00:00
RETURN_FALSE ;
}
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
int_threshold = int_threshold * 32 ;
for ( y = 0 ; y < dest_height ; y + + ) {
for ( x = 0 ; x < dest_width ; x + + ) {
color_org = gdImageGetPixel ( im_tmp , x , y ) ;
median = ( im_tmp - > red [ color_org ] + im_tmp - > green [ color_org ] + im_tmp - > blue [ color_org ] ) / 3 ;
if ( median < int_threshold ) {
color = black ;
}
else {
color = white ;
2001-01-24 09:24:26 +00:00
}
2002-01-02 01:25:48 +00:00
gdImageSetPixel ( im_dest , x , y , color ) ;
2001-01-24 09:24:26 +00:00
}
2002-01-02 01:25:48 +00:00
}
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
gdImageDestroy ( im_tmp ) ;
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
gdImageWBMP ( im_dest , black , dest ) ;
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
fflush ( dest ) ;
fclose ( dest ) ;
2001-01-24 09:24:26 +00:00
2002-01-02 01:25:48 +00:00
gdImageDestroy ( im_dest ) ;
RETURN_TRUE ;
2001-01-24 09:24:26 +00:00
}
2001-06-05 13:12:10 +00:00
/* }}} */
2001-01-25 20:52:52 +00:00
# endif /* HAVE_GD_WBMP */
2001-01-24 09:24:26 +00:00
# endif /* HAVE_LIBGD */
1999-04-16 12:15:38 +00:00
/*
* Local variables :
* tab - width : 4
* c - basic - offset : 4
* End :
2001-09-09 13:29:31 +00:00
* vim600 : sw = 4 ts = 4 fdm = marker
* vim < 600 : sw = 4 ts = 4
1999-04-16 12:15:38 +00:00
*/