X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=drivers%2Fgp2x%2Freadpng.c;fp=drivers%2Fgp2x%2Freadpng.c;h=e6e127f2c7e75a6aad34258548d82e4c92dd818c;hp=0000000000000000000000000000000000000000;hb=47d0839eef773569f1093b47d795714cac0dacd2;hpb=6f6bc6fa47b2888c4420eeb323d96be0982150de diff --git a/drivers/gp2x/readpng.c b/drivers/gp2x/readpng.c new file mode 100644 index 0000000..e6e127f --- /dev/null +++ b/drivers/gp2x/readpng.c @@ -0,0 +1,72 @@ +#include +#include +#include + +void readpng(unsigned short *dest, const char *fname) +{ + FILE *fp; + png_structp png_ptr = NULL; + png_infop info_ptr = NULL; + png_bytepp row_ptr = NULL; + int height, width, h; + + if (dest == NULL || fname == NULL) + { + return; + } + + fp = fopen(fname, "rb"); + if (fp == NULL) + { + printf(__FILE__ ": failed to open: %s\n", fname); + return; + } + + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png_ptr) + { + printf(__FILE__ ": png_create_read_struct() failed\n"); + fclose(fp); + return; + } + + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + printf(__FILE__ ": png_create_info_struct() failed\n"); + goto done; + } + + // Start reading + png_init_io(png_ptr, fp); + png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_STRIP_16 | PNG_TRANSFORM_STRIP_ALPHA | PNG_TRANSFORM_PACKING, NULL); + row_ptr = png_get_rows(png_ptr, info_ptr); + if (row_ptr == NULL) + { + printf(__FILE__ ": png_get_rows() failed\n"); + goto done; + } + + height = info_ptr->height; + if (height > 240) height = 240; + width = info_ptr->width; + if (width > 320) width = 320; + + for (h = 0; h < height; h++) + { + unsigned char *src = row_ptr[h]; + int len = width; + while (len--) + { + *dest++ = ((src[0]&0xf8)<<8) | ((src[1]&0xf8)<<3) | (src[2] >> 3); + src += 3; + } + dest += 320 - width; + } + + +done: + png_destroy_read_struct(&png_ptr, info_ptr ? &info_ptr : NULL, (png_infopp)NULL); + fclose(fp); +} +