Skip to content

Commit a991360

Browse files
committed
- add image crop support
1 parent 82765a0 commit a991360

File tree

8 files changed

+467
-2
lines changed

8 files changed

+467
-2
lines changed

ext/gd/config.m4

+2-1
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

+2-1
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

+50
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,11 @@ 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_imagecropauto, 0)
895+
ZEND_ARG_INFO(0, im)
896+
ZEND_ARG_INFO(0, mode)
897+
ZEND_END_ARG_INFO()
893898
#endif
894899

895900
/* }}} */
@@ -950,6 +955,7 @@ const zend_function_entry gd_functions[] = {
950955
#ifdef HAVE_GD_BUNDLED
951956
PHP_FE(imageantialias, arginfo_imageantialias)
952957
PHP_FE(imageflip, arginfo_imageflip)
958+
PHP_FE(imagecropauto, arginfo_imagecropauto)
953959
#endif
954960

955961
#if HAVE_GD_IMAGESETTILE
@@ -1204,6 +1210,12 @@ PHP_MINIT_FUNCTION(gd)
12041210
REGISTER_LONG_CONSTANT("IMG_FLIP_HORIZONTAL", GD_FLIP_HORINZONTAL, CONST_CS | CONST_PERSISTENT);
12051211
REGISTER_LONG_CONSTANT("IMG_FLIP_VERTICAL", GD_FLIP_VERTICAL, CONST_CS | CONST_PERSISTENT);
12061212
REGISTER_LONG_CONSTANT("IMG_FLIP_BOTH", GD_FLIP_BOTH, CONST_CS | CONST_PERSISTENT);
1213+
1214+
REGISTER_LONG_CONSTANT("IMG_CROP_DEFAULT", GD_CROP_DEFAULT, CONST_CS | CONST_PERSISTENT);
1215+
REGISTER_LONG_CONSTANT("IMG_CROP_TRANSPARENT", GD_CROP_TRANSPARENT, CONST_CS | CONST_PERSISTENT);
1216+
REGISTER_LONG_CONSTANT("IMG_CROP_BLACK", GD_CROP_BLACK, CONST_CS | CONST_PERSISTENT);
1217+
REGISTER_LONG_CONSTANT("IMG_CROP_WHITE", GD_CROP_WHITE, CONST_CS | CONST_PERSISTENT);
1218+
REGISTER_LONG_CONSTANT("IMG_CROP_SIDES", GD_CROP_SIDES, CONST_CS | CONST_PERSISTENT);
12071219
#else
12081220
REGISTER_LONG_CONSTANT("GD_BUNDLED", 0, CONST_CS | CONST_PERSISTENT);
12091221
#endif
@@ -5125,6 +5137,44 @@ PHP_FUNCTION(imageflip)
51255137
RETURN_TRUE;
51265138
}
51275139
/* }}} */
5140+
5141+
5142+
/* {{{ proto void imageflip(resource im, int mode)
5143+
Flip an image (in place) horizontally, vertically or both directions. */
5144+
PHP_FUNCTION(imagecropauto)
5145+
{
5146+
zval *IM;
5147+
long mode = -1;
5148+
gdImagePtr im;
5149+
gdImagePtr im_crop;
5150+
5151+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &IM, &mode) == FAILURE) {
5152+
return;
5153+
}
5154+
5155+
ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
5156+
5157+
switch (mode) {
5158+
case -1:
5159+
mode = GD_CROP_DEFAULT;
5160+
case GD_CROP_DEFAULT:
5161+
case GD_CROP_TRANSPARENT:
5162+
case GD_CROP_BLACK:
5163+
case GD_CROP_WHITE:
5164+
case GD_CROP_SIDES:
5165+
im_crop = gdImageCropAuto(im, mode);
5166+
break;
5167+
default:
5168+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown flip mode");
5169+
RETURN_FALSE;
5170+
}
5171+
if (im_crop == NULL) {
5172+
RETURN_FALSE;
5173+
} else {
5174+
ZEND_REGISTER_RESOURCE(return_value, im_crop, le_gd);
5175+
}
5176+
}
5177+
/* }}} */
51285178
#endif
51295179

51305180

ext/gd/gdcache.c

+5
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

+50
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,31 @@ 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+
};
738+
739+
gdImagePtr gdImageCrop(gdImagePtr src, const gdRectPtr crop);
740+
gdImagePtr gdImageCropAuto(gdImagePtr im, const unsigned int mode);
741+
gdImagePtr gdImageCropThreshold(gdImagePtr im, const unsigned int color, const float threshold);
742+
693743
#define GD_CMP_IMAGE 1 /* Actual image IS different */
694744
#define GD_CMP_NUM_COLORS 2 /* Number of Colours in pallette differ */
695745
#define GD_CMP_COLOR 4 /* Image colours differ */

0 commit comments

Comments
 (0)