diff --git a/libretro-sdk/formats/mpng/mpng_decode.c b/libretro-sdk/formats/mpng/mpng_decode.c index 5599fcc869..495e8c191c 100644 --- a/libretro-sdk/formats/mpng/mpng_decode.c +++ b/libretro-sdk/formats/mpng/mpng_decode.c @@ -1,6 +1,7 @@ #include <stdlib.h> #include <stdint.h> #include <string.h> +#include <boolean.h> #ifdef WANT_MINIZ #define MINIZ_HEADER_FILE_ONLY @@ -31,10 +32,10 @@ enum mpng_chunk_type MPNG_CHUNK_IDAT = 0x49444154, MPNG_CHUNK_PLTE = 0x504c5445, MPNG_CHUNK_IEND = 0x49454e44, -} +}; bool png_decode(const void *userdata, size_t len, - struct image *img, videoformat format) + struct mpng_image *img, enum video_format format) { /* chop off some warnings... these are all initialized in IHDR */ unsigned int depth; @@ -56,12 +57,12 @@ bool png_decode(const void *userdata, size_t len, if (!data) return false; - memset(img, 0, sizeof(struct image)); + memset(img, 0, sizeof(struct mpng_image)); /* Only works for RGB888, XRGB8888, and ARGB8888 */ - if (format != fmt_rgb888 - && format != fmt_xrgb8888 - && format != fmt_argb8888) + if (format != FMT_RGB888 + && format != FMT_XRGB8888 + && format != FMT_ARGB8888) return false; if (len < 8) @@ -147,7 +148,7 @@ bool png_decode(const void *userdata, size_t len, if (color_type == 6 && depth != 8) goto error; /* truecolor with alpha */ - if (color_type == 6 && format != fmt_argb8888) + if (color_type == 6 && format != FMT_ARGB8888) goto error; /* can only decode alpha on ARGB formats */ if (compression != 0) @@ -199,7 +200,7 @@ bool png_decode(const void *userdata, size_t len, break; case MPNG_CHUNK_TRNS: { - if (format != fmt_argb8888 || !pixels || pixels != pixelsat) + if (format != FMT_ARGB8888 || !pixels || pixels != pixelsat) goto error; if (color_type == 2) @@ -218,6 +219,9 @@ bool png_decode(const void *userdata, size_t len, { size_t byteshere; size_t chunklen_copy; +#ifdef WANT_MINIZ + tinfl_status status; +#endif if (!pixels || (color_type == 3 && palette_len == 0)) goto error; @@ -226,7 +230,7 @@ bool png_decode(const void *userdata, size_t len, byteshere = (pixelsend - pixelsat)+1; #ifdef WANT_MINIZ - tinfl_status status = tinfl_decompress(&inflator, + status = tinfl_decompress(&inflator, (const mz_uint8 *)chunkdata, &chunklen_copy, pixels, pixelsat, @@ -238,12 +242,15 @@ bool png_decode(const void *userdata, size_t len, pixelsat += byteshere; +#ifdef WANT_MINIZ if (status < TINFL_STATUS_DONE) goto error; +#endif } break; case MPNG_CHUNK_IEND: { + unsigned b, x, y; #ifdef WANT_MINIZ tinfl_status status; #endif @@ -266,11 +273,13 @@ bool png_decode(const void *userdata, size_t len, pixelsat += finalbytes; +#ifdef WANT_MINIZ if (status < TINFL_STATUS_DONE) goto error; if (status > TINFL_STATUS_DONE) goto error; +#endif if (pixelsat != pixelsend) goto error; /* too little data (can't be too much because we didn't give it that buffer size) */ @@ -282,6 +291,7 @@ bool png_decode(const void *userdata, size_t len, //run filters unsigned int bpppacked = ((color_type == 2) ? 3 : (color_type == 6) ? 4 : 1); uint8_t * prevout = out + (4 * width * 1); + if (height==1) { /* This will blow up if a 1px high image is filtered with Paeth, but highly unlikely. */ @@ -293,7 +303,7 @@ bool png_decode(const void *userdata, size_t len, filteredline = pixels; - for (unsigned int y = 0; y < height; y++) + for (y = 0; y < height; y++) { uint8_t * thisout=out+(bpl*y); @@ -305,21 +315,21 @@ bool png_decode(const void *userdata, size_t len, case 1: memcpy(thisout, filteredline, bpppacked); - for (unsigned int x=bpppacked;x<bpl;x++) - thisout[x]=thisout[x-bpppacked]+filteredline[x]; + for (x = bpppacked; x < bpl; x++) + thisout[x] = thisout[x-bpppacked] + filteredline[x]; break; case 2: - for (unsigned int x=0;x<bpl;x++) - thisout[x]=prevout[x]+filteredline[x]; + for (x = 0; x < bpl; x++) + thisout[x] = prevout[x] + filteredline[x]; break; case 3: - for (unsigned int x=0;x<bpppacked;x++) + for (x = 0; x < bpppacked; x++) { - int a=0; - int b=prevout[x]; - thisout[x]=(a+b)/2+filteredline[x]; + int a = 0; + int b = prevout[x]; + thisout[x] = (a+b)/2 + filteredline[x]; } - for (unsigned int x=bpppacked;x<bpl;x++) + for (x = bpppacked; x < bpl; x++) { int a = thisout[x - bpppacked]; int b = prevout[x]; @@ -327,43 +337,50 @@ bool png_decode(const void *userdata, size_t len, } break; case 4: - for (unsigned int x=0;x<bpppacked;x++) + for (x = 0; x < bpppacked; x++) { int prediction; - int a=0; - int b=prevout[x]; - int c=0; + int a = 0; + int b = prevout[x]; + int c = 0; - int p=a+b-c; - int pa=abs(p-a); - int pb=abs(p-b); - int pc=abs(p-c); + int p = a+b-c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); - if (pa<=pb && pa<=pc) prediction=a; - else if (pb<=pc) prediction=b; - else prediction=c; + if (pa <= pb && pa <= pc) + prediction=a; + else if (pb <= pc) + prediction=b; + else + prediction=c; - thisout[x]=filteredline[x]+prediction; + thisout[x] = filteredline[x]+prediction; } - for (unsigned int x=bpppacked;x<bpl;x++) + + for (x = bpppacked; x < bpl; x++) { int prediction; - int a=thisout[x-bpppacked]; - int b=prevout[x]; - int c=prevout[x-bpppacked]; + int a = thisout[x-bpppacked]; + int b = prevout[x]; + int c = prevout[x-bpppacked]; - int p=a+b-c; - int pa=abs(p-a); - int pb=abs(p-b); - int pc=abs(p-c); + int p = a+b-c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); - if (pa<=pb && pa<=pc) prediction=a; - else if (pb<=pc) prediction=b; - else prediction=c; + if (pa <= pb && pa <= pc) + prediction = a; + else if (pb <= pc) + prediction = b; + else + prediction = c; - thisout[x]=filteredline[x]+prediction; + thisout[x] = filteredline[x] + prediction; } break; default: @@ -395,12 +412,12 @@ bool png_decode(const void *userdata, size_t len, { x--; inp--; - for (int b=0;b<8;b++) + for (b = 0; b < 8; b++) { - int rgb32=palette[((*inp)>>b)&1]; - *(--outp)=rgb32>>0; - *(--outp)=rgb32>>8; - *(--outp)=rgb32>>16; + int rgb32 = palette[((*inp)>>b)&1]; + *(--outp) = rgb32 >> 0; + *(--outp) = rgb32 >> 8; + *(--outp) = rgb32 >> 16; } } while(x); y--; @@ -422,10 +439,10 @@ bool png_decode(const void *userdata, size_t len, inp--; for (b = 0;b < 8; b += 2) { - int rgb32=palette[((*inp)>>b)&3]; - *(--outp)=rgb32>>0; - *(--outp)=rgb32>>8; - *(--outp)=rgb32>>16; + int rgb32 = palette[((*inp)>>b)&3]; + *(--outp) = rgb32 >> 0; + *(--outp) = rgb32 >> 8; + *(--outp) = rgb32 >> 16; } } while(x); y--; @@ -470,8 +487,8 @@ bool png_decode(const void *userdata, size_t len, { int rgb32; i--; - inp-=1; - rgb32 = palette[*inp]; + inp -= 1; + rgb32 = palette[*inp]; *(--outp) = rgb32 >> 0; *(--outp) = rgb32 >> 8; @@ -483,7 +500,7 @@ bool png_decode(const void *userdata, size_t len, } /* unpack to 32bpp if requested */ - if (format != fmt_rgb888 && color_type == 2) + if (format != FMT_RGB888 && color_type == 2) { uint8_t *inp = out + width * height * 3; uint32_t *outp = ((uint32_t*)out) + width * height; @@ -516,6 +533,6 @@ bool png_decode(const void *userdata, size_t len, error: free(pixels); - memset(img, 0, sizeof(struct image)); + memset(img, 0, sizeof(struct mpng_image)); return false; }