Commit:    1ec484d3c536e85bc536e809a403ce5e7d7849d8
Author:    Pierre Joye <pierre....@gmail.com>         Wed, 20 Mar 2013 12:19:03 
+0100
Parents:   780c6e0a9cedb8dbecf5e4aca00996c73c0723d5
Branches:  master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=1ec484d3c536e85bc536e809a403ce5e7d7849d8

Log:
- add imageaffinematrixget and imagematrixconcat

Changed paths:
  M  ext/gd/gd.c
  M  ext/gd/libgd/gd_interpolation.c
  M  ext/gd/php_gd.h


Diff:
diff --git a/ext/gd/gd.c b/ext/gd/gd.c
index 038f7c4..caf84e3 100644
--- a/ext/gd/gd.c
+++ b/ext/gd/gd.c
@@ -918,12 +918,17 @@ ZEND_BEGIN_ARG_INFO(arginfo_imageaffine, 0)
        ZEND_ARG_INFO(0, affine)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_INFO(arginfo_imageaffinegetmatrix, 0)
+ZEND_BEGIN_ARG_INFO(arginfo_imageaffinematrixget, 0)
        ZEND_ARG_INFO(0, im)
        ZEND_ARG_INFO(0, matrox)
        ZEND_ARG_INFO(0, options)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_INFO(arginfo_imageaffinematrixconcat, 0)
+       ZEND_ARG_INFO(0, m1)
+       ZEND_ARG_INFO(0, m2)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_INFO(arginfo_imagesetinterpolation, 0)
        ZEND_ARG_INFO(0, im)
        ZEND_ARG_INFO(0, method)
