@@ -890,6 +890,18 @@ ZEND_BEGIN_ARG_INFO(arginfo_imageflip, 0)
890
890
ZEND_ARG_INFO (0 , im )
891
891
ZEND_ARG_INFO (0 , mode )
892
892
ZEND_END_ARG_INFO ()
893
+
894
+ ZEND_BEGIN_ARG_INFO (arginfo_imagecrop , 0 )
895
+ ZEND_ARG_INFO (0 , im )
896
+ ZEND_ARG_INFO (0 , rect )
897
+ ZEND_END_ARG_INFO ()
898
+
899
+ ZEND_BEGIN_ARG_INFO (arginfo_imagecropauto , 0 )
900
+ ZEND_ARG_INFO (0 , im )
901
+ ZEND_ARG_INFO (0 , mode )
902
+ ZEND_ARG_INFO (0 , threshold )
903
+ ZEND_ARG_INFO (0 , color )
904
+ ZEND_END_ARG_INFO ()
893
905
#endif
894
906
895
907
/* }}} */
@@ -950,6 +962,8 @@ const zend_function_entry gd_functions[] = {
950
962
#ifdef HAVE_GD_BUNDLED
951
963
PHP_FE (imageantialias , arginfo_imageantialias )
952
964
PHP_FE (imageflip , arginfo_imageflip )
965
+ PHP_FE (imagecrop , arginfo_imagecrop )
966
+ PHP_FE (imagecropauto , arginfo_imagecropauto )
953
967
#endif
954
968
955
969
#if HAVE_GD_IMAGESETTILE
@@ -1204,6 +1218,13 @@ PHP_MINIT_FUNCTION(gd)
1204
1218
REGISTER_LONG_CONSTANT ("IMG_FLIP_HORIZONTAL" , GD_FLIP_HORINZONTAL , CONST_CS | CONST_PERSISTENT );
1205
1219
REGISTER_LONG_CONSTANT ("IMG_FLIP_VERTICAL" , GD_FLIP_VERTICAL , CONST_CS | CONST_PERSISTENT );
1206
1220
REGISTER_LONG_CONSTANT ("IMG_FLIP_BOTH" , GD_FLIP_BOTH , CONST_CS | CONST_PERSISTENT );
1221
+
1222
+ REGISTER_LONG_CONSTANT ("IMG_CROP_DEFAULT" , GD_CROP_DEFAULT , CONST_CS | CONST_PERSISTENT );
1223
+ REGISTER_LONG_CONSTANT ("IMG_CROP_TRANSPARENT" , GD_CROP_TRANSPARENT , CONST_CS | CONST_PERSISTENT );
1224
+ REGISTER_LONG_CONSTANT ("IMG_CROP_BLACK" , GD_CROP_BLACK , CONST_CS | CONST_PERSISTENT );
1225
+ REGISTER_LONG_CONSTANT ("IMG_CROP_WHITE" , GD_CROP_WHITE , CONST_CS | CONST_PERSISTENT );
1226
+ REGISTER_LONG_CONSTANT ("IMG_CROP_SIDES" , GD_CROP_SIDES , CONST_CS | CONST_PERSISTENT );
1227
+ REGISTER_LONG_CONSTANT ("IMG_CROP_THRESHOLD" , GD_CROP_THRESHOLD , CONST_CS | CONST_PERSISTENT );
1207
1228
#else
1208
1229
REGISTER_LONG_CONSTANT ("GD_BUNDLED" , 0 , CONST_CS | CONST_PERSISTENT );
1209
1230
#endif
@@ -5125,6 +5146,112 @@ PHP_FUNCTION(imageflip)
5125
5146
RETURN_TRUE ;
5126
5147
}
5127
5148
/* }}} */
5149
+
5150
+ /* {{{ proto void imagecrop(resource im, array rect)
5151
+ Crop an image using the given coordinates and size, x, y, width and height. */
5152
+ PHP_FUNCTION (imagecrop )
5153
+ {
5154
+ zval * IM ;
5155
+ long mode = -1 ;
5156
+ long color = -1 ;
5157
+ double threshold = 0.5f ;
5158
+ gdImagePtr im ;
5159
+ gdImagePtr im_crop ;
5160
+ gdRect rect ;
5161
+ zval * z_rect ;
5162
+ zval * * tmp ;
5163
+
5164
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "r|a" , & IM , & z_rect ) == FAILURE ) {
5165
+ return ;
5166
+ }
5167
+
5168
+ ZEND_FETCH_RESOURCE (im , gdImagePtr , & IM , -1 , "Image" , le_gd );
5169
+
5170
+ if (zend_hash_find (HASH_OF (z_rect ), "x" , sizeof ("x" ), (void * * )& tmp ) != FAILURE ) {
5171
+ rect .x = Z_LVAL_PP (tmp );
5172
+ } else {
5173
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Missing x position ");
5174
+ RETURN_FALSE ;
5175
+ }
5176
+
5177
+ if (zend_hash_find (HASH_OF (z_rect ), "y" , sizeof ("x" ), (void * * )& tmp ) != FAILURE ) {
5178
+ rect .y = Z_LVAL_PP (tmp );
5179
+ } else {
5180
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Missing y position ");
5181
+ RETURN_FALSE ;
5182
+ }
5183
+
5184
+ if (zend_hash_find (HASH_OF (z_rect ), "width" , sizeof ("width" ), (void * * )& tmp ) != FAILURE ) {
5185
+ rect .width = Z_LVAL_PP (tmp );
5186
+ } else {
5187
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Missing width ");
5188
+ RETURN_FALSE ;
5189
+ }
5190
+
5191
+ if (zend_hash_find (HASH_OF (z_rect ), "height" , sizeof ("height" ), (void * * )& tmp ) != FAILURE ) {
5192
+ rect .height = Z_LVAL_PP (tmp );
5193
+ } else {
5194
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Missing height ");
5195
+ RETURN_FALSE ;
5196
+ }
5197
+
5198
+ im_crop = gdImageCrop (im , & rect );
5199
+
5200
+ if (im_crop == NULL ) {
5201
+ RETURN_FALSE ;
5202
+ } else {
5203
+ ZEND_REGISTER_RESOURCE (return_value , im_crop , le_gd );
5204
+ }
5205
+ }
5206
+ /* }}} */
5207
+
5208
+ /* {{{ proto void imagecropauto(resource im [, int mode [, threshold [, color]]])
5209
+ Crop an image automatically using one of the available modes. */
5210
+ PHP_FUNCTION (imagecropauto )
5211
+ {
5212
+ zval * IM ;
5213
+ long mode = -1 ;
5214
+ long color = -1 ;
5215
+ double threshold = 0.5f ;
5216
+ gdImagePtr im ;
5217
+ gdImagePtr im_crop ;
5218
+
5219
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "r|ldl" , & IM , & mode , & threshold , & color ) == FAILURE ) {
5220
+ return ;
5221
+ }
5222
+
5223
+ ZEND_FETCH_RESOURCE (im , gdImagePtr , & IM , -1 , "Image" , le_gd );
5224
+
5225
+ switch (mode ) {
5226
+ case -1 :
5227
+ mode = GD_CROP_DEFAULT ;
5228
+ case GD_CROP_DEFAULT :
5229
+ case GD_CROP_TRANSPARENT :
5230
+ case GD_CROP_BLACK :
5231
+ case GD_CROP_WHITE :
5232
+ case GD_CROP_SIDES :
5233
+ im_crop = gdImageCropAuto (im , mode );
5234
+ break ;
5235
+
5236
+ case GD_CROP_THRESHOLD :
5237
+ if (color < 0 ) {
5238
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Color argument missing with threshold mode" );
5239
+ RETURN_FALSE ;
5240
+ }
5241
+ im_crop = gdImageCropThreshold (im , color , (float ) threshold );
5242
+ break ;
5243
+
5244
+ default :
5245
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Unknown flip mode ");
5246
+ RETURN_FALSE ;
5247
+ }
5248
+ if (im_crop == NULL ) {
5249
+ RETURN_FALSE ;
5250
+ } else {
5251
+ ZEND_REGISTER_RESOURCE (return_value , im_crop , le_gd );
5252
+ }
5253
+ }
5254
+ /* }}} */
5128
5255
#endif
5129
5256
5130
5257
0 commit comments