Bugfix.
[chise/kage.git] / kagecgi / kagepng.c
1 //kagepng.c
2 //
3
4 #include "sysdep.h"
5
6 png_bytepp initPng(int width, int height){
7         png_bytepp image;
8         int i, j;
9         
10         image = (png_bytepp)malloc(height * sizeof(png_bytep)); 
11         for(j = 0; j < height; j++) image[j] = (png_bytep)malloc(width * sizeof(png_byte));
12         for(i = 0; i < width; i++){
13                 for(j = 0; j < height; j++){
14                         image[j][i] = 0xFF;
15                 }
16         }
17         return image;
18 }
19
20 int closePng(int width, int height, png_bytepp image){
21         int i;
22         for(i = 0; i < height; i++) free(image[i]);
23         free(image);
24         return 0;
25 }
26
27 int writePng(int width, int height, png_bytepp image, FILE *fp){
28         png_structp pPng;
29         png_infop pInfo;
30         png_text pText[5];
31         time_t gmt;
32         png_time pngTime;
33         
34         pPng = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
35         if(pPng == NULL){
36                 return 1;
37         }
38         pInfo = png_create_info_struct(pPng);
39         if(pInfo == NULL){
40                 png_destroy_write_struct(&pPng, (png_infopp)NULL);
41                 return 1;
42         }
43         if(setjmp(pPng->jmpbuf)){
44                 png_destroy_write_struct(&pPng, &pInfo);
45                 return 1;
46         }
47         png_init_io(pPng, fp);
48         png_set_filter(pPng, 0, PNG_ALL_FILTERS);
49         png_set_compression_level(pPng, Z_BEST_COMPRESSION);
50         //png_set_IHDR(pPng, pInfo, width, height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
51         png_set_IHDR(pPng, pInfo, width, height, 8, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
52         png_set_gAMA(pPng, pInfo, 1.0);
53         
54         time(&gmt);
55         png_convert_from_time_t(&pngTime, gmt);
56         png_set_tIME(pPng, pInfo, &pngTime);
57         
58         pText[0].key = "Title";
59         pText[0].text = "Kanji glyph generated by KAGE/cgi";
60         pText[0].compression = PNG_TEXT_COMPRESSION_NONE;
61         pText[1].key = "Author";
62         pText[1].text = "KAGE/cgi version 0.4";
63         pText[1].compression = PNG_TEXT_COMPRESSION_NONE;
64         pText[2].key = "Description";
65         pText[2].text = "see more information at http://fonts.jp/";
66         pText[2].compression = PNG_TEXT_COMPRESSION_NONE;
67         pText[3].key = "Creation Time";
68         pText[3].text = png_convert_to_rfc1123(pPng, &pngTime);
69         pText[3].compression = PNG_TEXT_COMPRESSION_NONE;
70         pText[4].key = "Software";
71         pText[4].text = "KAGE/cgi version 0.4";
72         pText[4].compression = PNG_TEXT_COMPRESSION_NONE;
73         png_set_text(pPng, pInfo, pText, 5);
74         
75         png_write_info(pPng, pInfo);
76         png_write_image(pPng, image);
77         png_write_end(pPng, pInfo);
78         png_destroy_write_struct(&pPng, &pInfo);
79         
80         return 0;
81 }
82