Blame tests/gdimagefilter/gdCopyBlurred.c

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
}