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