53GfImgReadPng(
const char *filename,
int *widthp,
int *heightp,
float screen_gamma)
59 png_uint_32 width, height;
60 int bit_depth, color_type, interlace_type;
64 png_bytep *row_pointers;
65 unsigned char *image_ptr, *cur_ptr;
69 if ((fp = fopen(filename,
"rb")) == NULL) {
70 GfTrace(
"Can't open file %s\n", filename);
71 return (
unsigned char *)NULL;
75 GfTrace(
"Can't read file %s\n", filename);
77 return (
unsigned char *)NULL;
81 GfTrace(
"File %s not in png format\n", filename);
83 return (
unsigned char *)NULL;
86 png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, (png_error_ptr)NULL, (png_error_ptr)NULL);
87 if (png_ptr == NULL) {
88 GfTrace(
"Img Failed to create read_struct\n");
90 return (
unsigned char *)NULL;
93 info_ptr = png_create_info_struct(png_ptr);
94 if (info_ptr == NULL) {
96 png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
97 return (
unsigned char *)NULL;
100 if (setjmp(png_jmpbuf(png_ptr)))
103 png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
106 return (
unsigned char *)NULL;
109 png_init_io(png_ptr, fp);
111 png_read_info(png_ptr, info_ptr);
112 png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, NULL, NULL);
113 *widthp = (int)width;
114 *heightp = (int)height;
116 if (bit_depth == 1 && color_type == PNG_COLOR_TYPE_GRAY) png_set_invert_mono(png_ptr);
117 if (bit_depth == 16) {
118 png_set_swap(png_ptr);
119 png_set_strip_16(png_ptr);
123 png_set_packing(png_ptr);
126 if (color_type == PNG_COLOR_TYPE_PALETTE) {
127 png_set_expand(png_ptr);
130 if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) {
131 png_set_expand(png_ptr);
134 if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
135 png_set_expand(png_ptr);
138 if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
139 png_set_gray_to_rgb(png_ptr);
142 if (bit_depth == 8 && color_type == PNG_COLOR_TYPE_RGB) {
143 png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
146 if (png_get_gAMA(png_ptr, info_ptr, &gamma)) {
147 png_set_gamma(png_ptr, screen_gamma, gamma);
149 png_set_gamma(png_ptr, screen_gamma, 0.50);
152 png_read_update_info(png_ptr, info_ptr);
153 rowbytes = png_get_rowbytes(png_ptr, info_ptr);
156 if (rowbytes != (4 * width)) {
157 GfTrace(
"%s bad byte count... %lu instead of %lu\n", filename, (
unsigned long) rowbytes, (
unsigned long) (4 * width));
159 png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
160 return (
unsigned char *)NULL;
163 row_pointers = (png_bytep*)malloc(height *
sizeof(png_bytep));
164 if (row_pointers == NULL) {
166 png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
167 return (
unsigned char *)NULL;
170 image_ptr = (
unsigned char *)malloc(height * rowbytes);
171 if (image_ptr == NULL) {
173 png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
174 return (
unsigned char *)NULL;
177 for (i = 0, cur_ptr = image_ptr + (height - 1) * rowbytes ; i < height; i++, cur_ptr -= rowbytes) {
178 row_pointers[i] = cur_ptr;
181 png_read_image(png_ptr, row_pointers);
182 png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
191writePng(
unsigned char *img,
const char *filename,
int width,
int height,
int writeGamma)
196 png_bytep *row_pointers;
197 png_uint_32 rowbytes;
199 unsigned char *cur_ptr;
201 fp = fopen(filename,
"wb");
203 GfTrace(
"Can't open file %s\n", filename);
207 png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, (png_error_ptr)NULL, (png_error_ptr)NULL);
208 if (png_ptr == NULL) {
213 info_ptr = png_create_info_struct(png_ptr);
214 if (info_ptr == NULL) {
216 png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
220 if (setjmp(png_jmpbuf(png_ptr))) {
221 png_destroy_write_struct(&png_ptr, &info_ptr);
226 png_init_io(png_ptr, fp);
227 png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB,
228 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
238 const float screen_gamma = 2.0;
240 png_set_gAMA(png_ptr, info_ptr, screen_gamma);
243 png_write_info(png_ptr, info_ptr);
244 png_write_flush(png_ptr);
246 rowbytes = width * 3;
247 row_pointers = (png_bytep*)malloc(height *
sizeof(png_bytep));
249 if (row_pointers == NULL) {
251 png_destroy_write_struct(&png_ptr, &info_ptr);
255 for (i = 0, cur_ptr = img + (height - 1) * rowbytes ; i < height; i++, cur_ptr -= rowbytes) {
256 row_pointers[i] = cur_ptr;
259 png_write_image(png_ptr, row_pointers);
260 png_write_end(png_ptr, (png_infop)NULL);
261 png_destroy_write_struct(&png_ptr, &info_ptr);
322 const int BUFSIZE = 1024;
328 tex = (GLbyte*)
GfImgReadPng(filename, &w, &h, screen_gamma);
335 glGenTextures(1, &retTex);
336 glBindTexture(GL_TEXTURE_2D, retTex);
337 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
338 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
339 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)(tex));