]> granicus.if.org Git - php/commitdiff
added ImageColorHistogram function
authorHartmut Holzgraefe <hholzgra@php.net>
Sun, 5 Mar 2006 18:23:47 +0000 (18:23 +0000)
committerHartmut Holzgraefe <hholzgra@php.net>
Sun, 5 Mar 2006 18:23:47 +0000 (18:23 +0000)
NEWS
ext/gd/gd.c
ext/gd/php_gd.h

diff --git a/NEWS b/NEWS
index b20bac0b772fb55a41507ea8dd847221c7e93142..5d5148655f693d1cf219579cde7e05c4012377ee 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -30,3 +30,4 @@ PHP                                                                        NEWS
 - Added possibility to check in which extension an internal function was
   defined using reflection API. (Johannes)
 - Fixed bug #34286 (__toString() behavior is inconsistent). (Marcus)
+- Added ImageColorHistogram() to gd extension. (Hartmut)
index 42879b253ff665286fb69cd0b27aa41e1d4102be..6c7958dd494107869e842bbdbdaa4a944cced59e 100644 (file)
@@ -144,6 +144,7 @@ zend_function_entry gd_functions[] = {
        PHP_FE(imagechar,                                                               NULL)
        PHP_FE(imagecharup,                                                             NULL)
        PHP_FE(imagecolorat,                                                    NULL)
+       PHP_FE(imagecolorhistogram,                     NULL)
        PHP_FE(imagecolorallocate,                                              NULL)
        PHP_FE(imagepalettecopy,                                                NULL)
        PHP_FE(imagecreatefromstring,                                   NULL)
@@ -2349,6 +2350,53 @@ PHP_FUNCTION(imagecolorstotal)
 }
 /* }}} */
 
+/* {{{ proto array imagecolorhistogram(resource im)
+   Return color histogram for an image */
+PHP_FUNCTION(imagecolorhistogram)
+{
+       zval **IM;
+       gdImagePtr im;
+       int num_colors, x, y, n;
+       long *color_count;
+
+       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &IM) == FAILURE) {
+               ZEND_WRONG_PARAM_COUNT();
+       }
+
+       ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd);
+
+       if (!im->pixels) {
+               RETURN_FALSE;
+       }
+       
+       num_colors = gdImageColorsTotal(im);
+
+       if (num_colors <= 0) {
+               RETURN_FALSE;
+       }
+
+       color_count = (long *)calloc(num_colors, sizeof(long));
+       
+       for (x = 0; x < gdImageSX(im); x++) {
+               for (y = 0; y < gdImageSY(im); y++) {
+#if HAVE_LIBGD13
+                       color_count[im->pixels[y][x]]++;
+#else
+                       color_count[im->pixels[x][y]]++;
+#endif
+               }
+       }
+
+       array_init(return_value);
+
+       for (n = 0; n < num_colors; n++) {
+               add_index_long(return_value, n, color_count[n]);
+       }
+
+       efree(color_count);
+}
+/* }}} */
+
 /* {{{ proto int imagecolortransparent(resource im [, int col])
    Define a color as transparent */
 PHP_FUNCTION(imagecolortransparent)
index 4b807f2baad5c778668b697f438bc25faeee641f..d979e2c7c141bef920a9bb64a6dd12b29ffbe61b 100644 (file)
@@ -86,6 +86,7 @@ PHP_FUNCTION(imagecolorexact);
 PHP_FUNCTION(imagecolorset);
 PHP_FUNCTION(imagecolorstotal);
 PHP_FUNCTION(imagecolorsforindex);
+PHP_FUNCTION(imagecolorhistogram);
 PHP_FUNCTION(imagecolortransparent);
 PHP_FUNCTION(imagecopy);
 PHP_FUNCTION(imagecopymerge);