Skip to content

Commit 1ec484d

Browse files
committed
- add imageaffinematrixget and imagematrixconcat
1 parent 780c6e0 commit 1ec484d

File tree

3 files changed

+96
-15
lines changed

3 files changed

+96
-15
lines changed

ext/gd/gd.c

Lines changed: 94 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -918,12 +918,17 @@ ZEND_BEGIN_ARG_INFO(arginfo_imageaffine, 0)
918918
ZEND_ARG_INFO(0, affine)
919919
ZEND_END_ARG_INFO()
920920

921-
ZEND_BEGIN_ARG_INFO(arginfo_imageaffinegetmatrix, 0)
921+
ZEND_BEGIN_ARG_INFO(arginfo_imageaffinematrixget, 0)
922922
ZEND_ARG_INFO(0, im)
923923
ZEND_ARG_INFO(0, matrox)
924924
ZEND_ARG_INFO(0, options)
925925
ZEND_END_ARG_INFO()
926926

927+
ZEND_BEGIN_ARG_INFO(arginfo_imageaffinematrixconcat, 0)
928+
ZEND_ARG_INFO(0, m1)
929+
ZEND_ARG_INFO(0, m2)
930+
ZEND_END_ARG_INFO()
931+
927932
ZEND_BEGIN_ARG_INFO(arginfo_imagesetinterpolation, 0)
928933
ZEND_ARG_INFO(0, im)
929934
ZEND_ARG_INFO(0, method)
@@ -994,7 +999,8 @@ const zend_function_entry gd_functions[] = {
994999
PHP_FE(imagecropauto, arginfo_imagecropauto)
9951000
PHP_FE(imagescale, arginfo_imagescale)
9961001
PHP_FE(imageaffine, arginfo_imageaffine)
997-
PHP_FE(imageaffinegetmatrix, arginfo_imageaffinegetmatrix)
1002+
PHP_FE(imageaffinematrixconcat, arginfo_imageaffinematrixconcat)
1003+
PHP_FE(imageaffinematrixget, arginfo_imageaffinematrixget)
9981004
PHP_FE(imagesetinterpolation, arginfo_imagesetinterpolation)
9991005
#endif
10001006

@@ -1280,7 +1286,13 @@ PHP_MINIT_FUNCTION(gd)
12801286
REGISTER_LONG_CONSTANT("IMG_NEAREST_NEIGHBOUR", GD_NEAREST_NEIGHBOUR, CONST_CS | CONST_PERSISTENT);
12811287
REGISTER_LONG_CONSTANT("IMG_WEIGHTED4", GD_WEIGHTED4, CONST_CS | CONST_PERSISTENT);
12821288
REGISTER_LONG_CONSTANT("IMG_TRIANGLE", GD_TRIANGLE, CONST_CS | CONST_PERSISTENT);
1283-
REGISTER_LONG_CONSTANT("IMG_DEFAULT", GD_BICUBIC_FIXED, CONST_CS | CONST_PERSISTENT);
1289+
1290+
REGISTER_LONG_CONSTANT("IMG_AFFINE_TRANSLATE", GD_AFFINE_TRANSLATE, CONST_CS | CONST_PERSISTENT);
1291+
REGISTER_LONG_CONSTANT("IMG_AFFINE_SCALE", GD_AFFINE_SCALE, CONST_CS | CONST_PERSISTENT);
1292+
REGISTER_LONG_CONSTANT("IMG_AFFINE_ROTATE", GD_AFFINE_ROTATE, CONST_CS | CONST_PERSISTENT);
1293+
REGISTER_LONG_CONSTANT("IMG_AFFINE_SHEAR_HORIZONTAL", GD_AFFINE_SHEAR_HORIZONTAL, CONST_CS | CONST_PERSISTENT);
1294+
REGISTER_LONG_CONSTANT("IMG_AFFINE_SHEAR_VERTICAL", GD_AFFINE_SHEAR_VERTICAL, CONST_CS | CONST_PERSISTENT);
1295+
12841296
#else
12851297
REGISTER_LONG_CONSTANT("GD_BUNDLED", 0, CONST_CS | CONST_PERSISTENT);
12861298
#endif
@@ -5488,26 +5500,24 @@ PHP_FUNCTION(imageaffine)
54885500
}
54895501
/* }}} */
54905502

