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