1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*--------------------------------------------------------------------------- 2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng - simple PNG-writing program wpng.c 4893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 5893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project This program converts certain NetPBM binary files (grayscale and RGB, 6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project maxval = 255) to PNG. Non-interlaced PNGs are written progressively; 7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project interlaced PNGs are read and written in one memory-intensive blast. 8893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 9893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project Thanks to Jean-loup Gailly for providing the necessary trick to read 10893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project interactive text from the keyboard while stdin is redirected. Thanks 11893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project to Cosmin Truta for Cygwin fixes. 12893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project NOTE: includes provisional support for PNM type "8" (portable alphamap) 14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project images, presumed to be a 32-bit interleaved RGBA format; no pro- 15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project vision for possible interleaved grayscale+alpha (16-bit) format. 16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project THIS IS UNLIKELY TO BECOME AN OFFICIAL NETPBM ALPHA FORMAT! 17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project to do: 19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project - delete output file if quit before calling any writepng routines 20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project - process backspace with -text option under DOS/Win? (currently get ^H) 21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project --------------------------------------------------------------------------- 23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project Changelog: 25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project - 1.01: initial public release 26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project - 1.02: modified to allow abbreviated options 27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project - 1.03: removed extraneous character from usage screen; fixed bug in 28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project command-line parsing 29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project - 1.04: fixed DOS/OS2/Win32 detection, including partial Cygwin fix 30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (see http://home.att.net/~perlspinr/diffs/GregBook_cygwin.diff) 31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project - 2.00: dual-licensed (added GNU GPL) 32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project [REPORTED BUG (win32 only): "contrib/gregbook/wpng.c - cmd line 34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project dose not work! In order to do something useful I needed to redirect 35893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project both input and output, with cygwin and with bcc32 as well. Under 36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project Linux, the same wpng appears to work fine. I don't know what is 37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project the problem."] 38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project --------------------------------------------------------------------------- 40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project Copyright (c) 1998-2007 Greg Roelofs. All rights reserved. 42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project This software is provided "as is," without warranty of any kind, 44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project express or implied. In no event shall the author or contributors 45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project be held liable for any damages arising in any way from the use of 46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project this software. 47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project The contents of this file are DUAL-LICENSED. You may modify and/or 49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project redistribute this software according to the terms of one of the 50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project following two licenses (at your option): 51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 52893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project LICENSE 1 ("BSD-like with advertising clause"): 54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project Permission is granted to anyone to use this software for any purpose, 56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project including commercial applications, and to alter it and redistribute 57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project it freely, subject to the following restrictions: 58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1. Redistributions of source code must retain the above copyright 60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project notice, disclaimer, and this list of conditions. 61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 2. Redistributions in binary form must reproduce the above copyright 62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project notice, disclaimer, and this list of conditions in the documenta- 63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project tion and/or other materials provided with the distribution. 64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 3. All advertising materials mentioning features or use of this 65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project software must display the following acknowledgment: 66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project This product includes software developed by Greg Roelofs 68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project and contributors for the book, "PNG: The Definitive Guide," 69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project published by O'Reilly and Associates. 70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project LICENSE 2 (GNU GPL v2 or later): 73893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 74893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project This program is free software; you can redistribute it and/or modify 75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project it under the terms of the GNU General Public License as published by 76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project the Free Software Foundation; either version 2 of the License, or 77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (at your option) any later version. 78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project This program is distributed in the hope that it will be useful, 80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project but WITHOUT ANY WARRANTY; without even the implied warranty of 81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project GNU General Public License for more details. 83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project You should have received a copy of the GNU General Public License 85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project along with this program; if not, write to the Free Software Foundation, 86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ---------------------------------------------------------------------------*/ 89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PROGNAME "wpng" 91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define VERSION "2.00 of 2 June 2007" 92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define APPNAME "Simple PGM/PPM/PAM to PNG Converter" 93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(__MSDOS__) || defined(__OS2__) 95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# define DOS_OS2_W32 96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) 97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# ifndef __GNUC__ /* treat Win32 native ports of gcc as Unix environments */ 98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# define DOS_OS2_W32 99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# endif 100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <stdio.h> 103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <stdlib.h> 104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <string.h> 105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <setjmp.h> /* for jmpbuf declaration in writepng.h */ 106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <time.h> 107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef DOS_OS2_W32 109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# include <io.h> /* for isatty(), setmode() prototypes */ 110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# include <fcntl.h> /* O_BINARY for fdopen() without text translation */ 111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# ifdef __EMX__ 112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# ifndef getch 113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# define getch() _read_kbd(0, 1, 0) /* need getche() */ 114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# endif 115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# else /* !__EMX__ */ 116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# ifdef __GO32__ 117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# include <pc.h> 118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# define getch() getkey() /* GRR: need getche() */ 119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# else 120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# include <conio.h> /* for getche() console input */ 121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# endif 122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# endif /* ?__EMX__ */ 123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# define FGETS(buf,len,stream) dos_kbd_gets(buf,len) 124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# include <unistd.h> /* for isatty() prototype */ 126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# define FGETS fgets 127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* #define DEBUG : this enables the Trace() macros */ 130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* #define FORBID_LATIN1_CTRL : this requires the user to re-enter any 132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text that includes control characters discouraged by the PNG spec; text 133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project that includes an escape character (27) must be re-entered regardless */ 134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "writepng.h" /* typedefs, common macros, writepng prototypes */ 136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* local prototypes */ 140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic int wpng_isvalid_latin1(uch *p, int len); 142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic void wpng_cleanup(void); 143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef DOS_OS2_W32 145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project static char *dos_kbd_gets(char *buf, int len); 146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic mainprog_info wpng_info; /* lone global */ 151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectint main(int argc, char **argv) 155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef DOS_OS2_W32 157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project FILE *keybd; 158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef sgi 160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project FILE *tmpfile; /* or we could just use keybd, since no overlap */ 161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project char tmpline[80]; 162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project char *inname = NULL, outname[256]; 164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project char *p, pnmchar, pnmline[256]; 165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project char *bgstr, *textbuf = NULL; 166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ulg rowbytes; 167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int rc, len = 0; 168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int error = 0; 169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int text = FALSE; 170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int maxval; 171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project double LUT_exponent; /* just the lookup table */ 172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project double CRT_exponent = 2.2; /* just the monitor */ 173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project double default_display_exponent; /* whole display system */ 174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project double default_gamma = 0.0; 175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.infile = NULL; 178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.outfile = NULL; 179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.image_data = NULL; 180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.row_pointers = NULL; 181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.filter = FALSE; 182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.interlaced = FALSE; 183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_bg = FALSE; 184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_time = FALSE; 185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text = 0; 186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.gamma = 0.0; 187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* First get the default value for our display-system exponent, i.e., 190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the product of the CRT exponent and the exponent corresponding to 191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the frame-buffer's lookup table (LUT), if any. If the PNM image 192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * looks correct on the user's display system, its file gamma is the 193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * inverse of this value. (Note that this is not an exhaustive list 194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * of LUT values--e.g., OpenStep has a lot of weird ones--but it should 195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * cover 99% of the current possibilities. This section must ensure 196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * that default_display_exponent is positive.) */ 197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(NeXT) 199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* third-party utilities can modify the default LUT exponent */ 200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project LUT_exponent = 1.0 / 2.2; 201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* 202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (some_next_function_that_returns_gamma(&next_gamma)) 203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project LUT_exponent = 1.0 / next_gamma; 204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#elif defined(sgi) 206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project LUT_exponent = 1.0 / 1.7; 207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* there doesn't seem to be any documented function to 208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * get the "gamma" value, so we do it the hard way */ 209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project tmpfile = fopen("/etc/config/system.glGammaVal", "r"); 210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (tmpfile) { 211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project double sgi_gamma; 212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fgets(tmpline, 80, tmpfile); 214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fclose(tmpfile); 215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project sgi_gamma = atof(tmpline); 216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (sgi_gamma > 0.0) 217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project LUT_exponent = 1.0 / sgi_gamma; 218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#elif defined(Macintosh) 220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project LUT_exponent = 1.8 / 2.61; 221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* 222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (some_mac_function_that_returns_gamma(&mac_gamma)) 223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project LUT_exponent = mac_gamma / 2.61; 224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project LUT_exponent = 1.0; /* assume no LUT: most PCs */ 227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* the defaults above give 1.0, 1.3, 1.5 and 2.2, respectively: */ 230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project default_display_exponent = LUT_exponent * CRT_exponent; 231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* If the user has set the SCREEN_GAMMA environment variable as suggested 234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (somewhat imprecisely) in the libpng documentation, use that; otherwise 235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * use the default value we just calculated. Either way, the user may 236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * override this via a command-line option. */ 237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((p = getenv("SCREEN_GAMMA")) != NULL) { 239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project double exponent = atof(p); 240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (exponent > 0.0) 242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project default_gamma = 1.0 / exponent; 243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (default_gamma == 0.0) 246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project default_gamma = 1.0 / default_display_exponent; 247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Now parse the command line for options and the PNM filename. */ 250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project while (*++argv && !error) { 252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!strncmp(*argv, "-i", 2)) { 253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.interlaced = TRUE; 254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else if (!strncmp(*argv, "-time", 3)) { 255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.modtime = time(NULL); 256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_time = TRUE; 257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else if (!strncmp(*argv, "-text", 3)) { 258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text = TRUE; 259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else if (!strncmp(*argv, "-gamma", 2)) { 260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!*++argv) 261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else { 263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.gamma = atof(*argv); 264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (wpng_info.gamma <= 0.0) 265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (wpng_info.gamma > 1.01) 267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME 268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project " warning: file gammas are usually less than 1.0\n"); 269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else if (!strncmp(*argv, "-bgcolor", 4)) { 271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!*++argv) 272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else { 274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project bgstr = *argv; 275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (strlen(bgstr) != 7 || bgstr[0] != '#') 276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else { 278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project unsigned r, g, b; /* this way quiets compiler warnings */ 279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project sscanf(bgstr+1, "%2x%2x%2x", &r, &g, &b); 281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.bg_red = (uch)r; 282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.bg_green = (uch)g; 283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.bg_blue = (uch)b; 284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_bg = TRUE; 285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else { 288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (**argv != '-') { 289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project inname = *argv; 290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (argv[1]) /* shouldn't be any more args after filename */ 291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else 293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; /* not expecting any other options */ 294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* open the input and output files, or register an error and abort */ 299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!inname) { 301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (isatty(0)) { 302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME 303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ": must give input filename or provide image data via stdin\n"); 304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else { 306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef DOS_OS2_W32 307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* some buggy C libraries require BOTH setmode() and fdopen(bin) */ 308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project setmode(fileno(stdin), O_BINARY); 309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project setmode(fileno(stdout), O_BINARY); 310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((wpng_info.infile = fdopen(fileno(stdin), "rb")) == NULL) { 312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME 313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ": unable to reopen stdin in binary mode\n"); 314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else 316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((wpng_info.outfile = fdopen(fileno(stdout), "wb")) == NULL) { 317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME 318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ": unable to reopen stdout in binary mode\n"); 319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fclose(wpng_info.infile); 320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else 322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.filter = TRUE; 323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else if ((len = strlen(inname)) > 250) { 325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME ": input filename is too long [%d chars]\n", 326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project len); 327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else if (!(wpng_info.infile = fopen(inname, "rb"))) { 329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME ": can't open input file [%s]\n", inname); 330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!error) { 334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fgets(pnmline, 256, wpng_info.infile); 335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (pnmline[0] != 'P' || ((pnmchar = pnmline[1]) != '5' && 336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project pnmchar != '6' && pnmchar != '8')) 337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME 339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ": input file [%s] is not a binary PGM, PPM or PAM file\n", 340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project inname); 341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else { 343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.pnmtype = (int)(pnmchar - '0'); 344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (wpng_info.pnmtype != 8) 345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_bg = FALSE; /* no need for bg if opaque */ 346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do { 347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fgets(pnmline, 256, wpng_info.infile); /* lose any comments */ 348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while (pnmline[0] == '#'); 349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project sscanf(pnmline, "%ld %ld", &wpng_info.width, &wpng_info.height); 350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do { 351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fgets(pnmline, 256, wpng_info.infile); /* more comment lines */ 352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while (pnmline[0] == '#'); 353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project sscanf(pnmline, "%d", &maxval); 354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (wpng_info.width <= 0L || wpng_info.height <= 0L || 355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project maxval != 255) 356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME 358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ": only positive width/height, maxval == 255 allowed \n"); 359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.sample_depth = 8; /* <==> maxval 255 */ 362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!wpng_info.filter) { 364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* make outname from inname */ 365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((p = strrchr(inname, '.')) == NULL || 366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (p - inname) != (len - 4)) 367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project strcpy(outname, inname); 369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project strcpy(outname+len, ".png"); 370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else { 371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project len -= 4; 372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project strncpy(outname, inname, len); 373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project strcpy(outname+len, ".png"); 374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* check if outname already exists; if not, open */ 376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((wpng_info.outfile = fopen(outname, "rb")) != NULL) { 377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME ": output file exists [%s]\n", 378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project outname); 379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fclose(wpng_info.outfile); 380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else if (!(wpng_info.outfile = fopen(outname, "wb"))) { 382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME ": can't open output file [%s]\n", 383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project outname); 384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (error) { 389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fclose(wpng_info.infile); 390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.infile = NULL; 391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (wpng_info.filter) { 392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fclose(wpng_info.outfile); 393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.outfile = NULL; 394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* if we had any errors, print usage and die horrible death...arrr! */ 400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (error) { 402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, "\n%s %s: %s\n", PROGNAME, VERSION, APPNAME); 403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project writepng_version_info(); 404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, "\n" 405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project"Usage: %s [-gamma exp] [-bgcolor bg] [-text] [-time] [-interlace] pnmfile\n" 406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project"or: ... | %s [-gamma exp] [-bgcolor bg] [-text] [-time] [-interlace] | ...\n" 407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project " exp \ttransfer-function exponent (``gamma'') of the image in\n" 408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "\t\t floating-point format (e.g., ``%.5f''); if image looks\n" 409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "\t\t correct on given display system, image gamma is equal to\n" 410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "\t\t inverse of display-system exponent, i.e., 1 / (LUT * CRT)\n" 411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "\t\t (where LUT = lookup-table exponent and CRT = CRT exponent;\n" 412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "\t\t first varies, second is usually 2.2, all are positive)\n" 413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project " bg \tdesired background color for alpha-channel images, in\n" 414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "\t\t 7-character hex RGB format (e.g., ``#ff7700'' for orange:\n" 415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "\t\t same as HTML colors)\n" 416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project " -text\tprompt interactively for text info (tEXt chunks)\n" 417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project " -time\tinclude a tIME chunk (last modification time)\n" 418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project " -interlace\twrite interlaced PNG image\n" 419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "\n" 420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project"pnmfile or stdin must be a binary PGM (`P5'), PPM (`P6') or (extremely\n" 421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project"unofficial and unsupported!) PAM (`P8') file. Currently it is required\n" 422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project"to have maxval == 255 (i.e., no scaling). If pnmfile is specified, it\n" 423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project"is converted to the corresponding PNG file with the same base name but a\n" 424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project"``.png'' extension; files read from stdin are converted and sent to stdout.\n" 425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project"The conversion is progressive (low memory usage) unless interlacing is\n" 426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project"requested; in that case the whole image will be buffered in memory and\n" 427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project"written in one call.\n" 428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "\n", PROGNAME, PROGNAME, default_gamma); 429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project exit(1); 430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* prepare the text buffers for libpng's use; note that even though 434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * PNG's png_text struct includes a length field, we don't have to fill 435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * it out */ 436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (text && 438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef DOS_OS2_W32 439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (keybd = fdopen(fileno(stderr), "r")) != NULL && 440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (textbuf = (char *)malloc((5 + 9)*75)) != NULL) 442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i, valid, result; 444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, 446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "Enter text info (no more than 72 characters per line);\n"); 447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, "to skip a field, hit the <Enter> key.\n"); 448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* note: just <Enter> leaves len == 1 */ 449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do { 451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = TRUE; 452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project p = textbuf + TEXT_TITLE_OFFSET; 453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, " Title: "); 454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (FGETS(p, 74, keybd) && (len = strlen(p)) > 1) { 456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (p[len-1] == '\n') 457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project p[--len] = '\0'; 458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.title = p; 459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text |= TEXT_TITLE; 460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((result = wpng_isvalid_latin1((uch *)p, len)) >= 0) { 461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, " " PROGNAME " warning: character code" 462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project " %u is %sdiscouraged by the PNG\n specification " 463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "[first occurrence was at character position #%d]\n", 464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (unsigned)p[result], (p[result] == 27)? "strongly " : "", 465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project result+1); 466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef FORBID_LATIN1_CTRL 468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text &= ~TEXT_TITLE; 469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = FALSE; 470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (p[result] == 27) { /* escape character */ 472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text &= ~TEXT_TITLE; 473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = FALSE; 474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while (!valid); 479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do { 481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = TRUE; 482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project p = textbuf + TEXT_AUTHOR_OFFSET; 483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, " Author: "); 484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (FGETS(p, 74, keybd) && (len = strlen(p)) > 1) { 486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (p[len-1] == '\n') 487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project p[--len] = '\0'; 488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.author = p; 489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text |= TEXT_AUTHOR; 490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((result = wpng_isvalid_latin1((uch *)p, len)) >= 0) { 491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, " " PROGNAME " warning: character code" 492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project " %u is %sdiscouraged by the PNG\n specification " 493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "[first occurrence was at character position #%d]\n", 494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (unsigned)p[result], (p[result] == 27)? "strongly " : "", 495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project result+1); 496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef FORBID_LATIN1_CTRL 498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text &= ~TEXT_AUTHOR; 499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = FALSE; 500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (p[result] == 27) { /* escape character */ 502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text &= ~TEXT_AUTHOR; 503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = FALSE; 504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while (!valid); 509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do { 511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = TRUE; 512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project p = textbuf + TEXT_DESC_OFFSET; 513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, " Description (up to 9 lines):\n"); 514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 1; i < 10; ++i) { 515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, " [%d] ", i); 516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (FGETS(p, 74, keybd) && (len = strlen(p)) > 1) 518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project p += len; /* now points at NULL; char before is newline */ 519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((len = p - (textbuf + TEXT_DESC_OFFSET)) > 1) { 523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (p[-1] == '\n') { 524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project p[-1] = '\0'; 525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project --len; 526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.desc = textbuf + TEXT_DESC_OFFSET; 528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text |= TEXT_DESC; 529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project p = textbuf + TEXT_DESC_OFFSET; 530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((result = wpng_isvalid_latin1((uch *)p, len)) >= 0) { 531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, " " PROGNAME " warning: character code" 532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project " %u is %sdiscouraged by the PNG\n specification " 533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "[first occurrence was at character position #%d]\n", 534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (unsigned)p[result], (p[result] == 27)? "strongly " : "", 535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project result+1); 536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef FORBID_LATIN1_CTRL 538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text &= ~TEXT_DESC; 539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = FALSE; 540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (p[result] == 27) { /* escape character */ 542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text &= ~TEXT_DESC; 543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = FALSE; 544893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 547893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while (!valid); 549893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do { 551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = TRUE; 552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project p = textbuf + TEXT_COPY_OFFSET; 553893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, " Copyright: "); 554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (FGETS(p, 74, keybd) && (len = strlen(p)) > 1) { 556893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (p[len-1] == '\n') 557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project p[--len] = '\0'; 558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.copyright = p; 559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text |= TEXT_COPY; 560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((result = wpng_isvalid_latin1((uch *)p, len)) >= 0) { 561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, " " PROGNAME " warning: character code" 562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project " %u is %sdiscouraged by the PNG\n specification " 563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "[first occurrence was at character position #%d]\n", 564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (unsigned)p[result], (p[result] == 27)? "strongly " : "", 565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project result+1); 566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef FORBID_LATIN1_CTRL 568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text &= ~TEXT_COPY; 569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = FALSE; 570893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (p[result] == 27) { /* escape character */ 572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text &= ~TEXT_COPY; 573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = FALSE; 574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while (!valid); 579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do { 581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = TRUE; 582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project p = textbuf + TEXT_EMAIL_OFFSET; 583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, " E-mail: "); 584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (FGETS(p, 74, keybd) && (len = strlen(p)) > 1) { 586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (p[len-1] == '\n') 587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project p[--len] = '\0'; 588893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.email = p; 589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text |= TEXT_EMAIL; 590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((result = wpng_isvalid_latin1((uch *)p, len)) >= 0) { 591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, " " PROGNAME " warning: character code" 592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project " %u is %sdiscouraged by the PNG\n specification " 593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "[first occurrence was at character position #%d]\n", 594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (unsigned)p[result], (p[result] == 27)? "strongly " : "", 595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project result+1); 596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef FORBID_LATIN1_CTRL 598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text &= ~TEXT_EMAIL; 599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = FALSE; 600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (p[result] == 27) { /* escape character */ 602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text &= ~TEXT_EMAIL; 603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = FALSE; 604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while (!valid); 609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do { 611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = TRUE; 612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project p = textbuf + TEXT_URL_OFFSET; 613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, " URL: "); 614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (FGETS(p, 74, keybd) && (len = strlen(p)) > 1) { 616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (p[len-1] == '\n') 617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project p[--len] = '\0'; 618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.url = p; 619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text |= TEXT_URL; 620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((result = wpng_isvalid_latin1((uch *)p, len)) >= 0) { 621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, " " PROGNAME " warning: character code" 622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project " %u is %sdiscouraged by the PNG\n specification " 623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "[first occurrence was at character position #%d]\n", 624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (unsigned)p[result], (p[result] == 27)? "strongly " : "", 625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project result+1); 626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef FORBID_LATIN1_CTRL 628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text &= ~TEXT_URL; 629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = FALSE; 630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (p[result] == 27) { /* escape character */ 632893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text &= ~TEXT_URL; 633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project valid = FALSE; 634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 635893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 636893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 637893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while (!valid); 639893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 640893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef DOS_OS2_W32 641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fclose(keybd); 642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 644893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else if (text) { 645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME ": unable to allocate memory for text\n"); 646893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text = FALSE; 647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.have_text = 0; 648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 649893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 651893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* allocate libpng stuff, initialize transformations, write pre-IDAT data */ 652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((rc = writepng_init(&wpng_info)) != 0) { 654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project switch (rc) { 655893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 2: 656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME 657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ": libpng initialization problem (longjmp)\n"); 658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 659893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 4: 660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME ": insufficient memory\n"); 661893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 11: 663893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME 664893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ": internal logic error (unexpected PNM type)\n"); 665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 666893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project default: 667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME 668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ": unknown writepng_init() error\n"); 669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project exit(rc); 672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 673893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 674893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 675893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* free textbuf, since it's a completely local variable and all text info 676893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * has just been written to the PNG file */ 677893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 678893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (text && textbuf) { 679893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project free(textbuf); 680893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project textbuf = NULL; 681893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 682893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 683893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 684893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* calculate rowbytes on basis of image type; note that this becomes much 685893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * more complicated if we choose to support PBM type, ASCII PNM types, or 686893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 16-bit-per-sample binary data [currently not an official NetPBM type] */ 687893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 688893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (wpng_info.pnmtype == 5) 689893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project rowbytes = wpng_info.width; 690893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (wpng_info.pnmtype == 6) 691893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project rowbytes = wpng_info.width * 3; 692893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else /* if (wpng_info.pnmtype == 8) */ 693893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project rowbytes = wpng_info.width * 4; 694893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 695893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 696893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* read and write the image, either in its entirety (if writing interlaced 697893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * PNG) or row by row (if non-interlaced) */ 698893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 699893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, "Encoding image data...\n"); 700893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 701893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 702893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (wpng_info.interlaced) { 703893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project long i; 704893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ulg bytes; 705893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ulg image_bytes = rowbytes * wpng_info.height; /* overflow? */ 706893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 707893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.image_data = (uch *)malloc(image_bytes); 708893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.row_pointers = (uch **)malloc(wpng_info.height*sizeof(uch *)); 709893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (wpng_info.image_data == NULL || wpng_info.row_pointers == NULL) { 710893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME ": insufficient memory for image data\n"); 711893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project writepng_cleanup(&wpng_info); 712893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_cleanup(); 713893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project exit(5); 714893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 715893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < wpng_info.height; ++i) 716893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.row_pointers[i] = wpng_info.image_data + i*rowbytes; 717893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project bytes = fread(wpng_info.image_data, 1, image_bytes, wpng_info.infile); 718893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (bytes != image_bytes) { 719893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME ": expected %lu bytes, got %lu bytes\n", 720893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project image_bytes, bytes); 721893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, " (continuing anyway)\n"); 722893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 723893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (writepng_encode_image(&wpng_info) != 0) { 724893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME 725893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ": libpng problem (longjmp) while writing image data\n"); 726893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project writepng_cleanup(&wpng_info); 727893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_cleanup(); 728893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project exit(2); 729893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 730893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 731893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } else /* not interlaced: write progressively (row by row) */ { 732893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project long j; 733893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ulg bytes; 734893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 735893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.image_data = (uch *)malloc(rowbytes); 736893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (wpng_info.image_data == NULL) { 737893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME ": insufficient memory for row data\n"); 738893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project writepng_cleanup(&wpng_info); 739893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_cleanup(); 740893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project exit(5); 741893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 742893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project error = 0; 743893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (j = wpng_info.height; j > 0L; --j) { 744893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project bytes = fread(wpng_info.image_data, 1, rowbytes, wpng_info.infile); 745893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (bytes != rowbytes) { 746893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME 747893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ": expected %lu bytes, got %lu bytes (row %ld)\n", rowbytes, 748893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project bytes, wpng_info.height-j); 749893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 750893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 751893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 752893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (writepng_encode_row(&wpng_info) != 0) { 753893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME 754893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ": libpng problem (longjmp) while writing row %ld\n", 755893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.height-j); 756893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ++error; 757893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 758893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 759893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 760893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (error) { 761893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project writepng_cleanup(&wpng_info); 762893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_cleanup(); 763893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project exit(2); 764893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 765893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (writepng_encode_finish(&wpng_info) != 0) { 766893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, PROGNAME ": error on final libpng call\n"); 767893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project writepng_cleanup(&wpng_info); 768893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_cleanup(); 769893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project exit(2); 770893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 771893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 772893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 773893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 774893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* OK, we're done (successfully): clean up all resources and quit */ 775893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 776893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, "Done.\n"); 777893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 778893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 779893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project writepng_cleanup(&wpng_info); 780893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_cleanup(); 781893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 782893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return 0; 783893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 784893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 785893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 786893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 787893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 788893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 789893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic int wpng_isvalid_latin1(uch *p, int len) 790893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 791893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i, result = -1; 792893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 793893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < len; ++i) { 794893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (p[i] == 10 || (p[i] > 31 && p[i] < 127) || p[i] > 160) 795893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project continue; /* character is completely OK */ 796893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (result < 0 || (p[result] != 27 && p[i] == 27)) 797893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project result = i; /* mark location of first questionable one */ 798893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } /* or of first escape character (bad) */ 799893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 800893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return result; 801893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 802893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 803893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 804893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 805893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 806893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 807893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic void wpng_cleanup(void) 808893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 809893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (wpng_info.outfile) { 810893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fclose(wpng_info.outfile); 811893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.outfile = NULL; 812893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 813893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 814893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (wpng_info.infile) { 815893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fclose(wpng_info.infile); 816893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.infile = NULL; 817893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 818893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 819893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (wpng_info.image_data) { 820893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project free(wpng_info.image_data); 821893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.image_data = NULL; 822893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 823893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 824893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (wpng_info.row_pointers) { 825893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project free(wpng_info.row_pointers); 826893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wpng_info.row_pointers = NULL; 827893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 828893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 829893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 830893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 831893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 832893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 833893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef DOS_OS2_W32 834893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 835893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic char *dos_kbd_gets(char *buf, int len) 836893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 837893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int ch, count=0; 838893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 839893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do { 840893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project buf[count++] = ch = getche(); 841893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while (ch != '\r' && count < len-1); 842893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 843893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project buf[count--] = '\0'; /* terminate string */ 844893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (buf[count] == '\r') /* Enter key makes CR, so change to newline */ 845893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project buf[count] = '\n'; 846893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 847893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fprintf(stderr, "\n"); /* Enter key does *not* cause a newline */ 848893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project fflush(stderr); 849893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 850893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return buf; 851893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 852893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 853893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* DOS_OS2_W32 */ 854