5491-
/* {{{ proto array imageaffinegetmatrix(type[, options])
5503+
/* {{{ proto array imageaffinematrixget(type[, options])
54925504
Return an image containing the affine tramsformed src image, using an optional clipping area */
5493-
PHP_FUNCTION(imageaffinegetmatrix)
5505+
PHP_FUNCTION(imageaffinematrixget)
54945506
{
54955507
double affine[6];
54965508
gdAffineStandardMatrix type;
54975509
zval *options;
54985510
zval **tmp;
5499-
int args_required;
5500-
int res;
5511+
int res, i;
55015512

55025513
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|z", &type, &options) == FAILURE) {
55035514
return;
55045515
}
5505-
5516+
55065517
switch(type) {
55075518
case GD_AFFINE_TRANSLATE:
55085519
case GD_AFFINE_SCALE: {
55095520
double x, y;
5510-
args_required = 2;
55115521
if (Z_TYPE_P(options) != IS_ARRAY) {
55125522
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array expected as options");
55135523
}
@@ -5557,6 +5567,81 @@ PHP_FUNCTION(imageaffinegetmatrix)
55575567
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid type for element %i", type);
55585568
RETURN_FALSE;
55595569
}
5570+
5571+
array_init(return_value);
5572+
for (i = 0; i < 6; i++) {
5573+
add_index_double(return_value, i, affine[i]);
5574+
}
5575+
}
5576+
5577+
5578+
/* {{{ proto array imageaffineconcat(array m1, array m2)
5579+
Concat two matrices (as in doing many ops in one go) */
5580+
PHP_FUNCTION(imageaffinematrixconcat)
5581+
{
5582+
double m1[6];
5583+
double m2[6];
5584+
double mr[6];
5585+
5586+
zval **tmp;
5587+
zval *z_m1;
5588+
zval *z_m2;
5589+
int i, nelems;
5590+
5591+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "aa", &z_m1, &z_m2) == FAILURE) {
5592+
return;
5593+
}
5594+
5595+
if (((nelems = zend_hash_num_elements(Z_ARRVAL_P(z_m1))) != 6) || (nelems = zend_hash_num_elements(Z_ARRVAL_P(z_m2))) != 6) {
5596+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Affine arrays must have six elements");
5597+
RETURN_FALSE;
5598+
}
5599+
5600+
for (i = 0; i < 6; i++) {
5601+
if (zend_hash_index_find(Z_ARRVAL_P(z_m1), i, (void **) &tmp) == SUCCESS) {
5602+
switch (Z_TYPE_PP(tmp)) {
5603+
case IS_LONG:
5604+
m1[i] = Z_LVAL_PP(tmp);
5605+
break;
5606+
case IS_DOUBLE:
5607+
m1[i] = Z_DVAL_PP(tmp);
5608+
break;
5609+
case IS_STRING:
5610+
convert_to_double_ex(tmp);
5611+
m1[i] = Z_DVAL_PP(tmp);
5612+
break;
5613+
default:
5614+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid type for element %i", i);
5615+
RETURN_FALSE;
5616+
}
5617+
}
5618+
if (zend_hash_index_find(Z_ARRVAL_P(z_m2), i, (void **) &tmp) == SUCCESS) {
5619+
switch (Z_TYPE_PP(tmp)) {
5620+
case IS_LONG:
5621+
m2[i] = Z_LVAL_PP(tmp);
5622+
break;
5623+
case IS_DOUBLE:
5624+
m2[i] = Z_DVAL_PP(tmp);
5625+
break;
5626+
case IS_STRING:
5627+
convert_to_double_ex(tmp);
5628+
m2[i] = Z_DVAL_PP(tmp);
5629+
break;
5630+
default:
5631+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid type for element %i", i);
5632+
RETURN_FALSE;
5633+
}
5634+
}
5635+
}
5636+
5637+
if (gdAffineConcat (mr, m1, m2) != GD_TRUE) {
5638+
RETURN_FALSE;
5639+
}
5640+
5641+
array_init(return_value);
5642+
for (i = 0; i < 6; i++) {
5643+
add_index_double(return_value, i, mr[i]);
5644+
}
55605645
}
55615646

55625647
/* {{{ proto resource imagesetinterpolation(resource im, [, method]])

ext/gd/libgd/gd_interpolation.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2363,11 +2363,6 @@ int gdTransformAffineCopy(gdImagePtr dst,
23632363
gdInterpolationMethod interpolotion_id_bak;
23642364
interpolation_method interpolation_bak;
23652365

2366-
/*
2367-
gdInterpolationMethod interpolation_id;
2368-
interpolation_method interpolation;
2369-
*/
2370-
23712366
/* These methods use special implementations */
23722367
if (src->interpolation_id == GD_BILINEAR_FIXED || src->interpolation_id == GD_BICUBIC_FIXED || src->interpolation_id == GD_NEAREST_NEIGHBOUR) {
23732368
interpolotion_id_bak = src->interpolation_id;

ext/gd/php_gd.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,8 @@ PHP_FUNCTION(imagecrop);
130130
PHP_FUNCTION(imagecropauto);
131131
PHP_FUNCTION(imagescale);
132132
PHP_FUNCTION(imageaffine);
133-
PHP_FUNCTION(imageaffinegetmatrix);
133+
PHP_FUNCTION(imageaffinematrixget);
134+
PHP_FUNCTION(imageaffinematrixconcat);
134135
PHP_FUNCTION(imagesetinterpolation);
135136
#endif
136137

0 commit comments

Comments
 (0)