cvs: gd /libgd/src gd.c gd.h /libgd/tests CMakeLists.txt Makefile.am /libgd/tests/gdimagecolorreplace .cvsignore CMakeLists.txt Makefile.am
gdimagecolorreplace.c
| From: | Takeshi Abe | Date: | Sun, 16 Nov 2008 03:25:33 +0000 |
| Subject: | cvs: gd /libgd/src gd.c gd.h /libgd/tests CMakeLists.txt Makefile.am /libgd/tests/gdimagecolorreplace .cvsignore CMakeLists.txt Makefile.am gdimagecolorreplace.c |
||
| Groups: | php.gd.cvs | ||
| Request: | Send a blank email to php-gd-cvs+get-545@lists.php.net to get a copy of this message | ||
tabe Sun Nov 16 03:25:33 2008 UTC
Added files:
/gd/libgd/tests/gdimagecolorreplace .cvsignore CMakeLists.txt
Makefile.am
gdimagecolorreplace.c
Modified files:
/gd/libgd/src gd.c gd.h
/gd/libgd/tests CMakeLists.txt Makefile.am
Log:
added gdImageColorReplace, gdImageColorReplaceArray, and gdImageColorReplaceCallback. (see FS#170)
http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd.c?r1=1.75&r2=1.76&diff_format=u Index: gd/libgd/src/gd.c diff -u gd/libgd/src/gd.c:1.75 gd/libgd/src/gd.c:1.76 --- gd/libgd/src/gd.c:1.75 Fri Feb 1 01:48:17 2008 +++ gd/libgd/src/gd.c Sun Nov 16 03:25:33 2008 @@ -1,4 +1,4 @@ -/* $Id: gd.c,v 1.75 2008/02/01 01:48:17 pajoye Exp $ */ +/* $Id: gd.c,v 1.76 2008/11/16 03:25:33 tabe Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -675,6 +675,119 @@ } +BGD_DECLARE(int) gdImageColorReplace (gdImagePtr im, int src, int dst) +{ + int x, y, 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 (pixel(im, x, y) == src) { \ + gdImageSetPixel(im, x, y, dst); \ + n++; \ + } \ + } \ + } \ + } while (0) + + if (im->trueColor) { + REPLACING_LOOP(gdImageTrueColorPixel); + } else { + REPLACING_LOOP(gdImagePalettePixel); + } + +#undef REPLACING_LOOP + + return n; +} + +BGD_DECLARE(int) gdImageColorReplaceArray (gdImagePtr im, unsigned int len, int *src, int *dst) +{ + int x, y, c, n = 0; + unsigned int i; + + if (len == 0) { + return 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++) { \ + c = pixel(im, x, y); \ + for (i = 0; i < len; i++) { \ + if (c == src[i] && c != dst[i]) { \ + gdImageSetPixel(im, x, y, dst[i]); \ + n++; \ + break; \ + } \ + } \ + } \ + } \ + } while (0) + + if (im->trueColor) { + REPLACING_LOOP(gdImageTrueColorPixel); + } else { + REPLACING_LOOP(gdImagePalettePixel); + } + +#undef REPLACING_LOOP + + return n; +} + +BGD_DECLARE(int) gdImageColorReplaceCallback (gdImagePtr im, int (*callback)(gdImagePtr imx, int src)) +{ + int x, y, c, d, n = 0; + + if (!callback) { + return 0; + } + if (im->trueColor) { + for (y = im->cy1; y <= im->cy2; y++) { + for (x = im->cx1; x <= im->cx2; x++) { + c = gdImageTrueColorPixel(im, x, y); + if ( (d = callback(im, c)) != c) { + gdImageSetPixel(im, x, y, d); + n++; + } + } + } + } else { /* palette */ + int *sarr, *darr; + unsigned int k, len = 0; + + sarr = (int *)gdCalloc(im->colorsTotal, sizeof(int)); + if (!sarr) { + return -1; + } + for (c = 0; c < im->colorsTotal; c++) { + if (!im->open[c]) { + sarr[len++] = c; + } + } + darr = (int *)gdCalloc(len, sizeof(int)); + if (!darr) { + gdFree(sarr); + return -1; + } + for (k = 0; k < len; k++) { + darr[k] = callback(im, sarr[k]); + } + n = gdImageColorReplaceArray(im, k, sarr, darr); + gdFree(darr); + gdFree(sarr); + } + return n; +} + /* 2.0.10: before the drawing routines, some code to clip points that are * outside the drawing window. Nick Atty (nick@canalplan.org.uk) * http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd.h?r1=1.47&r2=1.48&diff_format=u Index: gd/libgd/src/gd.h diff -u gd/libgd/src/gd.h:1.47 gd/libgd/src/gd.h:1.48 --- gd/libgd/src/gd.h:1.47 Sat May 31 19:51:14 2008 +++ gd/libgd/src/gd.h Sun Nov 16 03:25:33 2008 @@ -585,6 +585,11 @@ BGD_DECLARE(void) gdImageColorTransparent (gdImagePtr im, int color); BGD_DECLARE(void) gdImagePaletteCopy (gdImagePtr dst, gdImagePtr src); + +BGD_DECLARE(int) gdImageColorReplace(gdImagePtr im, int src, int dst); +BGD_DECLARE(int) gdImageColorReplaceArray(gdImagePtr im, unsigned int len, int *src, int *dst); +BGD_DECLARE(int) gdImageColorReplaceCallback(gdImagePtr im, int (*callback)(gdImagePtr imx, int src)); + BGD_DECLARE(void) gdImageGif (gdImagePtr im, FILE * out); BGD_DECLARE(void) gdImagePng (gdImagePtr im, FILE * out); BGD_DECLARE(void) gdImagePngCtx (gdImagePtr im, gdIOCtx * out); http://cvs.php.net/viewvc.cgi/gd/libgd/tests/CMakeLists.txt?r1=1.8&r2=1.9&diff_format=u Index: gd/libgd/tests/CMakeLists.txt diff -u gd/libgd/tests/CMakeLists.txt:1.8 gd/libgd/tests/CMakeLists.txt:1.9 --- gd/libgd/tests/CMakeLists.txt:1.8 Thu Aug 14 10:41:57 2008 +++ gd/libgd/tests/CMakeLists.txt Sun Nov 16 03:25:33 2008 @@ -25,6 +25,7 @@ gdimagearc gdimagecolorclosest gdimagecolorexact + gdimagecolorreplace gdimagecolorresolve gdimagecolordeallocate gdimagecolortransparent http://cvs.php.net/viewvc.cgi/gd/libgd/tests/Makefile.am?r1=1.2&r2=1.3&diff_format=u Index: gd/libgd/tests/Makefile.am diff -u gd/libgd/tests/Makefile.am:1.2 gd/libgd/tests/Makefile.am:1.3 --- gd/libgd/tests/Makefile.am:1.2 Thu Aug 14 10:41:57 2008 +++ gd/libgd/tests/Makefile.am Sun Nov 16 03:25:33 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 gdimagecolorresolve gdimagecopyrotated gdimagefilledrectangle gdimagerectangle gif png xpm +SUBDIRS = gd2 gdimagecolordeallocate gdimagecolortransparent gdimagefill gdimagefilltoborder gdtest jpeg gdimagearc gdimagecolorexact gdimagecopy gdimagefilledellipse gdimageline gdtiled freetype gdimagecolorclosest gdimagecolorreplace gdimagecolorresolve gdimagecopyrotated gdimagefilledrectangle gdimagerectangle gif png xpm EXTRA_DIST = CMakeLists.txt http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagecolorreplace/.cvsignore?view=markup&rev=1.1 Index: gd/libgd/tests/gdimagecolorreplace/.cvsignore +++ gd/libgd/tests/gdimagecolorreplace/.cvsignore CMakeFiles DartTestfile.txt Makefile cmake_install.cmake gdimagecolorreplace http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagecolorreplace/CMakeLists.txt?view=markup&rev=1.1 Index: gd/libgd/tests/gdimagecolorreplace/CMakeLists.txt +++ gd/libgd/tests/gdimagecolorreplace/CMakeLists.txt SET(TESTS_FILES gdimagecolorreplace ) FOREACH(test_name ${TESTS_FILES}) add_executable(${test_name} "${test_name}.c") target_link_libraries (${test_name} gdTest ${GDTESTS_TARGET_LINK}) ADD_TEST("${test_name}" ${EXECUTABLE_OUTPUT_PATH}/${test_name}) ENDFOREACH(test_name) http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagecolorreplace/Makefile.am?view=markup&rev=1.1 Index: gd/libgd/tests/gdimagecolorreplace/Makefile.am +++ gd/libgd/tests/gdimagecolorreplace/Makefile.am ## Process this file with automake to produce Makefile.in -*-Makefile-*- EXTRA_DIST = CMakeLists.txt gdimagecolorreplace.c http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c?view=markup&rev=1.1 Index: gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c +++ gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c #include <gd.h> #include <stdio.h> #include "gdtest.h" static int callback(gdImagePtr im, int src) { int r, g, b; r = gdImageRed(im, src); g = gdImageGreen(im, src); b = gdImageBlue(im, src); if (b & 0xFF) { return gdImageColorResolve(im, 0x0F & r, 0x0F & g, 0); } else { return -1; } } static void run_tests(gdImagePtr im, int *error) { int white, black, c, d; int src[2], dst[2]; int n; #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)); \ if (gdTestAssert(c == (expected)) != 1) { \ printf("%d is expected, but %d\n", expected, c); \ *error = -1; \ } \ } 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); n = gdImageColorReplace(im, white, c); CHECK_VALUE(n, 9); CHECK_PIXEL(0, 0, black); CHECK_PIXEL(2, 3, black); CHECK_PIXEL(4, 4, c); gdImageSetClip(im, 1, 1, 3, 3); n = gdImageColorReplace(im, black, c); CHECK_VALUE(n, 9); CHECK_PIXEL(0, 0, black); CHECK_PIXEL(2, 3, c); src[0] = black; src[1] = c; dst[0] = c; dst[1] = white; gdImageSetClip(im, 0, 0, 4, 4); n = gdImageColorReplaceArray(im, 2, src, dst); CHECK_VALUE(n, 25); CHECK_PIXEL(0, 0, c); CHECK_PIXEL(2, 3, white); CHECK_PIXEL(4, 4, white); gdImageSetClip(im, 1, 1, 4, 4); n = gdImageColorReplaceCallback(im, callback); CHECK_VALUE(n, 16); CHECK_PIXEL(0, 0, c); CHECK_PIXEL(0, 4, white); d = gdImageColorExact(im, 0x0F, 0x0F, 0); if (gdTestAssert(d > 0) != 1) { *error = -1; } CHECK_PIXEL(2, 3, d); CHECK_PIXEL(4, 4, d); #undef CHECK_VALUE #undef CHECK_PIXEL } int main() { gdImagePtr im; int error = 0; /* true color */ im = gdImageCreateTrueColor(5, 5); run_tests(im, &error); gdImageDestroy(im); /* palette */ im = gdImageCreate(5, 5); run_tests(im, &error); gdImageDestroy(im); return error; }
http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd.c?r1=1.75&r2=1.76&diff_format=u Index: gd/libgd/src/gd.c diff -u gd/libgd/src/gd.c:1.75 gd/libgd/src/gd.c:1.76 --- gd/libgd/src/gd.c:1.75 Fri Feb 1 01:48:17 2008 +++ gd/libgd/src/gd.c Sun Nov 16 03:25:33 2008 @@ -1,4 +1,4 @@ -/* $Id: gd.c,v 1.75 2008/02/01 01:48:17 pajoye Exp $ */ +/* $Id: gd.c,v 1.76 2008/11/16 03:25:33 tabe Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -675,6 +675,119 @@ } +BGD_DECLARE(int) gdImageColorReplace (gdImagePtr im, int src, int dst) +{ + int x, y, 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 (pixel(im, x, y) == src) { \ + gdImageSetPixel(im, x, y, dst); \ + n++; \ + } \ + } \ + } \ + } while (0) + + if (im->trueColor) { + REPLACING_LOOP(gdImageTrueColorPixel); + } else { + REPLACING_LOOP(gdImagePalettePixel); + } + +#undef REPLACING_LOOP + + return n; +} + +BGD_DECLARE(int) gdImageColorReplaceArray (gdImagePtr im, unsigned int len, int *src, int *dst) +{ + int x, y, c, n = 0; + unsigned int i; + + if (len == 0) { + return 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++) { \ + c = pixel(im, x, y); \ + for (i = 0; i < len; i++) { \ + if (c == src[i] && c != dst[i]) { \ + gdImageSetPixel(im, x, y, dst[i]); \ + n++; \ + break; \ + } \ + } \ + } \ + } \ + } while (0) + + if (im->trueColor) { + REPLACING_LOOP(gdImageTrueColorPixel); + } else { + REPLACING_LOOP(gdImagePalettePixel); + } + +#undef REPLACING_LOOP + + return n; +} + +BGD_DECLARE(int) gdImageColorReplaceCallback (gdImagePtr im, int (*callback)(gdImagePtr imx, int src)) +{ + int x, y, c, d, n = 0; + + if (!callback) { + return 0; + } + if (im->trueColor) { + for (y = im->cy1; y <= im->cy2; y++) { + for (x = im->cx1; x <= im->cx2; x++) { + c = gdImageTrueColorPixel(im, x, y); + if ( (d = callback(im, c)) != c) { + gdImageSetPixel(im, x, y, d); + n++; + } + } + } + } else { /* palette */ + int *sarr, *darr; + unsigned int k, len = 0; + + sarr = (int *)gdCalloc(im->colorsTotal, sizeof(int)); + if (!sarr) { + return -1; + } + for (c = 0; c < im->colorsTotal; c++) { + if (!im->open[c]) { + sarr[len++] = c; + } + } + darr = (int *)gdCalloc(len, sizeof(int)); + if (!darr) { + gdFree(sarr); + return -1; + } + for (k = 0; k < len; k++) { + darr[k] = callback(im, sarr[k]); + } + n = gdImageColorReplaceArray(im, k, sarr, darr); + gdFree(darr); + gdFree(sarr); + } + return n; +} + /* 2.0.10: before the drawing routines, some code to clip points that are * outside the drawing window. Nick Atty (nick@canalplan.org.uk) * http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd.h?r1=1.47&r2=1.48&diff_format=u Index: gd/libgd/src/gd.h diff -u gd/libgd/src/gd.h:1.47 gd/libgd/src/gd.h:1.48 --- gd/libgd/src/gd.h:1.47 Sat May 31 19:51:14 2008 +++ gd/libgd/src/gd.h Sun Nov 16 03:25:33 2008 @@ -585,6 +585,11 @@ BGD_DECLARE(void) gdImageColorTransparent (gdImagePtr im, int color); BGD_DECLARE(void) gdImagePaletteCopy (gdImagePtr dst, gdImagePtr src); + +BGD_DECLARE(int) gdImageColorReplace(gdImagePtr im, int src, int dst); +BGD_DECLARE(int) gdImageColorReplaceArray(gdImagePtr im, unsigned int len, int *src, int *dst); +BGD_DECLARE(int) gdImageColorReplaceCallback(gdImagePtr im, int (*callback)(gdImagePtr imx, int src)); + BGD_DECLARE(void) gdImageGif (gdImagePtr im, FILE * out); BGD_DECLARE(void) gdImagePng (gdImagePtr im, FILE * out); BGD_DECLARE(void) gdImagePngCtx (gdImagePtr im, gdIOCtx * out); http://cvs.php.net/viewvc.cgi/gd/libgd/tests/CMakeLists.txt?r1=1.8&r2=1.9&diff_format=u Index: gd/libgd/tests/CMakeLists.txt diff -u gd/libgd/tests/CMakeLists.txt:1.8 gd/libgd/tests/CMakeLists.txt:1.9 --- gd/libgd/tests/CMakeLists.txt:1.8 Thu Aug 14 10:41:57 2008 +++ gd/libgd/tests/CMakeLists.txt Sun Nov 16 03:25:33 2008 @@ -25,6 +25,7 @@ gdimagearc gdimagecolorclosest gdimagecolorexact + gdimagecolorreplace gdimagecolorresolve gdimagecolordeallocate gdimagecolortransparent http://cvs.php.net/viewvc.cgi/gd/libgd/tests/Makefile.am?r1=1.2&r2=1.3&diff_format=u Index: gd/libgd/tests/Makefile.am diff -u gd/libgd/tests/Makefile.am:1.2 gd/libgd/tests/Makefile.am:1.3 --- gd/libgd/tests/Makefile.am:1.2 Thu Aug 14 10:41:57 2008 +++ gd/libgd/tests/Makefile.am Sun Nov 16 03:25:33 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 gdimagecolorresolve gdimagecopyrotated gdimagefilledrectangle gdimagerectangle gif png xpm +SUBDIRS = gd2 gdimagecolordeallocate gdimagecolortransparent gdimagefill gdimagefilltoborder gdtest jpeg gdimagearc gdimagecolorexact gdimagecopy gdimagefilledellipse gdimageline gdtiled freetype gdimagecolorclosest gdimagecolorreplace gdimagecolorresolve gdimagecopyrotated gdimagefilledrectangle gdimagerectangle gif png xpm EXTRA_DIST = CMakeLists.txt http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagecolorreplace/.cvsignore?view=markup&rev=1.1 Index: gd/libgd/tests/gdimagecolorreplace/.cvsignore +++ gd/libgd/tests/gdimagecolorreplace/.cvsignore CMakeFiles DartTestfile.txt Makefile cmake_install.cmake gdimagecolorreplace http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagecolorreplace/CMakeLists.txt?view=markup&rev=1.1 Index: gd/libgd/tests/gdimagecolorreplace/CMakeLists.txt +++ gd/libgd/tests/gdimagecolorreplace/CMakeLists.txt SET(TESTS_FILES gdimagecolorreplace ) FOREACH(test_name ${TESTS_FILES}) add_executable(${test_name} "${test_name}.c") target_link_libraries (${test_name} gdTest ${GDTESTS_TARGET_LINK}) ADD_TEST("${test_name}" ${EXECUTABLE_OUTPUT_PATH}/${test_name}) ENDFOREACH(test_name) http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagecolorreplace/Makefile.am?view=markup&rev=1.1 Index: gd/libgd/tests/gdimagecolorreplace/Makefile.am +++ gd/libgd/tests/gdimagecolorreplace/Makefile.am ## Process this file with automake to produce Makefile.in -*-Makefile-*- EXTRA_DIST = CMakeLists.txt gdimagecolorreplace.c http://cvs.php.net/viewvc.cgi/gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c?view=markup&rev=1.1 Index: gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c +++ gd/libgd/tests/gdimagecolorreplace/gdimagecolorreplace.c #include <gd.h> #include <stdio.h> #include "gdtest.h" static int callback(gdImagePtr im, int src) { int r, g, b; r = gdImageRed(im, src); g = gdImageGreen(im, src); b = gdImageBlue(im, src); if (b & 0xFF) { return gdImageColorResolve(im, 0x0F & r, 0x0F & g, 0); } else { return -1; } } static void run_tests(gdImagePtr im, int *error) { int white, black, c, d; int src[2], dst[2]; int n; #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)); \ if (gdTestAssert(c == (expected)) != 1) { \ printf("%d is expected, but %d\n", expected, c); \ *error = -1; \ } \ } 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); n = gdImageColorReplace(im, white, c); CHECK_VALUE(n, 9); CHECK_PIXEL(0, 0, black); CHECK_PIXEL(2, 3, black); CHECK_PIXEL(4, 4, c); gdImageSetClip(im, 1, 1, 3, 3); n = gdImageColorReplace(im, black, c); CHECK_VALUE(n, 9); CHECK_PIXEL(0, 0, black); CHECK_PIXEL(2, 3, c); src[0] = black; src[1] = c; dst[0] = c; dst[1] = white; gdImageSetClip(im, 0, 0, 4, 4); n = gdImageColorReplaceArray(im, 2, src, dst); CHECK_VALUE(n, 25); CHECK_PIXEL(0, 0, c); CHECK_PIXEL(2, 3, white); CHECK_PIXEL(4, 4, white); gdImageSetClip(im, 1, 1, 4, 4); n = gdImageColorReplaceCallback(im, callback); CHECK_VALUE(n, 16); CHECK_PIXEL(0, 0, c); CHECK_PIXEL(0, 4, white); d = gdImageColorExact(im, 0x0F, 0x0F, 0); if (gdTestAssert(d > 0) != 1) { *error = -1; } CHECK_PIXEL(2, 3, d); CHECK_PIXEL(4, 4, d); #undef CHECK_VALUE #undef CHECK_PIXEL } int main() { gdImagePtr im; int error = 0; /* true color */ im = gdImageCreateTrueColor(5, 5); run_tests(im, &error); gdImageDestroy(im); /* palette */ im = gdImageCreate(5, 5); run_tests(im, &error); gdImageDestroy(im); return error; }