@@ -994,7 +999,8 @@ const zend_function_entry gd_functions[] = {
        PHP_FE(imagecropauto,                                                   
arginfo_imagecropauto)
        PHP_FE(imagescale,                                                      
        arginfo_imagescale)
        PHP_FE(imageaffine,                                                     
        arginfo_imageaffine)
-       PHP_FE(imageaffinegetmatrix,                                    
arginfo_imageaffinegetmatrix)
+       PHP_FE(imageaffinematrixconcat,                                 
arginfo_imageaffinematrixconcat)
+       PHP_FE(imageaffinematrixget,                                    
arginfo_imageaffinematrixget)
        PHP_FE(imagesetinterpolation,                   
arginfo_imagesetinterpolation)
 #endif
 
@@ -1280,7 +1286,13 @@ PHP_MINIT_FUNCTION(gd)
        REGISTER_LONG_CONSTANT("IMG_NEAREST_NEIGHBOUR", GD_NEAREST_NEIGHBOUR, 
CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("IMG_WEIGHTED4", GD_WEIGHTED4, CONST_CS | 
CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("IMG_TRIANGLE", GD_TRIANGLE, CONST_CS | 
CONST_PERSISTENT);
-       REGISTER_LONG_CONSTANT("IMG_DEFAULT",  GD_BICUBIC_FIXED, CONST_CS | 
CONST_PERSISTENT);
+
+       REGISTER_LONG_CONSTANT("IMG_AFFINE_TRANSLATE", GD_AFFINE_TRANSLATE, 
CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("IMG_AFFINE_SCALE", GD_AFFINE_SCALE, CONST_CS | 
CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("IMG_AFFINE_ROTATE", GD_AFFINE_ROTATE, CONST_CS 
| CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("IMG_AFFINE_SHEAR_HORIZONTAL", 
GD_AFFINE_SHEAR_HORIZONTAL, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("IMG_AFFINE_SHEAR_VERTICAL", 
GD_AFFINE_SHEAR_VERTICAL, CONST_CS | CONST_PERSISTENT);
+
 #else
        REGISTER_LONG_CONSTANT("GD_BUNDLED", 0, CONST_CS | CONST_PERSISTENT);
 #endif
@@ -5488,26 +5500,24 @@ PHP_FUNCTION(imageaffine)
 }
 /* }}} */
 
-/* {{{ proto array imageaffinegetmatrix(type[, options])
+/* {{{ proto array imageaffinematrixget(type[, options])
    Return an image containing the affine tramsformed src image, using an 
optional clipping area */
-PHP_FUNCTION(imageaffinegetmatrix)
+PHP_FUNCTION(imageaffinematrixget)
 {
        double affine[6];
        gdAffineStandardMatrix type;
        zval *options;
        zval **tmp;
-       int args_required;
-       int res;
+       int res, i;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|z", &type, 
&options) == FAILURE)  {
                return;
        }
-       
+
        switch(type) {
                case GD_AFFINE_TRANSLATE:
                case GD_AFFINE_SCALE: {
                        double x, y;
-                       args_required = 2;
                        if (Z_TYPE_P(options) != IS_ARRAY) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Array expected as options");
                        }
@@ -5557,6 +5567,81 @@ PHP_FUNCTION(imageaffinegetmatrix)
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid 
type for element %i", type);
                        RETURN_FALSE;
        }
+
+       array_init(return_value);
+       for (i = 0; i < 6; i++) {
+               add_index_double(return_value, i, affine[i]);
+       }
+}
+
+
+/* {{{ proto array imageaffineconcat(array m1, array m2)
+   Concat two matrices (as in doing many ops in one go) */
+PHP_FUNCTION(imageaffinematrixconcat)
+{
+       double m1[6];
+       double m2[6];
+       double mr[6];
+
+       zval **tmp;
+       zval *z_m1;
+       zval *z_m2;
+       int i, nelems;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "aa", &z_m1, 
&z_m2) == FAILURE)  {
+               return;
+       }
+
+       if (((nelems = zend_hash_num_elements(Z_ARRVAL_P(z_m1))) != 6) || 
(nelems = zend_hash_num_elements(Z_ARRVAL_P(z_m2))) != 6) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Affine arrays must 
have six elements");
+               RETURN_FALSE;
+       }
+
+       for (i = 0; i < 6; i++) {
+               if (zend_hash_index_find(Z_ARRVAL_P(z_m1), i, (void **) &tmp) 
== SUCCESS) {
+                       switch (Z_TYPE_PP(tmp)) {
+                               case IS_LONG:
+                                       m1[i]  = Z_LVAL_PP(tmp);
+                                       break;
+                               case IS_DOUBLE:
+                                       m1[i] = Z_DVAL_PP(tmp);
+                                       break;
+                               case IS_STRING:
+                                       convert_to_double_ex(tmp);
+                                       m1[i] = Z_DVAL_PP(tmp);
+                                       break;
+                               default:
+                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING, "Invalid type for element %i", i);
+                                       RETURN_FALSE;
+                       }
+               }
+               if (zend_hash_index_find(Z_ARRVAL_P(z_m2), i, (void **) &tmp) 
== SUCCESS) {
+                       switch (Z_TYPE_PP(tmp)) {
+                               case IS_LONG:
+                                       m2[i]  = Z_LVAL_PP(tmp);
+                                       break;
+                               case IS_DOUBLE:
+                                       m2[i] = Z_DVAL_PP(tmp);
+                                       break;
+                               case IS_STRING:
+                                       convert_to_double_ex(tmp);
+                                       m2[i] = Z_DVAL_PP(tmp);
+                                       break;
+                               default:
+                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING, "Invalid type for element %i", i);
+                                       RETURN_FALSE;
+                       }
+               }
+       }
+
+       if (gdAffineConcat (mr, m1, m2) != GD_TRUE) {
+               RETURN_FALSE;
+       }
+
+       array_init(return_value);
+       for (i = 0; i < 6; i++) {
+               add_index_double(return_value, i, mr[i]);
+       }
 }
 
 /* {{{ proto resource imagesetinterpolation(resource im, [, method]])
diff --git a/ext/gd/libgd/gd_interpolation.c b/ext/gd/libgd/gd_interpolation.c
index b2c6f41..ab3e988 100644
--- a/ext/gd/libgd/gd_interpolation.c
+++ b/ext/gd/libgd/gd_interpolation.c
@@ -2363,11 +2363,6 @@ int gdTransformAffineCopy(gdImagePtr dst,
        gdInterpolationMethod interpolotion_id_bak;
        interpolation_method interpolation_bak;
 
-/*
-       gdInterpolationMethod interpolation_id;
-       interpolation_method interpolation;
-*/
-
        /* These methods use special implementations */
        if (src->interpolation_id == GD_BILINEAR_FIXED || src->interpolation_id 
== GD_BICUBIC_FIXED || src->interpolation_id == GD_NEAREST_NEIGHBOUR) {
                interpolotion_id_bak = src->interpolation_id;
diff --git a/ext/gd/php_gd.h b/ext/gd/php_gd.h
index fd6836c..3c60007 100644
--- a/ext/gd/php_gd.h
+++ b/ext/gd/php_gd.h
@@ -130,7 +130,8 @@ PHP_FUNCTION(imagecrop);
 PHP_FUNCTION(imagecropauto);
 PHP_FUNCTION(imagescale);
 PHP_FUNCTION(imageaffine);
-PHP_FUNCTION(imageaffinegetmatrix);
+PHP_FUNCTION(imageaffinematrixget);
+PHP_FUNCTION(imageaffinematrixconcat);
 PHP_FUNCTION(imagesetinterpolation);
 #endif


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to