cvs: gd /libgd/src CMakeLists.txt Makefile.am gd.c gd.h gd_color.c gd_color.h gd_crop.c /libgd/tests/gdimagecolorreplace gdimagecolorreplace.c
| From: | Takeshi Abe | Date: | Sun, 23 Nov 2008 14:32:35 +0000 |
| Subject: | cvs: gd /libgd/src CMakeLists.txt Makefile.am gd.c gd.h gd_color.c gd_color.h gd_crop.c /libgd/tests/gdimagecolorreplace gdimagecolorreplace.c | ||
| Groups: | php.gd.cvs | ||
| Request: | Send a blank email to php-gd-cvs+get-548@lists.php.net to get a copy of this message | ||
tabe Sun Nov 23 14:32:35 2008 UTC
Added files:
/gd/libgd/src gd_color.c gd_color.h
Modified files:
/gd/libgd/src CMakeLists.txt Makefile.am gd.c gd.h gd_crop.c
/gd/libgd/tests/gdimagecolorreplace gdimagecolorreplace.c
Log:
added gdImageColorReplaceThreshold. (see FS#170)
- added gd_color.[ch] for internal use
http://cvs.php.net/viewvc.cgi/gd/libgd/src/CMakeLists.txt?r1=1.19&r2=1.20&diff_format=u Index: gd/libgd/src/CMakeLists.txt diff -u gd/libgd/src/CMakeLists.txt:1.19 gd/libgd/src/CMakeLists.txt:1.20 --- gd/libgd/src/CMakeLists.txt:1.19 Fri Aug 15 03:08:55 2008 +++ gd/libgd/src/CMakeLists.txt Sun Nov 23 14:32:35 2008 @@ -3,6 +3,8 @@ gd.c gdfx.c gdfx.h + gd_color.c + gd_color.h gd_color_map.c gd_color_map.h gd_crop.c http://cvs.php.net/viewvc.cgi/gd/libgd/src/Makefile.am?r1=1.12&r2=1.13&diff_format=u Index: gd/libgd/src/Makefile.am diff -u gd/libgd/src/Makefile.am:1.12 gd/libgd/src/Makefile.am:1.13 --- gd/libgd/src/Makefile.am:1.12 Tue Aug 5 15:00:51 2008 +++ gd/libgd/src/Makefile.am Sun Nov 23 14:32:35 2008 @@ -13,7 +13,7 @@ lib_LTLIBRARIES = libgd.la -libgd_la_SOURCES = gd.c gd_color_map.c gd_transform.c gdfx.c gd_security.c gd_gd.c gd_gd2.c gd_io.c gd_io_dp.c gd_gif_in.c gd_gif_out.c gd_io_file.c gd_io_ss.c gd_jpeg.c gd_png.c gd_ss.c gd_topal.c gd_wbmp.c gdcache.c gdfontg.c gdfontl.c gdfontmb.c gdfonts.c gdfontt.c gdft.c gdhelpers.c gdhelpers.h gdkanji.c gdtables.c gdxpm.c jisx0208.h wbmp.c wbmp.h +libgd_la_SOURCES = gd.c gd_color.c gd_color_map.c gd_transform.c gdfx.c gd_security.c gd_gd.c gd_gd2.c gd_io.c gd_io_dp.c gd_gif_in.c gd_gif_out.c gd_io_file.c gd_io_ss.c gd_jpeg.c gd_png.c gd_ss.c gd_topal.c gd_wbmp.c gdcache.c gdfontg.c gdfontl.c gdfontmb.c gdfonts.c gdfontt.c gdft.c gdhelpers.c gdhelpers.h gdkanji.c gdtables.c gdxpm.c jisx0208.h wbmp.c wbmp.h libgd_la_LDFLAGS = -version-info 2:0:0 $(XTRA_LDFLAGS) http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd.c?r1=1.77&r2=1.78&diff_format=u Index: gd/libgd/src/gd.c diff -u gd/libgd/src/gd.c:1.77 gd/libgd/src/gd.c:1.78 --- gd/libgd/src/gd.c:1.77 Thu Nov 20 15:24:48 2008 +++ gd/libgd/src/gd.c Sun Nov 23 14:32:35 2008 @@ -1,4 +1,4 @@ -/* $Id: gd.c,v 1.77 2008/11/20 15:24:48 tabe Exp $ */ +/* $Id: gd.c,v 1.78 2008/11/23 14:32:35 tabe Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -10,6 +10,7 @@ /* 2.03: don't include zlib here or we can't build without PNG */ #include "gd.h" #include "gdhelpers.h" +#include "gd_color.h" /* 2.0.12: this now checks the clipping rectangle */ #define gdImageBoundsSafeMacro(im, x, y) (!((((y) < (im)->cy1) || ((y) > (im)->cy2)) || (((x) < (im)->cx1) || ((x) > (im)->cx2)))) @@ -706,6 +707,37 @@ return n; } +BGD_DECLARE(int) gdImageColorReplaceThreshold (gdImagePtr im, int src, int dst, float threshold) +{ + register int x, y; + int n = 0; + + if (src == dst) { + return 0; + } + +#define REPLACING_LOOP(pixel) do { \ + for (y = im->cy1; y <= im->cy2; y++) { \ + for (x = im->cx1; x <= im->cx2; x++) { \ + if (gdColorMatch(im, src, pixel(im, x, y), threshold)) { \ + gdImageSetPixel(im, x, y, dst); \ + n++; \ + } \ + } \ + } \ + } while (0) + + if (im->trueColor) { + REPLACING_LOOP(gdImageTrueColorPixel); + } else { + REPLACING_LOOP(gdImagePalettePixel); + } + +#undef REPLACING_LOOP + + return n; +} + static int colorCmp (const void *x, const void *y) { int a = *(int const *)x; http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd.h?r1=1.49&r2=1.50&diff_format=u Index: gd/libgd/src/gd.h diff -u gd/libgd/src/gd.h:1.49 gd/libgd/src/gd.h:1.50 --- gd/libgd/src/gd.h:1.49 Thu Nov 20 15:24:48 2008 +++ gd/libgd/src/gd.h Sun Nov 23 14:32:35 2008 @@ -587,6 +587,7 @@ BGD_DECLARE(void) gdImagePaletteCopy (gdImagePtr dst, gdImagePtr src); BGD_DECLARE(int) gdImageColorReplace(gdImagePtr im, int src, int dst); +BGD_DECLARE(int) gdImageColorReplaceThreshold(gdImagePtr im, int src, int dst, float threshold); BGD_DECLARE(int) gdImageColorReplaceArray(gdImagePtr im, int len, int *src, int *dst); BGD_DECLARE(int) gdImageColorReplaceCallback(gdImagePtr im, int (*callback)(gdImagePtr imx, int src)); http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd_crop.c?r1=1.5&r2=1.6&diff_format=u Index: gd/libgd/src/gd_crop.c diff -u gd/libgd/src/gd_crop.c:1.5 gd/libgd/src/gd_crop.c:1.6 --- gd/libgd/src/gd_crop.c:1.5 Sun Aug 31 16:57:18 2008 +++ gd/libgd/src/gd_crop.c Sun Nov 23 14:32:35 2008 @@ -10,9 +10,9 @@ #include <stdlib.h> #include "gd.h" +#include "gd_color.h" static int gdGuessBackgroundColorFromCorners(gdImagePtr im, int *color); -static int gdColorMatch(gdImagePtr im, int col1, int col2, float threshold); BGD_DECLARE(gdImagePtr) gdImageCrop(gdImagePtr src, const gdRect *crop) { @@ -228,27 +228,3 @@ return 0; } } - -static int gdColorMatch(gdImagePtr im, int col1, int col2, float threshold) -{ - const int dr = gdImageRed(im, col1) - gdImageRed(im, col2); - const int dg = gdImageGreen(im, col1) - gdImageGreen(im, col2); - const int db = gdImageBlue(im, col1) - gdImageBlue(im, col2); - const int da = gdImageAlpha(im, col1) - gdImageAlpha(im, col2); - const int dist = dr * dr + dg * dg + db * db + da * da; - - return (100.0 * dist / 195075) < threshold; -} - -/* - * To be implemented when we have more image formats. - * Buffer like gray8 gray16 or rgb8 will require some tweak - * and can be done in this function (called from the autocrop - * function. (Pierre) - */ -#if 0 -static int colors_equal (const int col1, const in col2) -{ - -} -#endif http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c?r1=1.2&r2=1.3&diff_format=u Index: gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c diff -u gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c:1.2 gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c:1.3 --- gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c:1.2 Thu Nov 20 15:24:48 2008 +++ gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c Sun Nov 23 14:32:35 2008 @@ -19,16 +19,40 @@ static void run_tests(gdImagePtr im, int *error) { - int white, black, c, d; + int black, \ + white, \ + cosmic_latte, \ + cream, \ + ivory, \ + magnolia, \ + old_lace, \ + seashell, \ + yellow, \ + red, \ + c, d; int src[2], dst[2]; int n; +#define COLOR(name, r, g, b) name = gdImageColorAllocateAlpha(im, r, g, b, gdAlphaOpaque) + COLOR(black, 0, 0, 0); + COLOR(white, 0xFF, 0xFF, 0xFF); + COLOR(cosmic_latte, 0xFF, 0xF8, 0xE7); + COLOR(cream, 0xFF, 0xFD, 0xD0); + COLOR(ivory, 0xFF, 0xFF, 0xF0); + COLOR(magnolia, 0xF8, 0xF4, 0xFF); + COLOR(old_lace, 0xFD, 0xF5, 0xE6); + COLOR(seashell, 0xFF, 0xF5, 0xEE); + COLOR(yellow, 0xFF, 0xFF, 0); + COLOR(red, 0xFF, 0, 0); +#undef COLOR + #define CHECK_VALUE(n, expected) do { \ if (gdTestAssert((n) == (expected)) != 1) { \ printf("%d is expected, but %d\n", expected, n); \ *error = -1; \ } \ } while (0) + #define CHECK_PIXEL(x, y, expected) do { \ gdImageSetClip(im, 0, 0, 4, 4); \ c = gdImageGetPixel(im, (x), (y)); \ @@ -38,8 +62,6 @@ } \ } while (0) - white = gdImageColorAllocate(im, 0xFF, 0xFF, 0xFF); - black = gdImageColorAllocate(im, 0, 0, 0); c = gdImageColorAllocate(im, 0xFF, 0, 0xFF); gdImageFilledRectangle(im, 0, 0, 4, 4, white); gdImageFilledRectangle(im, 0, 0, 3, 3, black); @@ -85,6 +107,26 @@ CHECK_PIXEL(2, 3, d); CHECK_PIXEL(4, 4, d); +#define INITIALIZE_IMAGE() \ + gdImageSetClip(im, 0, 0, 4, 4); \ + gdImageFilledRectangle(im, 0, 0, 4, 4, black); \ + gdImageFilledRectangle(im, 1, 1, 3, 3, white); \ + gdImageSetPixel(im, 1, 1, cosmic_latte); \ + gdImageSetPixel(im, 1, 2, cream); \ + gdImageSetPixel(im, 2, 1, ivory); \ + gdImageSetPixel(im, 2, 2, magnolia); \ + gdImageSetPixel(im, 3, 1, old_lace); \ + gdImageSetPixel(im, 3, 2, seashell) + + INITIALIZE_IMAGE(); + n = gdImageColorReplaceThreshold(im, white, yellow, 2.0); + CHECK_VALUE(n, 9); + CHECK_PIXEL(0, 0, black); + CHECK_PIXEL(1, 1, yellow); + CHECK_PIXEL(2, 2, yellow); + CHECK_PIXEL(3, 3, yellow); + +#undef INITIALIZE_IMAGE #undef CHECK_VALUE #undef CHECK_PIXEL } http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd_color.c?view=markup&rev=1.1 Index: gd/libgd/src/gd_color.c +++ gd/libgd/src/gd_color.c #include "gd.h" #include "gd_color.h" int gdColorMatch(gdImagePtr im, int col1, int col2, float threshold) { const int dr = gdImageRed(im, col1) - gdImageRed(im, col2); const int dg = gdImageGreen(im, col1) - gdImageGreen(im, col2); const int db = gdImageBlue(im, col1) - gdImageBlue(im, col2); const int da = gdImageAlpha(im, col1) - gdImageAlpha(im, col2); const int dist = dr * dr + dg * dg + db * db + da * da; return (100.0 * dist / 195075) < threshold; } /* * To be implemented when we have more image formats. * Buffer like gray8 gray16 or rgb8 will require some tweak * and can be done in this function (called from the autocrop * function. (Pierre) */ #if 0 static int colors_equal (const int col1, const in col2) { } #endif http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd_color.h?view=markup&rev=1.1 Index: gd/libgd/src/gd_color.h +++ gd/libgd/src/gd_color.h #ifndef GD_COLOR_H #define GD_COLOR_H 1 #ifdef __cplusplus extern "C" { #endif int gdColorMatch(gdImagePtr im, int col1, int col2, float threshold); #ifdef __cplusplus } #endif #endif
http://cvs.php.net/viewvc.cgi/gd/libgd/src/CMakeLists.txt?r1=1.19&r2=1.20&diff_format=u Index: gd/libgd/src/CMakeLists.txt diff -u gd/libgd/src/CMakeLists.txt:1.19 gd/libgd/src/CMakeLists.txt:1.20 --- gd/libgd/src/CMakeLists.txt:1.19 Fri Aug 15 03:08:55 2008 +++ gd/libgd/src/CMakeLists.txt Sun Nov 23 14:32:35 2008 @@ -3,6 +3,8 @@ gd.c gdfx.c gdfx.h + gd_color.c + gd_color.h gd_color_map.c gd_color_map.h gd_crop.c http://cvs.php.net/viewvc.cgi/gd/libgd/src/Makefile.am?r1=1.12&r2=1.13&diff_format=u Index: gd/libgd/src/Makefile.am diff -u gd/libgd/src/Makefile.am:1.12 gd/libgd/src/Makefile.am:1.13 --- gd/libgd/src/Makefile.am:1.12 Tue Aug 5 15:00:51 2008 +++ gd/libgd/src/Makefile.am Sun Nov 23 14:32:35 2008 @@ -13,7 +13,7 @@ lib_LTLIBRARIES = libgd.la -libgd_la_SOURCES = gd.c gd_color_map.c gd_transform.c gdfx.c gd_security.c gd_gd.c gd_gd2.c gd_io.c gd_io_dp.c gd_gif_in.c gd_gif_out.c gd_io_file.c gd_io_ss.c gd_jpeg.c gd_png.c gd_ss.c gd_topal.c gd_wbmp.c gdcache.c gdfontg.c gdfontl.c gdfontmb.c gdfonts.c gdfontt.c gdft.c gdhelpers.c gdhelpers.h gdkanji.c gdtables.c gdxpm.c jisx0208.h wbmp.c wbmp.h +libgd_la_SOURCES = gd.c gd_color.c gd_color_map.c gd_transform.c gdfx.c gd_security.c gd_gd.c gd_gd2.c gd_io.c gd_io_dp.c gd_gif_in.c gd_gif_out.c gd_io_file.c gd_io_ss.c gd_jpeg.c gd_png.c gd_ss.c gd_topal.c gd_wbmp.c gdcache.c gdfontg.c gdfontl.c gdfontmb.c gdfonts.c gdfontt.c gdft.c gdhelpers.c gdhelpers.h gdkanji.c gdtables.c gdxpm.c jisx0208.h wbmp.c wbmp.h libgd_la_LDFLAGS = -version-info 2:0:0 $(XTRA_LDFLAGS) http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd.c?r1=1.77&r2=1.78&diff_format=u Index: gd/libgd/src/gd.c diff -u gd/libgd/src/gd.c:1.77 gd/libgd/src/gd.c:1.78 --- gd/libgd/src/gd.c:1.77 Thu Nov 20 15:24:48 2008 +++ gd/libgd/src/gd.c Sun Nov 23 14:32:35 2008 @@ -1,4 +1,4 @@ -/* $Id: gd.c,v 1.77 2008/11/20 15:24:48 tabe Exp $ */ +/* $Id: gd.c,v 1.78 2008/11/23 14:32:35 tabe Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -10,6 +10,7 @@ /* 2.03: don't include zlib here or we can't build without PNG */ #include "gd.h" #include "gdhelpers.h" +#include "gd_color.h" /* 2.0.12: this now checks the clipping rectangle */ #define gdImageBoundsSafeMacro(im, x, y) (!((((y) < (im)->cy1) || ((y) > (im)->cy2)) || (((x) < (im)->cx1) || ((x) > (im)->cx2)))) @@ -706,6 +707,37 @@ return n; } +BGD_DECLARE(int) gdImageColorReplaceThreshold (gdImagePtr im, int src, int dst, float threshold) +{ + register int x, y; + int n = 0; + + if (src == dst) { + return 0; + } + +#define REPLACING_LOOP(pixel) do { \ + for (y = im->cy1; y <= im->cy2; y++) { \ + for (x = im->cx1; x <= im->cx2; x++) { \ + if (gdColorMatch(im, src, pixel(im, x, y), threshold)) { \ + gdImageSetPixel(im, x, y, dst); \ + n++; \ + } \ + } \ + } \ + } while (0) + + if (im->trueColor) { + REPLACING_LOOP(gdImageTrueColorPixel); + } else { + REPLACING_LOOP(gdImagePalettePixel); + } + +#undef REPLACING_LOOP + + return n; +} + static int colorCmp (const void *x, const void *y) { int a = *(int const *)x; http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd.h?r1=1.49&r2=1.50&diff_format=u Index: gd/libgd/src/gd.h diff -u gd/libgd/src/gd.h:1.49 gd/libgd/src/gd.h:1.50 --- gd/libgd/src/gd.h:1.49 Thu Nov 20 15:24:48 2008 +++ gd/libgd/src/gd.h Sun Nov 23 14:32:35 2008 @@ -587,6 +587,7 @@ BGD_DECLARE(void) gdImagePaletteCopy (gdImagePtr dst, gdImagePtr src); BGD_DECLARE(int) gdImageColorReplace(gdImagePtr im, int src, int dst); +BGD_DECLARE(int) gdImageColorReplaceThreshold(gdImagePtr im, int src, int dst, float threshold); BGD_DECLARE(int) gdImageColorReplaceArray(gdImagePtr im, int len, int *src, int *dst); BGD_DECLARE(int) gdImageColorReplaceCallback(gdImagePtr im, int (*callback)(gdImagePtr imx, int src)); http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd_crop.c?r1=1.5&r2=1.6&diff_format=u Index: gd/libgd/src/gd_crop.c diff -u gd/libgd/src/gd_crop.c:1.5 gd/libgd/src/gd_crop.c:1.6 --- gd/libgd/src/gd_crop.c:1.5 Sun Aug 31 16:57:18 2008 +++ gd/libgd/src/gd_crop.c Sun Nov 23 14:32:35 2008 @@ -10,9 +10,9 @@ #include <stdlib.h> #include "gd.h" +#include "gd_color.h" static int gdGuessBackgroundColorFromCorners(gdImagePtr im, int *color); -static int gdColorMatch(gdImagePtr im, int col1, int col2, float threshold); BGD_DECLARE(gdImagePtr) gdImageCrop(gdImagePtr src, const gdRect *crop) { @@ -228,27 +228,3 @@ return 0; } } - -static int gdColorMatch(gdImagePtr im, int col1, int col2, float threshold) -{ - const int dr = gdImageRed(im, col1) - gdImageRed(im, col2); - const int dg = gdImageGreen(im, col1) - gdImageGreen(im, col2); - const int db = gdImageBlue(im, col1) - gdImageBlue(im, col2); - const int da = gdImageAlpha(im, col1) - gdImageAlpha(im, col2); - const int dist = dr * dr + dg * dg + db * db + da * da; - - return (100.0 * dist / 195075) < threshold; -} - -/* - * To be implemented when we have more image formats. - * Buffer like gray8 gray16 or rgb8 will require some tweak - * and can be done in this function (called from the autocrop - * function. (Pierre) - */ -#if 0 -static int colors_equal (const int col1, const in col2) -{ - -} -#endif http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c?r1=1.2&r2=1.3&diff_format=u Index: gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c diff -u gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c:1.2 gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c:1.3 --- gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c:1.2 Thu Nov 20 15:24:48 2008 +++ gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c Sun Nov 23 14:32:35 2008 @@ -19,16 +19,40 @@ static void run_tests(gdImagePtr im, int *error) { - int white, black, c, d; + int black, \ + white, \ + cosmic_latte, \ + cream, \ + ivory, \ + magnolia, \ + old_lace, \ + seashell, \ + yellow, \ + red, \ + c, d; int src[2], dst[2]; int n; +#define COLOR(name, r, g, b) name = gdImageColorAllocateAlpha(im, r, g, b, gdAlphaOpaque) + COLOR(black, 0, 0, 0); + COLOR(white, 0xFF, 0xFF, 0xFF); + COLOR(cosmic_latte, 0xFF, 0xF8, 0xE7); + COLOR(cream, 0xFF, 0xFD, 0xD0); + COLOR(ivory, 0xFF, 0xFF, 0xF0); + COLOR(magnolia, 0xF8, 0xF4, 0xFF); + COLOR(old_lace, 0xFD, 0xF5, 0xE6); + COLOR(seashell, 0xFF, 0xF5, 0xEE); + COLOR(yellow, 0xFF, 0xFF, 0); + COLOR(red, 0xFF, 0, 0); +#undef COLOR + #define CHECK_VALUE(n, expected) do { \ if (gdTestAssert((n) == (expected)) != 1) { \ printf("%d is expected, but %d\n", expected, n); \ *error = -1; \ } \ } while (0) + #define CHECK_PIXEL(x, y, expected) do { \ gdImageSetClip(im, 0, 0, 4, 4); \ c = gdImageGetPixel(im, (x), (y)); \ @@ -38,8 +62,6 @@ } \ } while (0) - white = gdImageColorAllocate(im, 0xFF, 0xFF, 0xFF); - black = gdImageColorAllocate(im, 0, 0, 0); c = gdImageColorAllocate(im, 0xFF, 0, 0xFF); gdImageFilledRectangle(im, 0, 0, 4, 4, white); gdImageFilledRectangle(im, 0, 0, 3, 3, black); @@ -85,6 +107,26 @@ CHECK_PIXEL(2, 3, d); CHECK_PIXEL(4, 4, d); +#define INITIALIZE_IMAGE() \ + gdImageSetClip(im, 0, 0, 4, 4); \ + gdImageFilledRectangle(im, 0, 0, 4, 4, black); \ + gdImageFilledRectangle(im, 1, 1, 3, 3, white); \ + gdImageSetPixel(im, 1, 1, cosmic_latte); \ + gdImageSetPixel(im, 1, 2, cream); \ + gdImageSetPixel(im, 2, 1, ivory); \ + gdImageSetPixel(im, 2, 2, magnolia); \ + gdImageSetPixel(im, 3, 1, old_lace); \ + gdImageSetPixel(im, 3, 2, seashell) + + INITIALIZE_IMAGE(); + n = gdImageColorReplaceThreshold(im, white, yellow, 2.0); + CHECK_VALUE(n, 9); + CHECK_PIXEL(0, 0, black); + CHECK_PIXEL(1, 1, yellow); + CHECK_PIXEL(2, 2, yellow); + CHECK_PIXEL(3, 3, yellow); + +#undef INITIALIZE_IMAGE #undef CHECK_VALUE #undef CHECK_PIXEL } http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd_color.c?view=markup&rev=1.1 Index: gd/libgd/src/gd_color.c +++ gd/libgd/src/gd_color.c #include "gd.h" #include "gd_color.h" int gdColorMatch(gdImagePtr im, int col1, int col2, float threshold) { const int dr = gdImageRed(im, col1) - gdImageRed(im, col2); const int dg = gdImageGreen(im, col1) - gdImageGreen(im, col2); const int db = gdImageBlue(im, col1) - gdImageBlue(im, col2); const int da = gdImageAlpha(im, col1) - gdImageAlpha(im, col2); const int dist = dr * dr + dg * dg + db * db + da * da; return (100.0 * dist / 195075) < threshold; } /* * To be implemented when we have more image formats. * Buffer like gray8 gray16 or rgb8 will require some tweak * and can be done in this function (called from the autocrop * function. (Pierre) */ #if 0 static int colors_equal (const int col1, const in col2) { } #endif http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd_color.h?view=markup&rev=1.1 Index: gd/libgd/src/gd_color.h +++ gd/libgd/src/gd_color.h #ifndef GD_COLOR_H #define GD_COLOR_H 1 #ifdef __cplusplus extern "C" { #endif int gdColorMatch(gdImagePtr im, int col1, int col2, float threshold); #ifdef __cplusplus } #endif #endif