42 #define PNG_BYTES_TO_CHECK 4 54 GfImgReadPng(
const char *filename,
int *widthp,
int *heightp,
float screen_gamma)
60 png_uint_32 width, height;
61 int bit_depth, color_type, interlace_type;
65 png_bytep *row_pointers;
66 unsigned char *image_ptr, *cur_ptr;
70 if ((fp = fopen(filename,
"rb")) == NULL) {
71 GfTrace(
"Can't open file %s\n", filename);
72 return (
unsigned char *)NULL;
76 GfTrace(
"Can't read file %s\n", filename);
78 return (
unsigned char *)NULL;
82 GfTrace(
"File %s not in png format\n", filename);
84 return (
unsigned char *)NULL;
87 png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, (png_error_ptr)NULL, (png_error_ptr)NULL);
88 if (png_ptr == NULL) {
89 GfTrace(
"Img Failed to create read_struct\n");
91 return (
unsigned char *)NULL;
94 info_ptr = png_create_info_struct(png_ptr);
95 if (info_ptr == NULL) {
97 png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
98 return (
unsigned char *)NULL;
101 if (setjmp(png_jmpbuf(png_ptr)))
104 png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
107 return (
unsigned char *)NULL;
110 png_init_io(png_ptr, fp);
112 png_read_info(png_ptr, info_ptr);
113 png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, NULL, NULL);
114 *widthp = (int)width;
115 *heightp = (int)height;
117 if (bit_depth == 1 && color_type == PNG_COLOR_TYPE_GRAY) png_set_invert_mono(png_ptr);
118 if (bit_depth == 16) {
119 png_set_swap(png_ptr);
120 png_set_strip_16(png_ptr);
124 png_set_packing(png_ptr);
127 if (color_type == PNG_COLOR_TYPE_PALETTE) {
128 png_set_expand(png_ptr);
131 if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) {
132 png_set_expand(png_ptr);
135 if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
136 png_set_expand(png_ptr);
139 if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
140 png_set_gray_to_rgb(png_ptr);
143 if (bit_depth == 8 && color_type == PNG_COLOR_TYPE_RGB) {
144 png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
147 if (png_get_gAMA(png_ptr, info_ptr, &gamma)) {
148 png_set_gamma(png_ptr, screen_gamma, gamma);
150 png_set_gamma(png_ptr, screen_gamma, 0.50);
153 png_read_update_info(png_ptr, info_ptr);
154 rowbytes = png_get_rowbytes(png_ptr, info_ptr);
157 if (rowbytes != (4 * width)) {
158 GfTrace(
"%s bad byte count... %lu instead of %lu\n", filename, (
unsigned long) rowbytes, (
unsigned long) (4 * width));
160 png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
161 return (
unsigned char *)NULL;
164 row_pointers = (png_bytep*)malloc(height *
sizeof(png_bytep));
165 if (row_pointers == NULL) {
167 png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
168 return (
unsigned char *)NULL;
171 image_ptr = (
unsigned char *)malloc(height * rowbytes);
172 if (image_ptr == NULL) {
174 png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
175 return (
unsigned char *)NULL;
178 for (i = 0, cur_ptr = image_ptr + (height - 1) * rowbytes ; i < height; i++, cur_ptr -= rowbytes) {
179 row_pointers[i] = cur_ptr;
182 png_read_image(png_ptr, row_pointers);
183 png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
201 GfImgWritePng(
unsigned char *img,
const char *filename,
int width,
int height)
206 png_bytep *row_pointers;
207 png_uint_32 rowbytes;
209 unsigned char *cur_ptr;
215 fp = fopen(filename,
"wb");
217 GfTrace(
"Can't open file %s\n", filename);
221 png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, (png_error_ptr)NULL, (png_error_ptr)NULL);
222 if (png_ptr == NULL) {
226 info_ptr = png_create_info_struct(png_ptr);
227 if (info_ptr == NULL) {
228 png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
232 if (setjmp(png_jmpbuf(png_ptr))) {
233 png_destroy_write_struct(&png_ptr, &info_ptr);
238 png_init_io(png_ptr, fp);
239 png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB,
240 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
248 png_set_gAMA(png_ptr, info_ptr, screen_gamma);
250 png_write_info(png_ptr, info_ptr);
251 png_write_flush(png_ptr);
253 rowbytes = width * 3;
254 row_pointers = (png_bytep*)malloc(height *
sizeof(png_bytep));
256 if (row_pointers == NULL) {
258 png_destroy_write_struct(&png_ptr, &info_ptr);
262 for (i = 0, cur_ptr = img + (height - 1) * rowbytes ; i < height; i++, cur_ptr -= rowbytes) {
263 row_pointers[i] = cur_ptr;
266 png_write_image(png_ptr, row_pointers);
267 png_write_end(png_ptr, (png_infop)NULL);
268 png_destroy_write_struct(&png_ptr, &info_ptr);
283 glDeleteTextures(1, &tex);
300 const int BUFSIZE = 1024;
306 tex = (GLbyte*)
GfImgReadPng(filename, &w, &h, screen_gamma);
313 glGenTextures(1, &retTex);
314 glBindTexture(GL_TEXTURE_2D, retTex);
315 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
316 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
317 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)(tex));
void GfImgFreeTex(GLuint tex)
Free the texture.
void * GfParmReadFile(const char *file, int mode)
Read parameter set from file and return handle to parameter set.
int GfImgWritePng(unsigned char *img, const char *filename, int width, int height)
Write a buffer to a png image on disk.
GLuint GfImgReadTex(char *filename)
Read a png image into a texture.
#define GFPARM_RMODE_STD
if handle already openned return it
void GfParmReleaseHandle(void *parmHandle)
Release given parameter set handle parmHandle.
The Gaming Framework API (client part).
unsigned char * GfImgReadPng(const char *filename, int *widthp, int *heightp, float screen_gamma)
Load an image from disk to a buffer in RGBA mode.
tdble GfParmGetNum(void *handle, const char *path, const char *key, const char *unit, tdble deflt)
Get a numerical parameter from the parameter set handle.
#define PNG_BYTES_TO_CHECK
#define GFPARM_RMODE_CREAT
Create the file if doesn't exist.