1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*---------------------------------------------------------------------------
2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   rpng - simple PNG display program                              readppm.c
4893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
5893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  ---------------------------------------------------------------------------
6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   This is a special-purpose replacement for readpng.c that allows binary
8893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PPM files to be used in place of PNG images.
9893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
10893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  ---------------------------------------------------------------------------
11893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
12893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      Copyright (c) 1998-2007 Greg Roelofs.  All rights reserved.
13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      This software is provided "as is," without warranty of any kind,
15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      express or implied.  In no event shall the author or contributors
16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      be held liable for any damages arising in any way from the use of
17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      this software.
18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      The contents of this file are DUAL-LICENSED.  You may modify and/or
20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      redistribute this software according to the terms of one of the
21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      following two licenses (at your option):
22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      LICENSE 1 ("BSD-like with advertising clause"):
25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      Permission is granted to anyone to use this software for any purpose,
27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      including commercial applications, and to alter it and redistribute
28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      it freely, subject to the following restrictions:
29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      1. Redistributions of source code must retain the above copyright
31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         notice, disclaimer, and this list of conditions.
32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      2. Redistributions in binary form must reproduce the above copyright
33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         notice, disclaimer, and this list of conditions in the documenta-
34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         tion and/or other materials provided with the distribution.
35893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      3. All advertising materials mentioning features or use of this
36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         software must display the following acknowledgment:
37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            This product includes software developed by Greg Roelofs
39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            and contributors for the book, "PNG: The Definitive Guide,"
40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            published by O'Reilly and Associates.
41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      LICENSE 2 (GNU GPL v2 or later):
44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      This program is free software; you can redistribute it and/or modify
46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      it under the terms of the GNU General Public License as published by
47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      the Free Software Foundation; either version 2 of the License, or
48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      (at your option) any later version.
49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      This program is distributed in the hope that it will be useful,
51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      but WITHOUT ANY WARRANTY; without even the implied warranty of
52893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      GNU General Public License for more details.
54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      You should have received a copy of the GNU General Public License
56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      along with this program; if not, write to the Free Software Foundation,
57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  ---------------------------------------------------------------------------*/
60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <stdio.h>
62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <stdlib.h>
63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "readpng.h"    /* typedefs, common macros, public prototypes */
65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectulg  width, height;
68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectint  bit_depth, color_type, channels;
69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectuch  *image_data = NULL;
70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectFILE *saved_infile;
71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
73893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid readpng_version_info()
74893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fprintf(stderr, "   Compiled without libpng, zlib or PBMPLUS/NetPBM.\n");
76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* return value = 0 for success, 1 for bad sig, 2 for bad IHDR, 4 for no mem */
80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectint readpng_init(FILE *infile, ulg *pWidth, ulg *pHeight)
82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    static uch ppmline[256];
84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    int maxval;
85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    saved_infile = infile;
88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fgets(ppmline, 256, infile);
90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (ppmline[0] != 'P' || ppmline[1] != '6') {
91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fprintf(stderr, "ERROR:  not a PPM file\n");
92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        return 1;
93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* possible color types:  P5 = grayscale (0), P6 = RGB (2), P8 = RGBA (6) */
95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (ppmline[1] == '6') {
96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        color_type = 2;
97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        channels = 3;
98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    } else if (ppmline[1] == '8') {
99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        color_type = 6;
100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        channels = 4;
101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    } else /* if (ppmline[1] == '5') */ {
102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        color_type = 0;
103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        channels = 1;
104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    do {
107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fgets(ppmline, 256, infile);
108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    } while (ppmline[0] == '#');
109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    sscanf(ppmline, "%lu %lu", &width, &height);
110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    do {
112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fgets(ppmline, 256, infile);
113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    } while (ppmline[0] == '#');
114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    sscanf(ppmline, "%d", &maxval);
115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (maxval != 255) {
116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fprintf(stderr, "ERROR:  maxval = %d\n", maxval);
117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        return 2;
118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    bit_depth = 8;
120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *pWidth = width;
122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *pHeight = height;
123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return 0;
125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* returns 0 if succeeds, 1 if fails due to no bKGD chunk, 2 if libpng error;
131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * scales values to 8-bit if necessary */
132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectint readpng_get_bgcolor(uch *red, uch *green, uch *blue)
134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return 1;
136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* display_exponent == LUT_exponent * CRT_exponent */
142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectuch *readpng_get_image(double display_exponent, int *pChannels, ulg *pRowbytes)
144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    ulg  rowbytes;
146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* expand palette images to RGB, low-bit-depth grayscale images to 8 bits,
149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * transparency chunks to full alpha channel; strip 16-bit-per-sample
150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * images to 8 bits per sample; and convert grayscale to RGB[A] */
151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* GRR WARNING:  grayscale needs to be expanded and channels reset! */
153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *pRowbytes = rowbytes = channels*width;
155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *pChannels = channels;
156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if ((image_data = (uch *)malloc(rowbytes*height)) == NULL) {
158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        return NULL;
159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    Trace((stderr, "readpng_get_image:  rowbytes = %ld, height = %ld\n", rowbytes, height));
162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* now we can go ahead and just read the whole image */
165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fread(image_data, 1L, rowbytes*height, saved_infile);
167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return image_data;
170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid readpng_cleanup(int free_image_data)
174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (free_image_data && image_data) {
176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        free(image_data);
177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        image_data = NULL;
178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
180