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