Skip to content

Commit 3e0e64f

Browse files
committed
Merge branch 'PHP-5.5'
* PHP-5.5: - add test for imagecropauto - (s)rgb distance works way better for now, re enable threshold - disable threshold for now, will enable it again using CIEDE2000 - add todo for threshold - clean and enable threshold - add image crop support Conflicts: UPGRADING
2 parents 02a1589 + 2024ff3 commit 3e0e64f

File tree

10 files changed

+651
-2
lines changed

10 files changed

+651
-2
lines changed

UPGRADING

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,28 @@ PHP X.Y UPGRADE NOTES
6868
9. New Global Constants
6969
========================================
7070

71+
<<<<<<< HEAD
72+
=======
73+
- mysqli:
74+
- Added MYSQLI_SERVER_PUBLIC_KEY constant to be used with mysqli_options()
75+
76+
- cURL:
77+
- Added CURLOPT_SAFE_UPLOAD to be used with curl_setopt().
78+
79+
- GD
80+
- Added constants for imageflip:
81+
. IMG_FLIP_HORIZONTAL
82+
. IMG_FLIP_VERTICAL
83+
. IMG_FLIP_BOTH
84+
- Added constants for imagecrop
85+
. IMG_CROP_DEFAULT
86+
. IMG_CROP_TRANSPARENT
87+
. IMG_CROP_BLACK
88+
. IMG_CROP_WHITE
89+
. IMG_CROP_SIDES
90+
. IMG_CROP_THRESHOLD
91+
92+
>>>>>>> PHP-5.5
7193
========================================
7294
10. Changes to INI File Handling
7395
========================================

ext/gd/config.m4

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,8 @@ if test "$PHP_GD" = "yes"; then
297297
libgd/gdfontmb.c libgd/gdfontl.c libgd/gdfontg.c libgd/gdtables.c libgd/gdft.c \
298298
libgd/gdcache.c libgd/gdkanji.c libgd/wbmp.c libgd/gd_wbmp.c libgd/gdhelpers.c \
299299
libgd/gd_topal.c libgd/gd_gif_in.c libgd/xbm.c libgd/gd_gif_out.c libgd/gd_security.c \
300-
libgd/gd_filter.c libgd/gd_pixelate.c libgd/gd_arc.c libgd/gd_rotate.c libgd/gd_color.c libgd/gd_transform.c"
300+
libgd/gd_filter.c libgd/gd_pixelate.c libgd/gd_arc.c libgd/gd_rotate.c libgd/gd_color.c \
301+
libgd/gd_transform.c libgd/gd_crop.c"
301302

302303
dnl check for fabsf and floorf which are available since C99
303304
AC_CHECK_FUNCS(fabsf floorf)

