/*
 * Sample program to generate a small test PNG image.
 */

#include <stdio.h>
#include <string.h>
#include <unistd.h>

#include "png.h"

#ifndef png_jmpbuf
#  define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf)
#endif

#define errx(ex, m) do { fprintf(stderr, m); exit(ex); } while (0)

int
main(argc, argv)
	int argc;
	char *argv[];
{
	png_structp png_ptr;
	png_infop info_ptr;
	struct { unsigned char r, g, b } line[256];
	png_color_8 sigbit;
	int i, j;

	png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
		(png_voidp)NULL, NULL, NULL);
	if (!png_ptr)
		errx(1, "png_create_write_struct");

	info_ptr = png_create_info_struct(png_ptr);
	if (!info_ptr) 
		errx(1, "png_create_info_struct");

	if (setjmp(png_jmpbuf(png_ptr)))
		/* All future errors jump here */
		errx(1, "png error");

	/* Use stdio */
	png_init_io(png_ptr, stdout);

	png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
	png_set_IHDR(png_ptr, info_ptr,
		256,	/* width */
		256,	/* height */
		8,	/* bit depth */
		PNG_COLOR_TYPE_RGB,
		PNG_INTERLACE_NONE,
		PNG_COMPRESSION_TYPE_DEFAULT,
		PNG_FILTER_TYPE_DEFAULT);

	png_write_info(png_ptr, info_ptr);

	for (i = 0; i < 256; i++) {
		for (j = 0; j < 256; j++) {
			line[j].r = i;
			line[j].g = (512 -i -j)/2;
			line[j].b = j;
		}
		png_write_row(png_ptr, line);
	}
	png_write_end(png_ptr, info_ptr);

	png_destroy_write_struct(&png_ptr, &info_ptr);
	fclose(stdout);

	exit(0);
}

