X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=common%2Freadpng.c;h=a437a526276da8a1ba9ec1493e27caa302cef50b;hb=f9dd0a6360f6486c196d9a463dc537c7081338be;hp=1dd05a831c4df0b80c3f8afc2c2f660d25200666;hpb=2951214ea65ce2e2ac40671511b8d5a9ea2d2842;p=libpicofe.git diff --git a/common/readpng.c b/common/readpng.c index 1dd05a8..a437a52 100644 --- a/common/readpng.c +++ b/common/readpng.c @@ -12,23 +12,24 @@ #define BG_HEIGHT 240 #endif -void readpng(void *dest, const char *fname, readpng_what what) +int readpng(void *dest, const char *fname, readpng_what what) { FILE *fp; png_structp png_ptr = NULL; png_infop info_ptr = NULL; png_bytepp row_ptr = NULL; + int ret = -1; if (dest == NULL || fname == NULL) { - return; + return -1; } fp = fopen(fname, "rb"); if (fp == NULL) { lprintf(__FILE__ ": failed to open: %s\n", fname); - return; + return -1; } png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); @@ -36,7 +37,7 @@ void readpng(void *dest, const char *fname, readpng_what what) { lprintf(__FILE__ ": png_create_read_struct() failed\n"); fclose(fp); - return; + return -1; } info_ptr = png_create_info_struct(png_ptr); @@ -80,7 +81,11 @@ void readpng(void *dest, const char *fname, readpng_what what) int len = width; while (len--) { - *dst++ = ((src[0]&0xf8)<<8) | ((src[1]&0xf8)<<3) | (src[2] >> 3); +#ifdef PSP + *dst++ = ((src[2]&0xf8)<<8) | ((src[1]&0xf8)<<3) | (src[0] >> 3); // BGR +#else + *dst++ = ((src[0]&0xf8)<<8) | ((src[1]&0xf8)<<3) | (src[2] >> 3); // RGB +#endif src += 3; } dst += BG_WIDTH - width; @@ -141,12 +146,41 @@ void readpng(void *dest, const char *fname, readpng_what what) } break; } + + case READPNG_320_24: + case READPNG_480_24: + { + int height, width, h; + int needw = (what == READPNG_480_24) ? 480 : 320; + unsigned char *dst = dest; + if (info_ptr->pixel_depth != 24) + { + lprintf(__FILE__ ": image uses %ibpp, needed 24bpp\n", info_ptr->pixel_depth); + break; + } + height = info_ptr->height; + if (height > 240) height = 240; + width = info_ptr->width; + if (width > needw) width = needw; + + for (h = 0; h < height; h++) + { + int len = width; + unsigned char *src = row_ptr[h]; + dst += (needw - width) * 3; + for (len = width; len > 0; len--, dst+=3, src+=3) + dst[0] = src[2], dst[1] = src[1], dst[2] = src[0]; + } + break; + } } + ret = 0; done: png_destroy_read_struct(&png_ptr, info_ptr ? &info_ptr : NULL, (png_infopp)NULL); fclose(fp); + return ret; }