cvs: gd /libgd NEWS /libgd/src CMakeLists.txt Makefile.am gd.h gd_pixelate.c /libgd/tests CMakeLists.txt Makefile.am /libgd/tests/gdimagepixelate
CMakeLists.txt Makefile.am gdimagepixelate.c
| From: | Takeshi Abe | Date: | Sun, 21 Dec 2008 09:08:11 +0000 |
| Subject: | cvs: gd /libgd NEWS /libgd/src CMakeLists.txt Makefile.am gd.h gd_pixelate.c /libgd/tests CMakeLists.txt Makefile.am /libgd/tests/gdimagepixelate CMakeLists.txt Makefile.am gdimagepixelate.c |
||
| Groups: | php.gd.cvs | ||
| Request: | Send a blank email to php-gd-cvs+get-556@lists.php.net to get a copy of this message | ||
tabe Sun Dec 21 09:08:11 2008 UTC
Added files:
/gd/libgd/src gd_pixelate.c
/gd/libgd/tests/gdimagepixelate CMakeLists.txt Makefile.am
gdimagepixelate.c
Modified files:
/gd/libgd NEWS
/gd/libgd/src CMakeLists.txt Makefile.am gd.h
/gd/libgd/tests CMakeLists.txt Makefile.am
Log:
added new filter gdImagePixelate(). (see FS#184)
http://cvs.php.net/viewvc.cgi/gd/libgd/NEWS?r1=1.4&r2=1.5&diff_format=u Index: gd/libgd/NEWS diff -u gd/libgd/NEWS:1.4 gd/libgd/NEWS:1.5 --- gd/libgd/NEWS:1.4 Wed Nov 26 19:20:21 2008 +++ gd/libgd/NEWS Sun Dec 21 09:08:11 2008 @@ -3,6 +3,7 @@ GD HEAD 169, gdColorMapLookup() answers the RGB values according to given color map (Takeshi Abe) +184, new filter gdImagePixelate() by Kalle Sommer Nielsen (Takeshi Abe) GD 2.0.36 (2007-11-xx) 145, Fixed leak in gdImageCopyResized (Patch by Brent Bottles) http://cvs.php.net/viewvc.cgi/gd/libgd/src/CMakeLists.txt?r1=1.21&r2=1.22&diff_format=u Index: gd/libgd/src/CMakeLists.txt diff -u gd/libgd/src/CMakeLists.txt:1.21 gd/libgd/src/CMakeLists.txt:1.22 --- gd/libgd/src/CMakeLists.txt:1.21 Fri Dec 12 17:09:39 2008 +++ gd/libgd/src/CMakeLists.txt Sun Dec 21 09:08:11 2008 @@ -28,6 +28,7 @@ gd_jpeg.c gd_nnquant.c gd_nnquant.h + gd_pixelate.c gd_png.c gd_tiff.c gd_tga.c http://cvs.php.net/viewvc.cgi/gd/libgd/src/Makefile.am?r1=1.13&r2=1.14&diff_format=u Index: gd/libgd/src/Makefile.am diff -u gd/libgd/src/Makefile.am:1.13 gd/libgd/src/Makefile.am:1.14 --- gd/libgd/src/Makefile.am:1.13 Sun Nov 23 14:32:35 2008 +++ gd/libgd/src/Makefile.am Sun Dec 21 09:08:11 2008 @@ -13,7 +13,7 @@ lib_LTLIBRARIES = libgd.la -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_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 gd_pixelate.c libgd_la_LDFLAGS = -version-info 2:0:0 $(XTRA_LDFLAGS) http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd.h?r1=1.50&r2=1.51&diff_format=u Index: gd/libgd/src/gd.h diff -u gd/libgd/src/gd.h:1.50 gd/libgd/src/gd.h:1.51 --- gd/libgd/src/gd.h:1.50 Sun Nov 23 14:32:35 2008 +++ gd/libgd/src/gd.h Sun Dec 21 09:08:11 2008 @@ -770,6 +770,13 @@ BGD_DECLARE(gdImagePtr) gdImageNeuQuant(gdImagePtr im, const int max_color, int sample_factor); +enum gdPixelateMode { + GD_PIXELATE_UPPERLEFT, + GD_PIXELATE_AVERAGE +}; + +BGD_DECLARE(int) gdImagePixelate(gdImagePtr im, int block_size, const unsigned int mode); + /* Macros to access information about images. */ /* Returns nonzero if the image is a truecolor image, http://cvs.php.net/viewvc.cgi/gd/libgd/tests/CMakeLists.txt?r1=1.9&r2=1.10&diff_format=u Index: gd/libgd/tests/CMakeLists.txt diff -u gd/libgd/tests/CMakeLists.txt:1.9 gd/libgd/tests/CMakeLists.txt:1.10 --- gd/libgd/tests/CMakeLists.txt:1.9 Sun Nov 16 03:25:33 2008 +++ gd/libgd/tests/CMakeLists.txt Sun Dec 21 09:08:11 2008 @@ -30,6 +30,7 @@ gdimagecolordeallocate gdimagecolortransparent #gdimageellipse + gdimagepixelate gdimageline gdimagefilledellipse gdimagecopyrotated http://cvs.php.net/viewvc.cgi/gd/libgd/tests/Makefile.am?r1=1.3&r2=1.4&diff_format=u Index: gd/libgd/tests/Makefile.am diff -u gd/libgd/tests/Makefile.am:1.3 gd/libgd/tests/Makefile.am:1.4 --- gd/libgd/tests/Makefile.am:1.3 Sun Nov 16 03:25:33 2008 +++ gd/libgd/tests/Makefile.am Sun Dec 21 09:08:11 2008 @@ -1,7 +1,7 @@ ## Process this file with automake to produce Makefile.in -*-Makefile-*- AUTOMAKE_OPTIONS = foreign 1.7 -SUBDIRS = gd2 gdimagecolordeallocate gdimagecolortransparent gdimagefill gdimagefilltoborder gdtest jpeg gdimagearc gdimagecolorexact gdimagecopy gdimagefilledellipse gdimageline gdtiled freetype gdimagecolorclosest gdimagecolorreplace gdimagecolorresolve gdimagecopyrotated gdimagefilledrectangle gdimagerectangle gif png xpm +SUBDIRS = gd2 gdimagecolordeallocate gdimagecolortransparent gdimagefill gdimagefilltoborder gdtest jpeg gdimagearc gdimagecolorexact gdimagecopy gdimagefilledellipse gdimageline gdimagepixelate gdtiled freetype gdimagecolorclosest gdimagecolorreplace gdimagecolorresolve gdimagecopyrotated gdimagefilledrectangle gdimagerectangle gif png xpm EXTRA_DIST = CMakeLists.txt http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd_pixelate.c?view=markup&rev=1.1 Index: gd/libgd/src/gd_pixelate.c +++ gd/libgd/src/gd_pixelate.c #include "gd.h" int gdImagePixelate(gdImagePtr im, int block_size, const unsigned int mode) { int x, y; if (block_size <= 0) { return 0; } else if (block_size == 1) { return 1; } switch (mode) { case GD_PIXELATE_UPPERLEFT: for (y = 0; y < im->sy; y += block_size) { for (x = 0; x < im->sx; x += block_size) { if (gdImageBoundsSafe(im, x, y)) { int c = gdImageGetPixel(im, x, y); gdImageFilledRectangle(im, x, y, x + block_size - 1, y + block_size - 1, c); } } } break; case GD_PIXELATE_AVERAGE: for (y = 0; y < im->sy; y += block_size) { for (x = 0; x < im->sx; x += block_size) { int a, r, g, b, c; int total; int cx, cy; a = r = g = b = c = total = 0; /* sampling */ for (cy = 0; cy < block_size; cy++) { for (cx = 0; cx < block_size; cx++) { if (!gdImageBoundsSafe(im, x + cx, y + cy)) { continue; } c = gdImageGetPixel(im, x + cx, y + cy); a += gdImageAlpha(im, c); r += gdImageRed(im, c); g += gdImageGreen(im, c); b += gdImageBlue(im, c); total++; } } /* drawing */ if (total > 0) { c = gdImageColorResolveAlpha(im, r / total, g / total, b / total, a / total); gdImageFilledRectangle(im, x, y, x + block_size - 1, y + block_size - 1, c); } } } break; } return 1; } http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagepixelate/CMakeLists.txt?view=markup&rev=1.1 Index: gd/libgd/tests/gdimagepixelate/CMakeLists.txt +++ gd/libgd/tests/gdimagepixelate/CMakeLists.txt SET(TESTS_FILES gdimagepixelate ) FOREACH(test_name ${TESTS_FILES}) add_executable(${test_name} "${test_name}.c") target_link_libraries (${test_name} ${GDTESTS_TARGET_LINK}) ADD_TEST(${test_name} ${EXECUTABLE_OUTPUT_PATH}/${test_name}) ENDFOREACH(test_name) http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagepixelate/Makefile.am?view=markup&rev=1.1 Index: gd/libgd/tests/gdimagepixelate/Makefile.am +++ gd/libgd/tests/gdimagepixelate/Makefile.am ## Process this file with automake to produce Makefile.in -*-Makefile-*- AUTOMAKE_OPTIONS = foreign 1.7 EXTRA_DIST = CMakeLists.txt gdimagepixelate.c http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagepixelate/gdimagepixelate.c?view=markup&rev=1.1 Index: gd/libgd/tests/gdimagepixelate/gdimagepixelate.c +++ gd/libgd/tests/gdimagepixelate/gdimagepixelate.c #include "gdtest.h" #include "gd.h" #define WIDTH 12 #define BLOCK_SIZE 4 static const int expected_upperleft[][3] = { {0x000000, 0x040404, 0x080808}, {0x303030, 0x343434, 0x383838}, {0x606060, 0x646464, 0x686868} }; static const int expected_average[][3] = { {0x131313, 0x171717, 0x1b1b1b}, {0x434343, 0x474747, 0x4b4b4b}, {0x737373, 0x777777, 0x7b7b7b}, }; #define SETUP_PIXELS(im) do { \ int x, y, i = 0; \ for (y = 0; y < (im)->sy; y++) { \ for (x = 0; x < (im)->sx; x++) { \ int p = gdImageColorResolve(im, i, i, i); \ gdImageSetPixel(im, x, y, p); \ i++; \ } \ } \ } while (0) #define CHECK_PIXELS(im, expected) do { \ int x, y; \ for (y = 0; y < (im)->sy; y++) { \ for (x = 0; x < (im)->sx; x++) { \ int p = gdImageGetPixel(im, x, y); \ int r = ((expected)[y/BLOCK_SIZE][x/BLOCK_SIZE]>>16)&0xFF; \ int g = ((expected)[y/BLOCK_SIZE][x/BLOCK_SIZE]>> 8)&0xFF; \ int b = ((expected)[y/BLOCK_SIZE][x/BLOCK_SIZE] )&0xFF; \ if (r != gdImageRed(im, p)) { \ printf("Red %x is expected, but %x\n", r, gdImageRed(im, p)); \ return 0; \ } \ if (g != gdImageGreen(im, p)) { \ printf("Green %x is expected, but %x\n", g, gdImageGreen(im, p)); \ return 0; \ } \ if (b != gdImageBlue(im, p)) { \ printf("Blue %x is expected, but %x\n", b, gdImageBlue(im, p)); \ return 0; \ } \ } \ } \ } while (0) static int testPixelate(gdImagePtr im) { if (gdImagePixelate(im, -1, GD_PIXELATE_UPPERLEFT) != 0) return 0; if (gdImagePixelate(im, 1, GD_PIXELATE_UPPERLEFT) != 1) return 0; SETUP_PIXELS(im); if (!gdImagePixelate(im, BLOCK_SIZE, GD_PIXELATE_UPPERLEFT)) return 0; CHECK_PIXELS(im, expected_upperleft); SETUP_PIXELS(im); if (!gdImagePixelate(im, BLOCK_SIZE, GD_PIXELATE_AVERAGE)) return 0; CHECK_PIXELS(im, expected_average); return 1; } int main() { gdImagePtr im; im = gdImageCreate(WIDTH, WIDTH); if (!testPixelate(im)) { return 1; } gdImageDestroy(im); im = gdImageCreateTrueColor(WIDTH, WIDTH); if (!testPixelate(im)) { return 2; } gdImageDestroy(im); return 0; }
http://cvs.php.net/viewvc.cgi/gd/libgd/NEWS?r1=1.4&r2=1.5&diff_format=u Index: gd/libgd/NEWS diff -u gd/libgd/NEWS:1.4 gd/libgd/NEWS:1.5 --- gd/libgd/NEWS:1.4 Wed Nov 26 19:20:21 2008 +++ gd/libgd/NEWS Sun Dec 21 09:08:11 2008 @@ -3,6 +3,7 @@ GD HEAD 169, gdColorMapLookup() answers the RGB values according to given color map (Takeshi Abe) +184, new filter gdImagePixelate() by Kalle Sommer Nielsen (Takeshi Abe) GD 2.0.36 (2007-11-xx) 145, Fixed leak in gdImageCopyResized (Patch by Brent Bottles) http://cvs.php.net/viewvc.cgi/gd/libgd/src/CMakeLists.txt?r1=1.21&r2=1.22&diff_format=u Index: gd/libgd/src/CMakeLists.txt diff -u gd/libgd/src/CMakeLists.txt:1.21 gd/libgd/src/CMakeLists.txt:1.22 --- gd/libgd/src/CMakeLists.txt:1.21 Fri Dec 12 17:09:39 2008 +++ gd/libgd/src/CMakeLists.txt Sun Dec 21 09:08:11 2008 @@ -28,6 +28,7 @@ gd_jpeg.c gd_nnquant.c gd_nnquant.h + gd_pixelate.c gd_png.c gd_tiff.c gd_tga.c http://cvs.php.net/viewvc.cgi/gd/libgd/src/Makefile.am?r1=1.13&r2=1.14&diff_format=u Index: gd/libgd/src/Makefile.am diff -u gd/libgd/src/Makefile.am:1.13 gd/libgd/src/Makefile.am:1.14 --- gd/libgd/src/Makefile.am:1.13 Sun Nov 23 14:32:35 2008 +++ gd/libgd/src/Makefile.am Sun Dec 21 09:08:11 2008 @@ -13,7 +13,7 @@ lib_LTLIBRARIES = libgd.la -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_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 gd_pixelate.c libgd_la_LDFLAGS = -version-info 2:0:0 $(XTRA_LDFLAGS) http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd.h?r1=1.50&r2=1.51&diff_format=u Index: gd/libgd/src/gd.h diff -u gd/libgd/src/gd.h:1.50 gd/libgd/src/gd.h:1.51 --- gd/libgd/src/gd.h:1.50 Sun Nov 23 14:32:35 2008 +++ gd/libgd/src/gd.h Sun Dec 21 09:08:11 2008 @@ -770,6 +770,13 @@ BGD_DECLARE(gdImagePtr) gdImageNeuQuant(gdImagePtr im, const int max_color, int sample_factor); +enum gdPixelateMode { + GD_PIXELATE_UPPERLEFT, + GD_PIXELATE_AVERAGE +}; + +BGD_DECLARE(int) gdImagePixelate(gdImagePtr im, int block_size, const unsigned int mode); + /* Macros to access information about images. */ /* Returns nonzero if the image is a truecolor image, http://cvs.php.net/viewvc.cgi/gd/libgd/tests/CMakeLists.txt?r1=1.9&r2=1.10&diff_format=u Index: gd/libgd/tests/CMakeLists.txt diff -u gd/libgd/tests/CMakeLists.txt:1.9 gd/libgd/tests/CMakeLists.txt:1.10 --- gd/libgd/tests/CMakeLists.txt:1.9 Sun Nov 16 03:25:33 2008 +++ gd/libgd/tests/CMakeLists.txt Sun Dec 21 09:08:11 2008 @@ -30,6 +30,7 @@ gdimagecolordeallocate gdimagecolortransparent #gdimageellipse + gdimagepixelate gdimageline gdimagefilledellipse gdimagecopyrotated http://cvs.php.net/viewvc.cgi/gd/libgd/tests/Makefile.am?r1=1.3&r2=1.4&diff_format=u Index: gd/libgd/tests/Makefile.am diff -u gd/libgd/tests/Makefile.am:1.3 gd/libgd/tests/Makefile.am:1.4 --- gd/libgd/tests/Makefile.am:1.3 Sun Nov 16 03:25:33 2008 +++ gd/libgd/tests/Makefile.am Sun Dec 21 09:08:11 2008 @@ -1,7 +1,7 @@ ## Process this file with automake to produce Makefile.in -*-Makefile-*- AUTOMAKE_OPTIONS = foreign 1.7 -SUBDIRS = gd2 gdimagecolordeallocate gdimagecolortransparent gdimagefill gdimagefilltoborder gdtest jpeg gdimagearc gdimagecolorexact gdimagecopy gdimagefilledellipse gdimageline gdtiled freetype gdimagecolorclosest gdimagecolorreplace gdimagecolorresolve gdimagecopyrotated gdimagefilledrectangle gdimagerectangle gif png xpm +SUBDIRS = gd2 gdimagecolordeallocate gdimagecolortransparent gdimagefill gdimagefilltoborder gdtest jpeg gdimagearc gdimagecolorexact gdimagecopy gdimagefilledellipse gdimageline gdimagepixelate gdtiled freetype gdimagecolorclosest gdimagecolorreplace gdimagecolorresolve gdimagecopyrotated gdimagefilledrectangle gdimagerectangle gif png xpm EXTRA_DIST = CMakeLists.txt http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd_pixelate.c?view=markup&rev=1.1 Index: gd/libgd/src/gd_pixelate.c +++ gd/libgd/src/gd_pixelate.c #include "gd.h" int gdImagePixelate(gdImagePtr im, int block_size, const unsigned int mode) { int x, y; if (block_size <= 0) { return 0; } else if (block_size == 1) { return 1; } switch (mode) { case GD_PIXELATE_UPPERLEFT: for (y = 0; y < im->sy; y += block_size) { for (x = 0; x < im->sx; x += block_size) { if (gdImageBoundsSafe(im, x, y)) { int c = gdImageGetPixel(im, x, y); gdImageFilledRectangle(im, x, y, x + block_size - 1, y + block_size - 1, c); } } } break; case GD_PIXELATE_AVERAGE: for (y = 0; y < im->sy; y += block_size) { for (x = 0; x < im->sx; x += block_size) { int a, r, g, b, c; int total; int cx, cy; a = r = g = b = c = total = 0; /* sampling */ for (cy = 0; cy < block_size; cy++) { for (cx = 0; cx < block_size; cx++) { if (!gdImageBoundsSafe(im, x + cx, y + cy)) { continue; } c = gdImageGetPixel(im, x + cx, y + cy); a += gdImageAlpha(im, c); r += gdImageRed(im, c); g += gdImageGreen(im, c); b += gdImageBlue(im, c); total++; } } /* drawing */ if (total > 0) { c = gdImageColorResolveAlpha(im, r / total, g / total, b / total, a / total); gdImageFilledRectangle(im, x, y, x + block_size - 1, y + block_size - 1, c); } } } break; } return 1; } http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagepixelate/CMakeLists.txt?view=markup&rev=1.1 Index: gd/libgd/tests/gdimagepixelate/CMakeLists.txt +++ gd/libgd/tests/gdimagepixelate/CMakeLists.txt SET(TESTS_FILES gdimagepixelate ) FOREACH(test_name ${TESTS_FILES}) add_executable(${test_name} "${test_name}.c") target_link_libraries (${test_name} ${GDTESTS_TARGET_LINK}) ADD_TEST(${test_name} ${EXECUTABLE_OUTPUT_PATH}/${test_name}) ENDFOREACH(test_name) http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagepixelate/Makefile.am?view=markup&rev=1.1 Index: gd/libgd/tests/gdimagepixelate/Makefile.am +++ gd/libgd/tests/gdimagepixelate/Makefile.am ## Process this file with automake to produce Makefile.in -*-Makefile-*- AUTOMAKE_OPTIONS = foreign 1.7 EXTRA_DIST = CMakeLists.txt gdimagepixelate.c http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagepixelate/gdimagepixelate.c?view=markup&rev=1.1 Index: gd/libgd/tests/gdimagepixelate/gdimagepixelate.c +++ gd/libgd/tests/gdimagepixelate/gdimagepixelate.c #include "gdtest.h" #include "gd.h" #define WIDTH 12 #define BLOCK_SIZE 4 static const int expected_upperleft[][3] = { {0x000000, 0x040404, 0x080808}, {0x303030, 0x343434, 0x383838}, {0x606060, 0x646464, 0x686868} }; static const int expected_average[][3] = { {0x131313, 0x171717, 0x1b1b1b}, {0x434343, 0x474747, 0x4b4b4b}, {0x737373, 0x777777, 0x7b7b7b}, }; #define SETUP_PIXELS(im) do { \ int x, y, i = 0; \ for (y = 0; y < (im)->sy; y++) { \ for (x = 0; x < (im)->sx; x++) { \ int p = gdImageColorResolve(im, i, i, i); \ gdImageSetPixel(im, x, y, p); \ i++; \ } \ } \ } while (0) #define CHECK_PIXELS(im, expected) do { \ int x, y; \ for (y = 0; y < (im)->sy; y++) { \ for (x = 0; x < (im)->sx; x++) { \ int p = gdImageGetPixel(im, x, y); \ int r = ((expected)[y/BLOCK_SIZE][x/BLOCK_SIZE]>>16)&0xFF; \ int g = ((expected)[y/BLOCK_SIZE][x/BLOCK_SIZE]>> 8)&0xFF; \ int b = ((expected)[y/BLOCK_SIZE][x/BLOCK_SIZE] )&0xFF; \ if (r != gdImageRed(im, p)) { \ printf("Red %x is expected, but %x\n", r, gdImageRed(im, p)); \ return 0; \ } \ if (g != gdImageGreen(im, p)) { \ printf("Green %x is expected, but %x\n", g, gdImageGreen(im, p)); \ return 0; \ } \ if (b != gdImageBlue(im, p)) { \ printf("Blue %x is expected, but %x\n", b, gdImageBlue(im, p)); \ return 0; \ } \ } \ } \ } while (0) static int testPixelate(gdImagePtr im) { if (gdImagePixelate(im, -1, GD_PIXELATE_UPPERLEFT) != 0) return 0; if (gdImagePixelate(im, 1, GD_PIXELATE_UPPERLEFT) != 1) return 0; SETUP_PIXELS(im); if (!gdImagePixelate(im, BLOCK_SIZE, GD_PIXELATE_UPPERLEFT)) return 0; CHECK_PIXELS(im, expected_upperleft); SETUP_PIXELS(im); if (!gdImagePixelate(im, BLOCK_SIZE, GD_PIXELATE_AVERAGE)) return 0; CHECK_PIXELS(im, expected_average); return 1; } int main() { gdImagePtr im; im = gdImageCreate(WIDTH, WIDTH); if (!testPixelate(im)) { return 1; } gdImageDestroy(im); im = gdImageCreateTrueColor(WIDTH, WIDTH); if (!testPixelate(im)) { return 2; } gdImageDestroy(im); return 0; }