Blame src/testac.c

Packit Service df60bb
Packit Service df60bb
#ifdef HAVE_CONFIG_H
Packit Service df60bb
#include "config.h"
Packit Service df60bb
#endif
Packit Service df60bb
Packit Service df60bb
#include <stdio.h>
Packit Service df60bb
#include <stdlib.h>
Packit Service df60bb
#include "gd.h"
Packit Service df60bb
Packit Service df60bb
/* If palette is true, we convert from truecolor to palette at the end,
Packit Service df60bb
   to test gdImageTrueColorToPalette and see file size/
Packit Service df60bb
   quality tradeoffs. */
Packit Service df60bb
Packit Service df60bb
void testDrawing (gdImagePtr im_in,
Packit Service df60bb
		  double scale, int blending, int palette, char *filename);
Packit Service df60bb
Packit Service df60bb
int
Packit Service df60bb
main (int argc, char *argv[])
Packit Service df60bb
{
Packit Service df60bb
#ifdef HAVE_LIBPNG
Packit Service df60bb
	/* Input and output files */
Packit Service df60bb
	FILE *in;
Packit Service df60bb
Packit Service df60bb
	/* Input image */
Packit Service df60bb
	gdImagePtr im_in = 0;
Packit Service df60bb
Packit Service df60bb
	if (argc != 2) {
Packit Service df60bb
		fprintf (stderr, "Usage: testac filename.png\n");
Packit Service df60bb
		exit (1);
Packit Service df60bb
	}
Packit Service df60bb
	/* Load original PNG, which should contain alpha channel
Packit Service df60bb
	   information. We will use it in two ways: preserving it
Packit Service df60bb
	   literally, for use with compatible browsers, and
Packit Service df60bb
	   compositing it ourselves against a background of our
Packit Service df60bb
	   choosing (alpha blending). We'll change its size
Packit Service df60bb
	   and try creating palette versions of it. */
Packit Service df60bb
	in = fopen (argv[1], "rb");
Packit Service df60bb
	if (!in) {
Packit Service df60bb
		fprintf (stderr, "Can't load %s.\n", argv[1]);
Packit Service df60bb
		exit (1);
Packit Service df60bb
	} else {
Packit Service df60bb
		im_in = gdImageCreateFromPng (in);
Packit Service df60bb
		fclose (in);
Packit Service df60bb
	}
Packit Service df60bb
	testDrawing (im_in, 1.0, 0, 0, "noblending-fullsize-truecolor.png");
Packit Service df60bb
	testDrawing (im_in, 1.0, 1, 0, "blending-fullsize-truecolor.png");
Packit Service df60bb
	testDrawing (im_in, 0.5, 0, 0, "noblending-halfsize-truecolor.png");
Packit Service df60bb
	testDrawing (im_in, 0.5, 1, 0, "blending-halfsize-truecolor.png");
Packit Service df60bb
	testDrawing (im_in, 2.0, 0, 0, "noblending-doublesize-truecolor.png");
Packit Service df60bb
	testDrawing (im_in, 2.0, 1, 0, "blending-doublesize-truecolor.png");
Packit Service df60bb
	testDrawing (im_in, 1.0, 0, 1, "noblending-fullsize-palette.png");
Packit Service df60bb
	testDrawing (im_in, 1.0, 1, 1, "blending-fullsize-palette.png");
Packit Service df60bb
	testDrawing (im_in, 0.5, 0, 1, "noblending-halfsize-palette.png");
Packit Service df60bb
	testDrawing (im_in, 0.5, 1, 1, "blending-halfsize-palette.png");
Packit Service df60bb
	testDrawing (im_in, 2.0, 0, 1, "noblending-doublesize-palette.png");
Packit Service df60bb
	testDrawing (im_in, 2.0, 1, 1, "blending-doublesize-palette.png");
Packit Service df60bb
	gdImageDestroy (im_in);
Packit Service df60bb
#else
Packit Service df60bb
	fprintf (stderr, "No PNG library support.\n");
Packit Service df60bb
#endif
Packit Service df60bb
Packit Service df60bb
	return 0;
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
/* If palette is true, we convert from truecolor to palette at the end,
Packit Service df60bb
   to test gdImageTrueColorToPalette and see file size/
Packit Service df60bb
   quality tradeoffs. */
Packit Service df60bb
void
Packit Service df60bb
testDrawing (gdImagePtr im_in,
Packit Service df60bb
	     double scale, int blending, int palette, char *filename)
Packit Service df60bb
{
Packit Service df60bb
	gdImagePtr im_out;
Packit Service df60bb
	FILE *out;
Packit Service df60bb
	/* Create output image. */
Packit Service df60bb
	im_out = gdImageCreateTrueColor ((int) (gdImageSX (im_in) * scale),
Packit Service df60bb
					 (int) (gdImageSY (im_in) * scale));
Packit Service df60bb
	/*
Packit Service df60bb
	   Request alpha blending. This causes future
Packit Service df60bb
	   drawing operations to perform alpha channel blending
Packit Service df60bb
	   with the background, resulting in an opaque image.
Packit Service df60bb
	   Without this call, pixels in the foreground color are
Packit Service df60bb
	   copied literally, *including* the alpha channel value,
Packit Service df60bb
	   resulting in an output image which is potentially
Packit Service df60bb
	   not opaque. This flag can be set and cleared as often
Packit Service df60bb
	   as desired. */
Packit Service df60bb
	gdImageAlphaBlending (im_out, blending);
Packit Service df60bb
Packit Service df60bb
	/* Flood with light blue. */
Packit Service df60bb
	gdImageFill (im_out, (int) (gdImageSX (im_in) * scale / 2),
Packit Service df60bb
		     (int) (gdImageSY (im_in) * scale / 2),
Packit Service df60bb
		     gdTrueColor (192, 192, 255));
Packit Service df60bb
	/* Copy the source image. Alpha blending should result in
Packit Service df60bb
	   compositing against red. With blending turned off, the
Packit Service df60bb
	   browser or viewer will composite against its preferred
Packit Service df60bb
	   background, or, if it does not support an alpha channel,
Packit Service df60bb
	   we will see the original colors for the pixels that
Packit Service df60bb
	   ought to be transparent or semitransparent. */
Packit Service df60bb
	gdImageCopyResampled (im_out, im_in,
Packit Service df60bb
			      0, 0,
Packit Service df60bb
			      0, 0,
Packit Service df60bb
			      (int) (gdImageSX (im_in) * scale),
Packit Service df60bb
			      (int) (gdImageSY (im_in) * scale), gdImageSX (im_in),
Packit Service df60bb
			      gdImageSY (im_in));
Packit Service df60bb
	/* Write PNG */
Packit Service df60bb
	out = fopen (filename, "wb");
Packit Service df60bb
Packit Service df60bb
	/* If this image is the result of alpha channel blending,
Packit Service df60bb
	   it will not contain an interesting alpha channel itself.
Packit Service df60bb
	   Save a little file size by not saving the alpha channel.
Packit Service df60bb
	   Otherwise the file would typically be slightly larger. */
Packit Service df60bb
	gdImageSaveAlpha (im_out, !blending);
Packit Service df60bb
Packit Service df60bb
	/* If requested, convert from truecolor to palette. */
Packit Service df60bb
	if (palette) {
Packit Service df60bb
		/* Dithering, 256 colors. */
Packit Service df60bb
		gdImageTrueColorToPalette (im_out, 1, 256);
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
#ifdef HAVE_LIBPNG
Packit Service df60bb
	gdImagePng (im_out, out);
Packit Service df60bb
#else
Packit Service df60bb
	fprintf (stderr, "No PNG library support.\n");
Packit Service df60bb
#endif
Packit Service df60bb
	fclose (out);
Packit Service df60bb
Packit Service df60bb
	gdImageDestroy (im_out);
Packit Service df60bb
}