From aa4c9cb217fb7721bf68f2edcc877552ac076280 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Mon, 8 Jul 2024 18:45:01 +0100 Subject: [PATCH] ext/gd adding imagecompare. can be useful to detect subtle differences between two images, size, transparent, background ... wise. --- ext/gd/gd.c | 15 +++++++++++ ext/gd/gd.stub.php | 48 ++++++++++++++++++++++++++++++++++ ext/gd/gd_arginfo.h | 18 ++++++++++++- ext/gd/tests/imagecompare.phpt | 30 +++++++++++++++++++++ 4 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 ext/gd/tests/imagecompare.phpt diff --git a/ext/gd/gd.c b/ext/gd/gd.c index 4731eff74111c..5ea7e0c9865b2 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -4337,6 +4337,21 @@ PHP_FUNCTION(imageresolution) } /* }}} */ +PHP_FUNCTION(imagecompare) +{ + zval *IM1, *IM2; + gdImagePtr im1, im2; + + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_OBJECT_OF_CLASS(IM1, gd_image_ce) + Z_PARAM_OBJECT_OF_CLASS(IM2, gd_image_ce) + ZEND_PARSE_PARAMETERS_END(); + + im1 = php_gd_libgdimageptr_from_zval_p(IM1); + im2 = php_gd_libgdimageptr_from_zval_p(IM2); + + RETURN_LONG((zend_long)gdImageCompare(im1, im2)); +} /********************************************************* * diff --git a/ext/gd/gd.stub.php b/ext/gd/gd.stub.php index 347e43e728b87..61feae6d87872 100644 --- a/ext/gd/gd.stub.php +++ b/ext/gd/gd.stub.php @@ -338,6 +338,52 @@ */ const IMG_AFFINE_SHEAR_VERTICAL = UNKNOWN; +/** + * @var int + * @cvalue GD_CMP_IMAGE + */ +const IMG_CMP_IMAGE = UNKNOWN; +/** + * @var int + * @cvalue GD_CMP_NUM_COLORS + */ +const IMG_CMP_NUM_COLORS = UNKNOWN; +/** + * @var int + * @cvalue GD_CMP_COLOR + */ +const IMG_CMP_COLOR = UNKNOWN; +/** + * @var int + * @cvalue GD_CMP_SIZE_X + */ +const IMG_CMP_SIZE_X = UNKNOWN; +/** + * @var int + * @cvalue GD_CMP_SIZE_Y + */ +const IMG_CMP_SIZE_Y = UNKNOWN; +/** + * @var int + * @cvalue GD_CMP_TRANSPARENT + */ +const IMG_CMP_TRANSPARENT = UNKNOWN; +/** + * @var int + * @cvalue GD_CMP_BACKGROUND + */ +const IMG_CMP_BACKGROUND = UNKNOWN; +/** + * @var int + * @cvalue GD_CMP_INTERLACE + */ +const IMG_CMP_INTERLACE = UNKNOWN; +/** + * @var int + * @cvalue GD_CMP_TRUECOLOR + */ +const IMG_CMP_TRUECOLOR = UNKNOWN; + /** * @var int * @cvalue GD_BUNDLED @@ -794,3 +840,5 @@ function imagesetinterpolation(GdImage $image, int $method = IMG_BILINEAR_FIXED) * @refcount 1 */ function imageresolution(GdImage $image, ?int $resolution_x = null, ?int $resolution_y = null): array|bool {} + +function imagecompare(GdImage $image1, GdImage $image2): int {} diff --git a/ext/gd/gd_arginfo.h b/ext/gd/gd_arginfo.h index f68b34d5e101b..5f63188e35afe 100644 --- a/ext/gd/gd_arginfo.h +++ b/ext/gd/gd_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 0f8a22bff1d123313f37da400500e573baace837 */ + * Stub hash: 3d12f3cc6b6e47688ad5baf054e15137f2bcc2d4 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gd_info, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -575,6 +575,11 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imageresolution, 0, 1, MAY_BE_AR ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, resolution_y, IS_LONG, 1, "null") ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecompare, 0, 2, IS_LONG, 0) + ZEND_ARG_OBJ_INFO(0, image1, GdImage, 0) + ZEND_ARG_OBJ_INFO(0, image2, GdImage, 0) +ZEND_END_ARG_INFO() + ZEND_FUNCTION(gd_info); ZEND_FUNCTION(imageloadfont); ZEND_FUNCTION(imagesetstyle); @@ -713,6 +718,7 @@ ZEND_FUNCTION(imageaffinematrixconcat); ZEND_FUNCTION(imagegetinterpolation); ZEND_FUNCTION(imagesetinterpolation); ZEND_FUNCTION(imageresolution); +ZEND_FUNCTION(imagecompare); static const zend_function_entry ext_functions[] = { ZEND_FE(gd_info, arginfo_gd_info) @@ -859,6 +865,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(imagegetinterpolation, arginfo_imagegetinterpolation) ZEND_FE(imagesetinterpolation, arginfo_imagesetinterpolation) ZEND_FE(imageresolution, arginfo_imageresolution) + ZEND_FE(imagecompare, arginfo_imagecompare) ZEND_FE_END }; @@ -939,6 +946,15 @@ static void register_gd_symbols(int module_number) REGISTER_LONG_CONSTANT("IMG_AFFINE_ROTATE", GD_AFFINE_ROTATE, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_AFFINE_SHEAR_HORIZONTAL", GD_AFFINE_SHEAR_HORIZONTAL, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_AFFINE_SHEAR_VERTICAL", GD_AFFINE_SHEAR_VERTICAL, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMG_CMP_IMAGE", GD_CMP_IMAGE, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMG_CMP_NUM_COLORS", GD_CMP_NUM_COLORS, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMG_CMP_COLOR", GD_CMP_COLOR, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMG_CMP_SIZE_X", GD_CMP_SIZE_X, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMG_CMP_SIZE_Y", GD_CMP_SIZE_Y, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMG_CMP_TRANSPARENT", GD_CMP_TRANSPARENT, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMG_CMP_BACKGROUND", GD_CMP_BACKGROUND, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMG_CMP_INTERLACE", GD_CMP_INTERLACE, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMG_CMP_TRUECOLOR", GD_CMP_TRUECOLOR, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("GD_BUNDLED", GD_BUNDLED, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_FILTER_NEGATE", IMAGE_FILTER_NEGATE, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_FILTER_GRAYSCALE", IMAGE_FILTER_GRAYSCALE, CONST_PERSISTENT); diff --git a/ext/gd/tests/imagecompare.phpt b/ext/gd/tests/imagecompare.phpt new file mode 100644 index 0000000000000..dbbe35017dcb4 --- /dev/null +++ b/ext/gd/tests/imagecompare.phpt @@ -0,0 +1,30 @@ +--TEST-- +imagecompare() function test +--EXTENSIONS-- +gd +--SKIPIF-- + +--FILE-- +