summaryrefslogtreecommitdiffstats
path: root/apps/plugins/imageviewer/png/png_decoder.h
blob: 4ca2a5127721ffa49e795575192d0610d96962a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/***************************************************************************
 *             __________               __   ___.
 *   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);