ext/gd/config.w32

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ if (PHP_GD != "no") {
4747
gdft.c gd_gd2.c gd_gd.c gd_gif_in.c gd_gif_out.c gdhelpers.c gd_io.c gd_io_dp.c \
4848
gd_io_file.c gd_io_ss.c gd_jpeg.c gdkanji.c gd_png.c gd_ss.c \
4949
gdtables.c gd_topal.c gd_wbmp.c gdxpm.c wbmp.c xbm.c gd_security.c gd_transform.c \
50-
gd_filter.c gd_pixelate.c gd_arc.c gd_rotate.c gd_color.c webpimg.c gd_webp.c", "gd");
50+
gd_filter.c gd_pixelate.c gd_arc.c gd_rotate.c gd_color.c webpimg.c gd_webp.c \
51+
gd_crop.c", "gd");
5152
AC_DEFINE('HAVE_LIBGD', 1, 'GD support');
5253
ADD_FLAG("CFLAGS_GD", " \
5354
/D HAVE_GD_DYNAMIC_CTX_EX=1 \

ext/gd/gd.c

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,18 @@ ZEND_BEGIN_ARG_INFO(arginfo_imageflip, 0)
890890
ZEND_ARG_INFO(0, im)
891891
ZEND_ARG_INFO(0, mode)
892892
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()
893905
#endif
894906

895907
/* }}} */
@@ -950,6 +962,8 @@ const zend_function_entry gd_functions[] = {
950962
#ifdef HAVE_GD_BUNDLED
951963
PHP_FE(imageantialias, arginfo_imageantialias)
952964
PHP_FE(imageflip, arginfo_imageflip)
965+
PHP_FE(imagecrop, arginfo_imagecrop)
966+
PHP_FE(imagecropauto, arginfo_imagecropauto)
953967
#endif
954968

955969
#if HAVE_GD_IMAGESETTILE
@@ -1204,6 +1218,13 @@ PHP_MINIT_FUNCTION(gd)
12041218
REGISTER_LONG_CONSTANT("IMG_FLIP_HORIZONTAL", GD_FLIP_HORINZONTAL, CONST_CS | CONST_PERSISTENT);
12051219
REGISTER_LONG_CONSTANT("IMG_FLIP_VERTICAL", GD_FLIP_VERTICAL, CONST_CS | CONST_PERSISTENT);
12061220
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);
12071228
#else
12081229
REGISTER_LONG_CONSTANT("GD_BUNDLED", 0, CONST_CS | CONST_PERSISTENT);
12091230
#endif
@@ -5125,6 +5146,112 @@ PHP_FUNCTION(imageflip)
51255146
RETURN_TRUE;
51265147
}
51275148
/* }}} */
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+
/* }}} */
51285255
#endif
51295256

51305257

ext/gd/gdcache.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ gdCacheGet( gdCache_head_t *head, void *keydata )
9595
void *userdata;
9696

9797
elem = head->mru;
98+
if (elem == NULL) {
99+
return NULL;
100+
101+
}
102+
98103
while(elem) {
99104
if ((*(head->gdCacheTest))(elem->userdata, keydata)) {
100105
if (i) { /* if not already most-recently-used */

ext/gd/libgd/gd.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,31 @@ typedef struct {
209209
/* Text functions take these. */
210210
typedef gdFont *gdFontPtr;
211211

212+
213+
/**
214+
* Group: Types
215+
*
216+
* typedef: gdRect
217+
* Defines a rectilinear region.
218+
*
219+
* x - left position
220+
* y - right position
221+
* width - Rectangle width
222+
* height - Rectangle height
223+
*
224+
* typedef: gdRectPtr
225+
* Pointer to a <gdRect>
226+
*
227+
* See also:
228+
* <gdSetInterpolationMethod>
229+
**/
230+
typedef struct
231+
{
232+
int x, y;
233+
int width, height;
234+
}
235+
gdRect, *gdRectPtr;
236+
212237
/* For backwards compatibility only. Use gdImageSetStyle()
213238
for MUCH more flexible line drawing. Also see
214239
gdImageSetBrush(). */
@@ -690,6 +715,32 @@ void gdImageFlipBoth(gdImagePtr im);
690715
#define GD_FLIP_VERTICAL 2
691716
#define GD_FLIP_BOTH 3
692717

718+
/**
719+
* Group: Crop
720+
*
721+
* Constants: gdCropMode
722+
* GD_CROP_DEFAULT - Default crop mode (4 corners or background)
723+
* GD_CROP_TRANSPARENT - Crop using the transparent color
724+
* GD_CROP_BLACK - Crop black borders
725+
* GD_CROP_WHITE - Crop white borders
726+
* GD_CROP_SIDES - Crop using colors of the 4 corners
727+
*
728+
* See also:
729+
* <gdImageAutoCrop>
730+
**/
731+
enum gdCropMode {
732+
GD_CROP_DEFAULT = 0,
733+
GD_CROP_TRANSPARENT,
734+
GD_CROP_BLACK,
735+
GD_CROP_WHITE,
736+
GD_CROP_SIDES,
737+
GD_CROP_THRESHOLD
738+
};
739+
740+
gdImagePtr gdImageCrop(gdImagePtr src, const gdRectPtr crop);
741+
gdImagePtr gdImageCropAuto(gdImagePtr im, const unsigned int mode);
742+
gdImagePtr gdImageCropThreshold(gdImagePtr im, const unsigned int color, const float threshold);
743+
693744
#define GD_CMP_IMAGE 1 /* Actual image IS different */
694745
#define GD_CMP_NUM_COLORS 2 /* Number of Colours in pallette differ */
695746
#define GD_CMP_COLOR 4 /* Image colours differ */

0 commit comments

Comments
 (0)