/* * writepng.c: * * Copyright (c) 2006 UK Citizens Online Democracy. All rights reserved. * Email: chris@mysociety.org; WWW: http://www.mysociety.org/ * */ static const char rcsid[] = "$Id: writepng.c,v 1.1 2006/01/19 01:57:32 chris Exp chris $"; #include #include #include #include #include "postcodeine.h" bool writepng(const char *filename, const struct image *img) { FILE *fp; png_structp png_ptr; png_infop info_ptr; png_color palette[2] = { {0, 0, 0}, {255, 0, 0} }; png_byte transparency[2] = { 0, 255 }; int Y; if (!(fp = fopen(filename, "w+"))) return 0; if (!(png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL))) { unlink(filename); fclose(fp); return 0; } if (!(info_ptr = png_create_info_struct(png_ptr)) || setjmp(png_ptr->jmpbuf)) { unlink(filename); fclose(fp); png_destroy_write_struct(&png_ptr, &info_ptr); return 0; } png_init_io(png_ptr, fp); png_set_filter(png_ptr, 0, PNG_ALL_FILTERS); png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); png_set_IHDR(png_ptr, info_ptr, img->w, img->h, 8, PNG_COLOR_TYPE_PALETTE | PNG_COLOR_MASK_PALETTE, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_set_PLTE(png_ptr, info_ptr, palette, 2); png_set_tRNS(png_ptr, info_ptr, transparency, 2, NULL); png_write_info(png_ptr, info_ptr); for (Y = 0; Y < img->h; ++Y) png_write_row(png_ptr, (png_bytep)img->data[Y]); png_write_end(png_ptr, NULL); png_destroy_write_struct(&png_ptr, &info_ptr); fclose(fp); return 1; }