#include #include #include #include #include "newton.h" static const int width = 10240, height=7680; void solid_image(struct pngdata *pp) { unsigned int x, y; for (x = 0; x < pp->height; x++) for (y = 0; y < pp->width; y++) { png_byte *bp = pp->rows[x] + 3 * y; // bp[3] = 0; bp[0] = 0; bp[1] = 0; bp[2] = 100; } } void simple_image(struct pngdata *pp) { unsigned int x, y; for (x = 0; x < pp->height; x++) for (y = 0; y < pp->width; y++) { png_byte *bp = pp->rows[x] + 3 * y; // bp[3] = 0; bp[0] = (x * y) % 256; bp[1] = y % 256; bp[2] = sin(x * x + y * y) * 256; } } void usage(const char *argv0) { printf("Usage: %s filename\n", argv0); } int png_write(const char *filename, struct pngdata *data) { int retval = 1; FILE *fp = NULL; png_structp png_p = NULL; png_infop info_p = NULL; fp = fopen(filename, "wb"); if (fp == NULL) goto _bailout; png_p = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (png_p == NULL) goto _bailout; info_p = png_create_info_struct(png_p); if (!info_p) goto _bailout; png_init_io(png_p, fp); png_set_IHDR(png_p, info_p, data->width, data->height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_write_info(png_p, info_p); png_write_image(png_p, data->rows); png_write_end(png_p, NULL); retval = 0; _bailout: if (png_p) png_destroy_write_struct(&png_p, &info_p); if (fp) fclose(fp); return retval; } int main(int argc, char *argv[]) { struct pngdata pd; unsigned int i; void (*i_create)(struct pngdata *) = simple_image; // i_create = solid_image; i_create = newton; if (argc < 2) { usage(argv[0]); return 1; } pd.width = width; pd.height = height; pd.rows = (png_bytep *)calloc(pd.height, sizeof(pd.rows[0])); if (pd.rows == NULL) { printf("Not enough memory for row data.\n"); return 1; } for (i = 0; i < pd.height; i++) { pd.rows[i] = (png_byte *)calloc(4 * pd.width, sizeof(*(pd.rows[i]))); if (pd.rows[i] == NULL) { printf("Not enough memory for column %d.\n", i); return 1; } } i_create(&pd); if (png_write(argv[1], &pd) != 0) printf("Failed to write PNG data to '%s'.\n", argv[1]); for (i = 0; i < pd.height; i++) free((void *)pd.rows[i]); free((void *)pd.rows); return 0; }