source: trunk/npemap.org.uk/scripts/postcodeine/writepng.c @ 268

Last change on this file since 268 was 268, checked in by David Sheldon, 14 years ago

Postcodeine code from Mr Lightfoot. Minor modifications.

File size: 1.7 KB
Line 
1/*
2 * writepng.c:
3 *
4 * Copyright (c) 2006 UK Citizens Online Democracy. All rights reserved.
5 * Email: chris@mysociety.org; WWW: http://www.mysociety.org/
6 *
7 */
8
9static const char rcsid[] = "$Id: writepng.c,v 1.1 2006/01/19 01:57:32 chris Exp chris $";
10
11#include <png.h>
12#include <stdbool.h>
13#include <stdio.h>
14#include <stdlib.h>
15
16#include "postcodeine.h"
17
18bool writepng(const char *filename, const struct image *img) {
19    FILE *fp;
20    png_structp png_ptr;
21    png_infop info_ptr;
22    png_color palette[2] = { {0, 0, 0}, {255, 0, 0} };
23    png_byte transparency[2] = { 0, 255 };
24    int Y;
25   
26    if (!(fp = fopen(filename, "w+")))
27        return 0;
28   
29    if (!(png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL))) {
30        unlink(filename);
31        fclose(fp);
32        return 0;
33    }
34
35    if (!(info_ptr = png_create_info_struct(png_ptr))
36        || setjmp(png_ptr->jmpbuf)) {
37        unlink(filename);
38        fclose(fp);
39        png_destroy_write_struct(&png_ptr, &info_ptr);
40        return 0;
41    }
42
43    png_init_io(png_ptr, fp);
44    png_set_filter(png_ptr, 0, PNG_ALL_FILTERS);
45    png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
46
47    png_set_IHDR(png_ptr, info_ptr,
48            img->w, img->h,
49            8, PNG_COLOR_TYPE_PALETTE | PNG_COLOR_MASK_PALETTE,
50            PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
51            PNG_FILTER_TYPE_DEFAULT);
52
53    png_set_PLTE(png_ptr, info_ptr, palette, 2);
54    png_set_tRNS(png_ptr, info_ptr, transparency, 2, NULL);
55
56    png_write_info(png_ptr, info_ptr);
57
58    for (Y = 0; Y < img->h; ++Y)
59        png_write_row(png_ptr, (png_bytep)img->data[Y]);
60
61    png_write_end(png_ptr, NULL);
62    png_destroy_write_struct(&png_ptr, &info_ptr);
63
64    fclose(fp);
65
66    return 1;
67}
68
Note: See TracBrowser for help on using the repository browser.