rockbox/apps/plugins/imageviewer/png/png_decoder.h
Marcin Bukat e26d0c62e0 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
2010-10-31 12:40:49 +00:00

141 lines
5.4 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$id $
*
* Copyright (C) 2009 by Christophe Gouiran <bechris13250 -at- gmail -dot- com>
*
* 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);