@ -58,7 +58,6 @@
# include "libgd / gd_compat.h"
# endif
static int le_gd , le_gd_font ;
# if HAVE_LIBT1
# include <t1lib.h>
@ -195,6 +194,10 @@ ZEND_BEGIN_ARG_INFO(arginfo_imagetruecolortopalette, 0)
ZEND_ARG_INFO ( 0 , colorsWanted )
ZEND_END_ARG_INFO ( )
ZEND_BEGIN_ARG_INFO ( arginfo_imagepalettetotruecolor , 0 )
ZEND_ARG_INFO ( 0 , im )
ZEND_END_ARG_INFO ( )
ZEND_BEGIN_ARG_INFO ( arginfo_imagecolormatch , 0 )
ZEND_ARG_INFO ( 0 , im1 )
ZEND_ARG_INFO ( 0 , im2 )
@ -902,6 +905,24 @@ ZEND_BEGIN_ARG_INFO(arginfo_imagecropauto, 0)
ZEND_ARG_INFO ( 0 , threshold )
ZEND_ARG_INFO ( 0 , color )
ZEND_END_ARG_INFO ( )
ZEND_BEGIN_ARG_INFO ( arginfo_imagescale , 0 )
ZEND_ARG_INFO ( 0 , im )
ZEND_ARG_INFO ( 0 , new_width )
ZEND_ARG_INFO ( 0 , new_height )
ZEND_ARG_INFO ( 0 , mode )
ZEND_END_ARG_INFO ( )
ZEND_BEGIN_ARG_INFO ( arginfo_imageaffine , 0 )
ZEND_ARG_INFO ( 0 , im )
ZEND_ARG_INFO ( 0 , affine )
ZEND_END_ARG_INFO ( )
ZEND_BEGIN_ARG_INFO ( arginfo_imagesetinterpolation , 0 )
ZEND_ARG_INFO ( 0 , im )
ZEND_ARG_INFO ( 0 , method )
ZEND_END_ARG_INFO ( )
# endif
/* }}} */
@ -941,6 +962,7 @@ const zend_function_entry gd_functions[] = {
PHP_FE ( imagecreatetruecolor , arginfo_imagecreatetruecolor )
PHP_FE ( imageistruecolor , arginfo_imageistruecolor )
PHP_FE ( imagetruecolortopalette , arginfo_imagetruecolortopalette )
PHP_FE ( imagepalettetotruecolor , arginfo_imagepalettetotruecolor )
PHP_FE ( imagesetthickness , arginfo_imagesetthickness )
PHP_FE ( imagefilledarc , arginfo_imagefilledarc )
PHP_FE ( imagefilledellipse , arginfo_imagefilledellipse )
@ -964,6 +986,9 @@ const zend_function_entry gd_functions[] = {
PHP_FE ( imageflip , arginfo_imageflip )
PHP_FE ( imagecrop , arginfo_imagecrop )
PHP_FE ( imagecropauto , arginfo_imagecropauto )
PHP_FE ( imagescale , arginfo_imagescale )
PHP_FE ( imageaffine , arginfo_imageaffine )
PHP_FE ( imagesetinterpolation , arginfo_imagesetinterpolation )
# endif
# if HAVE_GD_IMAGESETTILE
@ -1218,13 +1243,37 @@ PHP_MINIT_FUNCTION(gd)
REGISTER_LONG_CONSTANT ( " IMG_FLIP_HORIZONTAL " , GD_FLIP_HORINZONTAL , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_FLIP_VERTICAL " , GD_FLIP_VERTICAL , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_FLIP_BOTH " , GD_FLIP_BOTH , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_CROP_DEFAULT " , GD_CROP_DEFAULT , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_CROP_TRANSPARENT " , GD_CROP_TRANSPARENT , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_CROP_BLACK " , GD_CROP_BLACK , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_CROP_WHITE " , GD_CROP_WHITE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_CROP_SIDES " , GD_CROP_SIDES , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_CROP_THRESHOLD " , GD_CROP_THRESHOLD , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_BELL " , GD_BILINEAR_FIXED , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_BESSEL " , GD_BESSEL , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_BILINEAR_FIXED " , GD_BILINEAR_FIXED , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_BICUBIC " , GD_BICUBIC , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_BICUBIC_FIXED " , GD_BICUBIC_FIXED , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_BLACKMAN " , GD_BLACKMAN , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_BOX " , GD_BOX , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_BSPLINE " , GD_BSPLINE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_CATMULLROM " , GD_CATMULLROM , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_GAUSSIAN " , GD_GAUSSIAN , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_GENERALIZED_CUBIC " , GD_GENERALIZED_CUBIC , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_HERMITE " , GD_HERMITE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_HAMMING " , GD_HAMMING , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_HANNING " , GD_HANNING , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_MITCHELL " , GD_MITCHELL , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_POWER " , GD_POWER , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_QUADRATIC " , GD_QUADRATIC , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_SINC " , GD_SINC , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_NEAREST_NEIGHBOUR " , GD_NEAREST_NEIGHBOUR , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_WEIGHTED4 " , GD_WEIGHTED4 , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_TRIANGLE " , GD_TRIANGLE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " IMG_DEFAULT " , GD_BICUBIC_FIXED , CONST_CS | CONST_PERSISTENT ) ;
# else
REGISTER_LONG_CONSTANT ( " GD_BUNDLED " , 0 , CONST_CS | CONST_PERSISTENT ) ;
# endif
@ -1730,6 +1779,29 @@ PHP_FUNCTION(imagetruecolortopalette)
}
/* }}} */
/* {{{ proto void imagetruecolortopalette(resource im, bool ditherFlag, int colorsWanted)
Convert a true colour image to a palette based image with a number of colours , optionally using dithering . */
PHP_FUNCTION ( imagepalettetotruecolor )
{
zval * IM ;
gdImagePtr im ;
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " r " , & IM ) = = FAILURE ) {
return ;
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , & IM , - 1 , " Image " , le_gd ) ;
if ( gdImagePaletteToTrueColor ( im ) = = 0 ) {
RETURN_TRUE ;
}
RETURN_TRUE ;
}
/* }}} */
/* {{{ proto bool imagecolormatch(resource im1, resource im2)
Makes the colors of the palette version of an image more closely match the true color version */
PHP_FUNCTION ( imagecolormatch )
@ -2172,7 +2244,7 @@ PHP_FUNCTION(imagerotate)
ZEND_FETCH_RESOURCE ( im_src , gdImagePtr , & SIM , - 1 , " Image " , le_gd ) ;
im_dst = gdImageRotate ( im_src , degrees , color , ignoretransparent ) ;
im_dst = gdImageRotateGeneric ( im_src , ( float ) degrees , color ) ;
if ( im_dst ! = NULL ) {
ZEND_REGISTER_RESOURCE ( return_value , im_dst , le_gd ) ;
@ -5127,11 +5199,11 @@ PHP_FUNCTION(imageflip)
switch ( mode ) {
case GD_FLIP_VERTICAL :
gdImageFlipHorizont al ( im ) ;
gdImageFlipVertic al ( im ) ;
break ;
case GD_FLIP_HORINZONTAL :
gdImageFlipVertic al ( im ) ;
gdImageFlipHorizont al ( im ) ;
break ;
case GD_FLIP_BOTH :
@ -5252,6 +5324,178 @@ PHP_FUNCTION(imagecropauto)
}
}
/* }}} */
/* {{{ proto resource imagescale(resource im, new_width[, new_height[, method]])
Crop an image using the given coordinates and size , x , y , width and height . */
PHP_FUNCTION ( imagescale )
{
zval * IM ;
long mode = - 1 ;
long color = - 1 ;
double threshold = 0.5f ;
gdImagePtr im ;
gdImagePtr im_scaled ;
int new_width , new_height = - 1 ;
gdInterpolationMethod method = GD_BILINEAR_FIXED ;
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " rl|ll " , & IM , & new_width , & new_height , & method ) = = FAILURE ) {
return ;
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , & IM , - 1 , " Image " , le_gd ) ;
im_scaled = gdImageScale ( im , new_width , new_height ) ;
goto finish ;
switch ( method ) {
case GD_NEAREST_NEIGHBOUR :
im_scaled = gdImageScaleNearestNeighbour ( im , new_width , new_height ) ;
break ;
case GD_BILINEAR_FIXED :
im_scaled = gdImageScaleBilinear ( im , new_width , new_height ) ;
break ;
case GD_BICUBIC :
im_scaled = gdImageScaleBicubicFixed ( im , new_width , new_height ) ;
break ;
case GD_BICUBIC_FIXED :
im_scaled = gdImageScaleBicubicFixed ( im , new_width , new_height ) ;
break ;
default :
im_scaled = gdImageScaleTwoPass ( im , im - > sx , im - > sy , new_width , new_height ) ;
break ;
}
finish :
if ( im_scaled = = NULL ) {
RETURN_FALSE ;
} else {
ZEND_REGISTER_RESOURCE ( return_value , im_scaled , le_gd ) ;
}
}
/* }}} */
/* {{{ proto resource imageaffine(resource dst, resource src, array affine, array clip)
Return an image containing the affine tramsformed src image , using an optional clipping area */
PHP_FUNCTION ( imageaffine )
{
zval * IM ;
long mode = - 1 ;
long color = - 1 ;
double threshold = 0.5f ;
gdImagePtr src ;
gdImagePtr dst ;
gdRect rect ;
gdRectPtr pRect = NULL ;
zval * z_rect = NULL ;
zval * z_affine ;
zval * * tmp ;
double affine [ 6 ] ;
int i , nelems ;
zval * * zval_affine_elem = NULL ;
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " ra|a " , & IM , & z_affine , & z_rect ) = = FAILURE ) {
return ;
}
ZEND_FETCH_RESOURCE ( src , gdImagePtr , & IM , - 1 , " Image " , le_gd ) ;
if ( ( nelems = zend_hash_num_elements ( Z_ARRVAL_P ( z_affine ) ) ) ! = 6 ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Affine array must have six elements " ) ;
RETURN_FALSE ;
}
for ( i = 0 ; i < nelems ; i + + ) {
if ( zend_hash_index_find ( Z_ARRVAL_P ( z_affine ) , i , ( void * * ) & zval_affine_elem ) = = SUCCESS ) {
switch ( Z_TYPE_PP ( zval_affine_elem ) ) {
case IS_LONG :
affine [ i ] = Z_LVAL_PP ( zval_affine_elem ) ;
break ;
case IS_DOUBLE :
affine [ i ] = Z_DVAL_PP ( zval_affine_elem ) ;
break ;
case IS_STRING :
convert_to_double_ex ( zval_affine_elem ) ;
affine [ i ] = Z_DVAL_PP ( zval_affine_elem ) ;
break ;
default :
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Invalid type for element %i " , i ) ;
RETURN_FALSE ;
}
}
}
if ( z_rect ! = NULL ) {
if ( zend_hash_find ( HASH_OF ( z_rect ) , " x " , sizeof ( " x " ) , ( void * * ) & tmp ) ! = FAILURE ) {
rect . x = Z_LVAL_PP ( tmp ) ;
} else {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Missing x position " ) ;
RETURN_FALSE ;
}
if ( zend_hash_find ( HASH_OF ( z_rect ) , " y " , sizeof ( " x " ) , ( void * * ) & tmp ) ! = FAILURE ) {
rect . y = Z_LVAL_PP ( tmp ) ;
} else {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Missing y position " ) ;
RETURN_FALSE ;
}
if ( zend_hash_find ( HASH_OF ( z_rect ) , " width " , sizeof ( " width " ) , ( void * * ) & tmp ) ! = FAILURE ) {
rect . width = Z_LVAL_PP ( tmp ) ;
} else {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Missing width " ) ;
RETURN_FALSE ;
}
if ( zend_hash_find ( HASH_OF ( z_rect ) , " height " , sizeof ( " height " ) , ( void * * ) & tmp ) ! = FAILURE ) {
rect . height = Z_LVAL_PP ( tmp ) ;
} else {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Missing height " ) ;
RETURN_FALSE ;
}
pRect = & rect ;
} else {
rect . x = - 1 ;
rect . y = - 1 ;
rect . width = gdImageSX ( src ) ;
rect . height = gdImageSY ( src ) ;
pRect = NULL ;
}
/ / int gdTransformAffineGetImage ( gdImagePtr * dst , const gdImagePtr src , gdRectPtr src_area , const double affine [ 6 ] ) ;
if ( gdTransformAffineGetImage ( & dst , src , pRect , affine ) ! = GD_TRUE ) {
RETURN_FALSE ;
}
if ( dst = = NULL ) {
RETURN_FALSE ;
} else {
ZEND_REGISTER_RESOURCE ( return_value , dst , le_gd ) ;
}
}
/* }}} */
/* {{{ proto resource imagesetinterpolation(resource im, [, method]])
Set the default interpolation method , passing - 1 or 0 sets it to the libgd default ( bilinear ) . */
PHP_FUNCTION ( imagesetinterpolation )
{
zval * IM ;
gdImagePtr im ;
gdInterpolationMethod method = GD_BILINEAR_FIXED ;
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " r|l " , & IM , & method ) = = FAILURE ) {
return ;
}
ZEND_FETCH_RESOURCE ( im , gdImagePtr , & IM , - 1 , " Image " , le_gd ) ;
if ( method = = - 1 ) {
method = GD_BILINEAR_FIXED ;
}
RETURN_BOOL ( gdImageSetInterpolationMethod ( im , ( gdInterpolationMethod ) method ) ) ;
}
/* }}} */
# endif