|
Packit Service |
df60bb |
#include <stdio.h>
|
|
Packit Service |
df60bb |
#include <stdlib.h>
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
#include "gd.h"
|
|
Packit Service |
df60bb |
#include "gdtest.h"
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
#define WIDTH 300
|
|
Packit Service |
df60bb |
#define HEIGHT 200
|
|
Packit Service |
df60bb |
#define LX (WIDTH/2) // Line X
|
|
Packit Service |
df60bb |
#define LY (HEIGHT/2) // Line Y
|
|
Packit Service |
df60bb |
#define HT 3 // Half of line-thickness
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
#define CLOSE_ENOUGH 0
|
|
Packit Service |
df60bb |
#define PIXEL_CLOSE_ENOUGH 0
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
void
|
|
Packit Service |
df60bb |
save(gdImagePtr im, const char *filename) {
|
|
Packit Service |
df60bb |
#if 0 // set TRUE to write out some intermediate images
|
|
Packit Service |
df60bb |
FILE *out;
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
out = fopen(filename, "wb");
|
|
Packit Service |
df60bb |
gdImagePng(im, out);
|
|
Packit Service |
df60bb |
fclose(out);
|
|
Packit Service |
df60bb |
#else
|
|
Packit Service |
df60bb |
(void)im, (void)filename;
|
|
Packit Service |
df60bb |
#endif
|
|
Packit Service |
df60bb |
}/* save*/
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* Test gdImageScale() with bicubic interpolation on a simple
|
|
Packit Service |
df60bb |
* all-white image. */
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
gdImagePtr mkwhite(int x, int y)
|
|
Packit Service |
df60bb |
{
|
|
Packit Service |
df60bb |
gdImagePtr im;
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
im = gdImageCreateTrueColor(x, y);
|
|
Packit Service |
df60bb |
gdImageFilledRectangle(im, 0, 0, x-1, y-1,
|
|
Packit Service |
df60bb |
gdImageColorExactAlpha(im, 255, 255, 255, 0));
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
gdTestAssert(im != NULL);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
gdImageSetInterpolationMethod(im, GD_BICUBIC); // FP interp'n
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
return im;
|
|
Packit Service |
df60bb |
}/* mkwhite*/
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* Fill with almost-black. */
|
|
Packit Service |
df60bb |
void mkblack(gdImagePtr ptr)
|
|
Packit Service |
df60bb |
{
|
|
Packit Service |
df60bb |
gdImageFilledRectangle(ptr, 0, 0, ptr->sx - 1, ptr->sy - 1,
|
|
Packit Service |
df60bb |
gdImageColorExactAlpha(ptr, 2, 2, 2, 0));
|
|
Packit Service |
df60bb |
}/* mkblack*/
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
gdImagePtr mkcross() {
|
|
Packit Service |
df60bb |
gdImagePtr im;
|
|
Packit Service |
df60bb |
int fg, n;
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
im = mkwhite(WIDTH, HEIGHT);
|
|
Packit Service |
df60bb |
fg = gdImageColorAllocate(im, 0, 0, 0);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
for (n = -HT; n < HT; n++) {
|
|
Packit Service |
df60bb |
gdImageLine(im, LX-n, 0, LX-n, HEIGHT-1, fg);
|
|
Packit Service |
df60bb |
gdImageLine(im, 0, LY-n, WIDTH-1, LY-n, fg);
|
|
Packit Service |
df60bb |
}/* for */
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
return im;
|
|
Packit Service |
df60bb |
}/* mkcross*/
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
void blurblank(gdImagePtr im, int radius, double sigma) {
|
|
Packit Service |
df60bb |
gdImagePtr result;
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
result = gdImageCopyGaussianBlurred(im, radius, sigma);
|
|
Packit Service |
df60bb |
gdTestAssert(!!result);
|
|
Packit Service |
df60bb |
if (!result) return;
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
gdTestAssert(gdMaxPixelDiff(im, result) <= CLOSE_ENOUGH);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
gdImageDestroy(result);
|
|
Packit Service |
df60bb |
}/* blurblank*/
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
void do_test()
|
|
Packit Service |
df60bb |
{
|
|
Packit Service |
df60bb |
gdImagePtr im, imref;
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
im = mkwhite(WIDTH, HEIGHT);
|
|
Packit Service |
df60bb |
imref = mkwhite(WIDTH, HEIGHT);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* Blur a plain white image to various radii and ensure they're
|
|
Packit Service |
df60bb |
* still similar enough. */
|
|
Packit Service |
df60bb |
blurblank(im, 1, 0.0);
|
|
Packit Service |
df60bb |
blurblank(im, 2, 0.0);
|
|
Packit Service |
df60bb |
blurblank(im, 4, 0.0);
|
|
Packit Service |
df60bb |
blurblank(im, 8, 0.0);
|
|
Packit Service |
df60bb |
blurblank(im, 16, 0.0);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* Ditto a black image. */
|
|
Packit Service |
df60bb |
mkblack(im);
|
|
Packit Service |
df60bb |
gdTestAssert(gdMaxPixelDiff(im, imref) >= 240); /* Leaves a little wiggle room */
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
blurblank(im, 1, 0.0);
|
|
Packit Service |
df60bb |
blurblank(im, 2, 0.0);
|
|
Packit Service |
df60bb |
blurblank(im, 4, 0.0);
|
|
Packit Service |
df60bb |
blurblank(im, 8, 0.0);
|
|
Packit Service |
df60bb |
blurblank(im, 16, 0.0);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
gdImageDestroy(im);
|
|
Packit Service |
df60bb |
gdImageDestroy(imref);
|
|
Packit Service |
df60bb |
}/* do_test*/
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* Ensure that RGB values are equal, then return r (which is therefore
|
|
Packit Service |
df60bb |
* the whiteness.) */
|
|
Packit Service |
df60bb |
int getwhite(gdImagePtr im, int x, int y)
|
|
Packit Service |
df60bb |
{
|
|
Packit Service |
df60bb |
int px, r, g, b;
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
px = gdImageGetPixel(im, x, y);
|
|
Packit Service |
df60bb |
r = gdImageRed(im, px);
|
|
Packit Service |
df60bb |
g = gdImageGreen(im, px);
|
|
Packit Service |
df60bb |
b = gdImageBlue(im, px);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
gdTestAssert(r == g && r == b);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
return r;
|
|
Packit Service |
df60bb |
}/* getrgb*/
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
int whitecmp(gdImagePtr im1, gdImagePtr im2, int x, int y) {
|
|
Packit Service |
df60bb |
int w1, w2;
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
w1 = getwhite(im1, x, y);
|
|
Packit Service |
df60bb |
w2 = getwhite(im2, x, y);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
return abs(w1 - w2);
|
|
Packit Service |
df60bb |
}/* whitediff*/
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
void do_crosstest()
|
|
Packit Service |
df60bb |
{
|
|
Packit Service |
df60bb |
gdImagePtr im = mkcross();
|
|
Packit Service |
df60bb |
gdImagePtr blurred;
|
|
Packit Service |
df60bb |
const int RADIUS = 16;
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
gdTestAssert(!!im);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
save(im, "cross.png");
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
blurred = gdImageCopyGaussianBlurred(im, RADIUS, 0.0);
|
|
Packit Service |
df60bb |
gdTestAssert(blurred != NULL);
|
|
Packit Service |
df60bb |
save(blurred, "blurredcross.png");
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* These spots shouldn't be affected. */
|
|
Packit Service |
df60bb |
gdTestAssert(whitecmp(im, blurred, 5, 5) <= PIXEL_CLOSE_ENOUGH);
|
|
Packit Service |
df60bb |
gdTestAssert(whitecmp(im, blurred, WIDTH-5, 5) <= PIXEL_CLOSE_ENOUGH);
|
|
Packit Service |
df60bb |
gdTestAssert(whitecmp(im, blurred, 5, HEIGHT-5) <= PIXEL_CLOSE_ENOUGH);
|
|
Packit Service |
df60bb |
gdTestAssert(whitecmp(im, blurred, WIDTH-5, HEIGHT-5) <= PIXEL_CLOSE_ENOUGH);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
// printf("%d %d %d %d\n", whitecmp(im, blurred, 0, 0), whitecmp(im, blurred, WIDTH-1, 0),
|
|
Packit Service |
df60bb |
// whitecmp(im, blurred, 0, HEIGHT-1), whitecmp(im, blurred, WIDTH-1, HEIGHT-1));
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* Ditto these, right in the corners */
|
|
Packit Service |
df60bb |
gdTestAssert(whitecmp(im, blurred, 0, 0) <= PIXEL_CLOSE_ENOUGH);
|
|
Packit Service |
df60bb |
gdTestAssert(whitecmp(im, blurred, WIDTH-1, 0) <= PIXEL_CLOSE_ENOUGH);
|
|
Packit Service |
df60bb |
gdTestAssert(whitecmp(im, blurred, 0, HEIGHT-1) <= PIXEL_CLOSE_ENOUGH);
|
|
Packit Service |
df60bb |
gdTestAssert(whitecmp(im, blurred, WIDTH-1, HEIGHT-1) <= PIXEL_CLOSE_ENOUGH);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* Now, poking let's poke around the blurred lines. */
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* Vertical line gets darker when approached from the left. */
|
|
Packit Service |
df60bb |
gdTestAssert(getwhite(blurred, 1, 1) > getwhite(blurred, LX - (HT - 1), 1));
|
|
Packit Service |
df60bb |
gdTestAssert(getwhite(blurred, LX - 2, 1) > getwhite(blurred, LX - 1, 1));
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* ...and lighter when moving away to the right. */
|
|
Packit Service |
df60bb |
gdTestAssert(getwhite(blurred, LX + 2, 1) >= getwhite(blurred, LX + 1, 1));
|
|
Packit Service |
df60bb |
gdTestAssert(getwhite(blurred, LX + 3, 1) >= getwhite(blurred, LX + 2, 1));
|
|
Packit Service |
df60bb |
gdTestAssert(getwhite(blurred, WIDTH - 1, 1) > getwhite(blurred, LX + 1, 1));
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* And the same way, vertically */
|
|
Packit Service |
df60bb |
gdTestAssert(getwhite(blurred, 1, 1) > getwhite(blurred, 1, LY - (HT - 1)));
|
|
Packit Service |
df60bb |
gdTestAssert(getwhite(blurred, 1, LY - (HT - 1)) > getwhite(blurred, 1, LY - (HT - 2)));
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
gdTestAssert(getwhite(blurred, 1, LY) <= getwhite(blurred, 1, LY + 1));
|
|
Packit Service |
df60bb |
gdTestAssert(getwhite(blurred, 1, LY + 1) < getwhite(blurred, 1, LY + 3));
|
|
Packit Service |
df60bb |
gdTestAssert(getwhite(blurred, 1, LY + 3) < getwhite(blurred, 1, HEIGHT-1));
|
|
Packit Service |
df60bb |
gdImageDestroy(blurred);
|
|
Packit Service |
df60bb |
gdImageDestroy(im);
|
|
Packit Service |
df60bb |
}/* do_crosstest*/
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
int main()
|
|
Packit Service |
df60bb |
{
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
do_test();
|
|
Packit Service |
df60bb |
do_crosstest();
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
return gdNumFailures();
|
|
Packit Service |
df60bb |
}
|