From e26d0c62e07d1b1c1087a065242ed7ab1a2c522f Mon Sep 17 00:00:00 2001 From: Marcin Bukat Date: Sun, 31 Oct 2010 12:40:49 +0000 Subject: Fix and extend imageviewer png support. FS#11641 by me git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28413 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/imageviewer/png/png_decoder.h | 141 +++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 apps/plugins/imageviewer/png/png_decoder.h (limited to 'apps/plugins/imageviewer/png/png_decoder.h') diff --git a/apps/plugins/imageviewer/png/png_decoder.h b/apps/plugins/imageviewer/png/png_decoder.h new file mode 100644 index 0000000000..4ca2a51277 --- /dev/null +++ b/apps/plugins/imageviewer/png/png_decoder.h @@ -0,0 +1,141 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$id $ + * + * Copyright (C) 2009 by Christophe Gouiran + * + * Based on lodepng, a lightweight png decoder/encoder + * (c) 2005-2008 Lode Vandevenne + * + * Copyright (c) 2010 Marcin Bukat + * - pixel format conversion & transparency handling + * - adaptation of tinf (tiny inflate library) + * - code refactoring & cleanups + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#define OUT_OF_MEMORY 9900 +#define FILE_TOO_LARGE 9910 + +/* PNG chunk types signatures */ +/* critical chunks */ +#define PNG_CHUNK_IHDR 0x49484452 +#define PNG_CHUNK_PLTE 0x504c5445 +#define PNG_CHUNK_IDAT 0x49444154 +#define PNG_CHUNK_IEND 0x49454e44 + +/* ancillary chunks */ +#define PNG_CHUNK_bKGD 0x624b4744 +#define PNG_CHUNK_cHRM 0x6348524d +#define PNG_CHUNK_gAMA 0x67414d41 +#define PNG_CHUNK_hIST 0x68495354 +#define PNG_CHUNK_iCCP 0x69434350 +#define PNG_CHUNK_pHYs 0x70485973 +#define PNG_CHUNK_sBIT 0x73424954 +#define PNG_CHUNK_sPLT 0x73504c54 +#define PNG_CHUNK_sRGB 0x73524742 +#define PNG_CHUNK_tEXt 0x74455874 +#define PNG_CHUNK_tIME 0x74494d45 +#define PNG_CHUNK_tRNS 0x74524e53 +#define PNG_CHUNK_zTXt 0x7a545874 + +/* PNG color types */ +#define PNG_COLORTYPE_GREY 0 +#define PNG_COLORTYPE_RGB 2 +#define PNG_COLORTYPE_PALETTE 3 +#define PNG_COLORTYPE_GREYA 4 +#define PNG_COLORTYPE_RGBA 6 + +/* PNG filter types */ +#define PNG_FILTERTYPE_NONE 0 +#define PNG_FILTERTYPE_SUB 1 +#define PNG_FILTERTYPE_UP 2 +#define PNG_FILTERTYPE_AVERAGE 3 +#define PNG_FILTERTYPE_PAETH 4 + +#define PNG_ERROR_MIN 27 +#define PNG_ERROR_MAX 74 + +/* Typedefs */ +typedef struct LodePNG_InfoColor /*info about the color type of an image*/ +{ + /*header (IHDR)*/ + unsigned colorType; /*color type*/ + unsigned bitDepth; /*bits per sample*/ + + /*palette (PLTE)*/ + unsigned char palette[256 * 4]; /*palette in RGBARGBA... order*/ + size_t palettesize; /* palette size in number of colors + * (amount of bytes is 4 * palettesize) + */ + + /*transparent color key (tRNS)*/ + unsigned key_defined; /*is a transparent color key given?*/ + unsigned key_r; /*red component of color key*/ + unsigned key_g; /*green component of color key*/ + unsigned key_b; /*blue component of color key*/ +} LodePNG_InfoColor; + +typedef struct LodePNG_InfoPng /*information about the PNG image, except pixels and sometimes except width and height*/ +{ + /*header (IHDR), palette (PLTE) and transparency (tRNS)*/ + unsigned width; /*width of the image in pixels - filled in by decoder)*/ + unsigned height; /*height of the image in pixels - filled in by decoder)*/ + unsigned compressionMethod; /*compression method of the original file*/ + unsigned filterMethod; /*filter method of the original file*/ + unsigned interlaceMethod; /*interlace method of the original file*/ + LodePNG_InfoColor color; /*color type and bits, palette, transparency*/ + + /*suggested background color (bKGD)*/ + unsigned background_r; /*red component of suggested background color*/ + unsigned background_g; /*green component of suggested background color*/ + unsigned background_b; /*blue component of suggested background color*/ + +} LodePNG_InfoPng; + +typedef struct LodePNG_Decoder +{ + unsigned char *buf; /* pointer to the buffer allocated for decoder + * filled by LodePNG_Decoder_init() + */ + size_t buf_size; /* size of the buffer decoder is free to use + * filled by LodePNG_Decoder_init() + */ + unsigned char *file; /* ptr to raw png file loaded */ + size_t file_size; /* size of the raw png file in mem */ + unsigned char *decoded_img; /* ptr to decoded PNG image in PNG pixel + * format. set by decodeGeneric() + */ + unsigned int native_img_size; /* size of the image in native pixel + * format + */ + LodePNG_InfoPng infoPng; /*info of the PNG image obtained after decoding*/ + long error; +} LodePNG_Decoder; + +/* Public functions prototypes */ +void LodePNG_Decoder_init(LodePNG_Decoder* decoder, + uint8_t *buf, + size_t buf_size); + +void LodePNG_decode(LodePNG_Decoder* decoder, + uint8_t* in, + size_t insize, + void (*pf_progress)(int current, int total)); + +void LodePNG_inspect(LodePNG_Decoder* decoder, uint8_t *in, size_t inlength); + +const char* LodePNG_perror(LodePNG_Decoder *decoder); -- cgit v1.2.3