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