From 9e217b256bd668298370d18645d23d4019c3968c Mon Sep 17 00:00:00 2001 From: Bradley Bell Date: Sat, 22 May 2004 23:41:29 +0000 Subject: [PATCH] add opengl replacement texture support (requires libpng and zlib) (d1x r1.42, r1.1, r1.10, r1.4, r1.1) --- include/pngfile.h | 21 +++++++++++ misc/Makefile.am | 2 + misc/pngfile.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 include/pngfile.h create mode 100644 misc/pngfile.c diff --git a/include/pngfile.h b/include/pngfile.h new file mode 100644 index 00000000..b457991e --- /dev/null +++ b/include/pngfile.h @@ -0,0 +1,21 @@ +/* $Id: pngfile.h,v 1.1 2004-05-22 23:41:29 btb Exp $ */ +#ifndef PNGFILE_H +#define PNGFILE_H + +typedef struct _png_data { + unsigned int width; + unsigned int height; + unsigned int depth; + unsigned int channels; + unsigned paletted:1; + unsigned color:1; + unsigned alpha:1; + + unsigned char *data; + unsigned char *palette; + unsigned int num_palette; +} png_data; + +extern int read_png(char *filename, png_data *pdata); + +#endif diff --git a/misc/Makefile.am b/misc/Makefile.am index d408cae1..4bda6d54 100644 --- a/misc/Makefile.am +++ b/misc/Makefile.am @@ -9,6 +9,8 @@ libmisc_a_SOURCES = ${PNG_SRCS} \ args.c error.c strio.c \ d_io.c hash.c strutil.c +EXTRA_libmisc_a_SOURCES = pngfile.c + # checker.c #checker.o: checker.c diff --git a/misc/pngfile.c b/misc/pngfile.c new file mode 100644 index 00000000..472d913e --- /dev/null +++ b/misc/pngfile.c @@ -0,0 +1,94 @@ +/* $Id: pngfile.c,v 1.1 2004-05-22 23:41:29 btb Exp $ */ +#include +#include + +#include "pngfile.h" +#include "u_mem.h" +#include "pstypes.h" + +int read_png(char *filename, png_data *pdata) +{ + ubyte header[8]; + png_structp png_ptr = NULL; + png_infop info_ptr = NULL; + png_bytepp row_pointers = NULL; + png_uint_32 width, height; + int depth, color_type; + int i; + FILE *fp = NULL; + + if (!filename || !pdata) + return 0; + + if ((fp = fopen(filename, "rb")) == NULL) + return 0; + + fread(header, 1, 8, fp); + if (!png_check_sig(header, 8)) + return 0; + + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + info_ptr = png_create_info_struct(png_ptr); + + pdata->data = pdata->palette = NULL; + pdata->num_palette = 0; + if (setjmp(png_ptr->jmpbuf)) + { + png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL); + if (pdata->data) + free(pdata->data); + if (pdata->palette) + free(pdata->palette); + if (row_pointers) + free(row_pointers); + fclose(fp); + return 0; + } + + png_init_io(png_ptr, fp); + png_set_sig_bytes(png_ptr, 8); + png_read_info(png_ptr, info_ptr); + png_get_IHDR(png_ptr, info_ptr, &width, &height, &depth, &color_type, NULL, NULL, NULL); + + pdata->width = width; + pdata->height = height; + pdata->depth = depth; + + pdata->data = (ubyte*)malloc(png_get_rowbytes(png_ptr, info_ptr) * height); + row_pointers = (png_bytep *)malloc(sizeof(png_bytep) * height); + for (i = 0; i < height; i++) + row_pointers[i] = &pdata->data[png_get_rowbytes(png_ptr, info_ptr) * i]; + + png_read_image(png_ptr, row_pointers); + free(row_pointers); + row_pointers=NULL; + png_read_end(png_ptr, info_ptr); + + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + png_colorp palette; + + if (png_get_PLTE(png_ptr, info_ptr, &palette, &pdata->num_palette)) + { + pdata->palette = (ubyte*)malloc(pdata->num_palette * 3); + memcpy(pdata->palette, palette, pdata->num_palette * 3); + } + } + + pdata->paletted = (color_type & PNG_COLOR_MASK_PALETTE) > 0; + pdata->color = (color_type & PNG_COLOR_MASK_COLOR) > 0; + pdata->alpha = (color_type & PNG_COLOR_MASK_ALPHA) > 0; + if (pdata->color && pdata->alpha) + pdata->channels = 4; + else if (pdata->color && !pdata->alpha) + pdata->channels = 3; + else if (!pdata->color && pdata->alpha) + pdata->channels = 2; + else //if (!pdata->color && !pdata->alpha) + pdata->channels = 1; + + png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL); + fclose(fp); + + return 1; +} -- 2.39.2