1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*---------------------------------------------------------------------------
2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   rpng - simple PNG display program                             rpng-win.c
4893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
5893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   This program decodes and displays PNG images, with gamma correction and
6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   optionally with a user-specified background color (in case the image has
7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   transparency).  It is very nearly the most basic PNG viewer possible.
8893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   This version is for 32-bit Windows; it may compile under 16-bit Windows
9893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   with a little tweaking (or maybe not).
10893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   to do:
12893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    - handle quoted command-line args (especially filenames with spaces)
13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    - have minimum window width:  oh well
14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    - use %.1023s to simplify truncation of title-bar string?
15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  ---------------------------------------------------------------------------
17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   Changelog:
19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    - 1.00:  initial public release
20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    - 1.01:  modified to allow abbreviated options; fixed long/ulong mis-
21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project              match; switched to png_jmpbuf() macro
22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    - 1.02:  added extra set of parentheses to png_jmpbuf() macro; fixed
23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project              command-line parsing bug
24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    - 1.10:  enabled "message window"/console (thanks to David Geldreich)
25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    - 2.00:  dual-licensed (added GNU GPL)
26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    - 2.01:  fixed improper display of usage screen on PNG error(s)
27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  ---------------------------------------------------------------------------
29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      Copyright (c) 1998-2008 Greg Roelofs.  All rights reserved.
31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      This software is provided "as is," without warranty of any kind,
33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      express or implied.  In no event shall the author or contributors
34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      be held liable for any damages arising in any way from the use of
35893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      this software.
36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      The contents of this file are DUAL-LICENSED.  You may modify and/or
38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      redistribute this software according to the terms of one of the
39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      following two licenses (at your option):
40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      LICENSE 1 ("BSD-like with advertising clause"):
43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      Permission is granted to anyone to use this software for any purpose,
45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      including commercial applications, and to alter it and redistribute
46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      it freely, subject to the following restrictions:
47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      1. Redistributions of source code must retain the above copyright
49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         notice, disclaimer, and this list of conditions.
50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      2. Redistributions in binary form must reproduce the above copyright
51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         notice, disclaimer, and this list of conditions in the documenta-
52893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         tion and/or other materials provided with the distribution.
53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      3. All advertising materials mentioning features or use of this
54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         software must display the following acknowledgment:
55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            This product includes software developed by Greg Roelofs
57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            and contributors for the book, "PNG: The Definitive Guide,"
58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            published by O'Reilly and Associates.
59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      LICENSE 2 (GNU GPL v2 or later):
62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      This program is free software; you can redistribute it and/or modify
64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      it under the terms of the GNU General Public License as published by
65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      the Free Software Foundation; either version 2 of the License, or
66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      (at your option) any later version.
67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      This program is distributed in the hope that it will be useful,
69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      but WITHOUT ANY WARRANTY; without even the implied warranty of
70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      GNU General Public License for more details.
72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
73893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      You should have received a copy of the GNU General Public License
74893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      along with this program; if not, write to the Free Software Foundation,
75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  ---------------------------------------------------------------------------*/
78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PROGNAME  "rpng-win"
80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define LONGNAME  "Simple PNG Viewer for Windows"
81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define VERSION   "2.01 of 16 March 2008"
82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <stdio.h>
84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <stdlib.h>
85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <string.h>
86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <time.h>
87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <windows.h>
88ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#ifdef __CYGWIN__
89ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik/* getch replacement. Turns out, we don't really need this,
90ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * but leave it here if we ever enable any of the uses of
91ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * _getch in the main code
92ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik */
93ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include <unistd.h>
94ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include <termio.h>
95ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include <sys/ioctl.h>
96ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikint repl_getch( void )
97ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik{
98ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  char ch;
99ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  int fd = fileno(stdin);
100ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  struct termio old_tty, new_tty;
101ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
102ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  ioctl(fd, TCGETA, &old_tty);
103ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  new_tty = old_tty;
104ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  new_tty.c_lflag &= ~(ICANON | ECHO | ISIG);
105ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  ioctl(fd, TCSETA, &new_tty);
106ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  fread(&ch, 1, sizeof(ch), stdin);
107ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  ioctl(fd, TCSETA, &old_tty);
108ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
109ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik  return ch;
110ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik}
111ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#define _getch repl_getch
112ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#else
113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <conio.h>      /* only for _getch() */
114ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#endif
115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* #define DEBUG  :  this enables the Trace() macros */
117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "readpng.h"    /* typedefs, common macros, readpng prototypes */
119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* could just include png.h, but this macro is the only thing we need
122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (name and typedefs changed to local versions); note that side effects
123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * only happen with alpha (which could easily be avoided with
124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * "ush acopy = (alpha);") */
125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define alpha_composite(composite, fg, alpha, bg) {               \
127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    ush temp = ((ush)(fg)*(ush)(alpha) +                          \
128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                (ush)(bg)*(ush)(255 - (ush)(alpha)) + (ush)128);  \
129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    (composite) = (uch)((temp + (temp >> 8)) >> 8);               \
130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* local prototypes */
134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic int        rpng_win_create_window(HINSTANCE hInst, int showmode);
135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic int        rpng_win_display_image(void);
136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic void       rpng_win_cleanup(void);
137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectLRESULT CALLBACK  rpng_win_wndproc(HWND, UINT, WPARAM, LPARAM);
138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic char titlebar[1024];
141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic char *progname = PROGNAME;
142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic char *appname = LONGNAME;
143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic char *filename;
144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic FILE *infile;
145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic char *bgstr;
147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic uch bg_red=0, bg_green=0, bg_blue=0;
148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic double display_exponent;
150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic ulg image_width, image_height, image_rowbytes;
152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic int image_channels;
153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic uch *image_data;
154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Windows-specific variables */
156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic ulg wimage_rowbytes;
157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic uch *dib;
158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic uch *wimage_data;
159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic BITMAPINFOHEADER *bmih;
160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic HWND global_hwnd;
162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectint WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    char *args[1024];                 /* arbitrary limit, but should suffice */
169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    char *p, *q, **argv = args;
170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    int argc = 0;
171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    int rc, alen, flen;
172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    int error = 0;
173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    int have_bg = FALSE;
174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    double LUT_exponent;              /* just the lookup table */
175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    double CRT_exponent = 2.2;        /* just the monitor */
176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    double default_display_exponent;  /* whole display system */
177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    MSG msg;
178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    filename = (char *)NULL;
181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
182ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#ifndef __CYGWIN__
183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* First reenable console output, which normally goes to the bit bucket
184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * for windowed apps.  Closing the console window will terminate the
185851c67770f9cebece9c79e914a54c348f539a512Matt Sarett     * app.  Thanks to David.Geldreich@realviz.com for supplying the magical
186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * incantation. */
187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    AllocConsole();
189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    freopen("CONOUT$", "a", stderr);
190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    freopen("CONOUT$", "a", stdout);
191ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#endif
192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* Next set the default value for our display-system exponent, i.e.,
195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * the product of the CRT exponent and the exponent corresponding to
196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * the frame-buffer's lookup table (LUT), if any.  This is not an
197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * exhaustive list of LUT values (e.g., OpenStep has a lot of weird
198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * ones), but it should cover 99% of the current possibilities.  And
199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * yes, these ifdefs are completely wasted in a Windows program... */
200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(NeXT)
202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    LUT_exponent = 1.0 / 2.2;
203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /*
204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (some_next_function_that_returns_gamma(&next_gamma))
205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        LUT_exponent = 1.0 / next_gamma;
206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     */
207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#elif defined(sgi)
208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    LUT_exponent = 1.0 / 1.7;
209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* there doesn't seem to be any documented function to get the
210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * "gamma" value, so we do it the hard way */
211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    infile = fopen("/etc/config/system.glGammaVal", "r");
212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (infile) {
213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        double sgi_gamma;
214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fgets(tmpline, 80, infile);
216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fclose(infile);
217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        sgi_gamma = atof(tmpline);
218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        if (sgi_gamma > 0.0)
219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            LUT_exponent = 1.0 / sgi_gamma;
220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#elif defined(Macintosh)
222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    LUT_exponent = 1.8 / 2.61;
223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /*
224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (some_mac_function_that_returns_gamma(&mac_gamma))
225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        LUT_exponent = mac_gamma / 2.61;
226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     */
227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    LUT_exponent = 1.0;   /* assume no LUT:  most PCs */
229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* the defaults above give 1.0, 1.3, 1.5 and 2.2, respectively: */
232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    default_display_exponent = LUT_exponent * CRT_exponent;
233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* If the user has set the SCREEN_GAMMA environment variable as suggested
236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * (somewhat imprecisely) in the libpng documentation, use that; otherwise
237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * use the default value we just calculated.  Either way, the user may
238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * override this via a command-line option. */
239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if ((p = getenv("SCREEN_GAMMA")) != NULL)
241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        display_exponent = atof(p);
242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else
243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        display_exponent = default_display_exponent;
244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* Windows really hates command lines, so we have to set up our own argv.
247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * Note that we do NOT bother with quoted arguments here, so don't use
248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * filenames with spaces in 'em! */
249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    argv[argc++] = PROGNAME;
251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    p = cmd;
252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    for (;;) {
253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        if (*p == ' ')
254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            while (*++p == ' ')
255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                ;
256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        /* now p points at the first non-space after some spaces */
257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        if (*p == '\0')
258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;    /* nothing after the spaces:  done */
259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        argv[argc++] = q = p;
260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        while (*q && *q != ' ')
261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            ++q;
262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        /* now q points at a space or the end of the string */
263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        if (*q == '\0')
264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;    /* last argv already terminated; quit */
265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        *q = '\0';    /* change space to terminator */
266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        p = q + 1;
267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    argv[argc] = NULL;   /* terminate the argv array itself */
269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* Now parse the command line for options and the PNG filename. */
272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    while (*++argv && !error) {
274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        if (!strncmp(*argv, "-gamma", 2)) {
275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (!*++argv)
276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                ++error;
277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            else {
278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                display_exponent = atof(*argv);
279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                if (display_exponent <= 0.0)
280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    ++error;
281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        } else if (!strncmp(*argv, "-bgcolor", 2)) {
283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (!*++argv)
284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                ++error;
285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            else {
286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                bgstr = *argv;
287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                if (strlen(bgstr) != 7 || bgstr[0] != '#')
288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    ++error;
289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                else
290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    have_bg = TRUE;
291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        } else {
293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (**argv != '-') {
294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                filename = *argv;
295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                if (argv[1])   /* shouldn't be any more args after filename */
296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    ++error;
297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            } else
298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                ++error;   /* not expecting any other options */
299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        }
300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (!filename)
303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        ++error;
304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* print usage screen if any errors up to this point */
307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (error) {
309ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#ifndef __CYGWIN__
310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        int ch;
311ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#endif
312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fprintf(stderr, "\n%s %s:  %s\n\n", PROGNAME, VERSION, appname);
314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        readpng_version_info();
315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fprintf(stderr, "\n"
316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          "Usage:  %s [-gamma exp] [-bgcolor bg] file.png\n"
317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          "    exp \ttransfer-function exponent (``gamma'') of the display\n"
318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          "\t\t  system in floating-point format (e.g., ``%.1f''); equal\n"
319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          "\t\t  to the product of the lookup-table exponent (varies)\n"
320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          "\t\t  and the CRT exponent (usually 2.2); must be positive\n"
321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          "    bg  \tdesired background color in 7-character hex RGB format\n"
322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          "\t\t  (e.g., ``#ff7700'' for orange:  same as HTML colors);\n"
323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          "\t\t  used with transparent images\n"
324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          "\nPress Q, Esc or mouse button 1 after image is displayed to quit.\n"
325ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#ifndef __CYGWIN__
326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          "Press Q or Esc to quit this usage screen.\n"
327ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#endif
328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          "\n", PROGNAME, default_display_exponent);
329ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#ifndef __CYGWIN__
330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        do
331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            ch = _getch();
332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        while (ch != 'q' && ch != 'Q' && ch != 0x1B);
333ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#endif
334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        exit(1);
335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (!(infile = fopen(filename, "rb"))) {
339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fprintf(stderr, PROGNAME ":  can't open PNG file [%s]\n", filename);
340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        ++error;
341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    } else {
342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        if ((rc = readpng_init(infile, &image_width, &image_height)) != 0) {
343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            switch (rc) {
344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                case 1:
345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    fprintf(stderr, PROGNAME
346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                      ":  [%s] is not a PNG file: incorrect signature\n",
347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                      filename);
348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    break;
349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                case 2:
350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    fprintf(stderr, PROGNAME
351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                      ":  [%s] has bad IHDR (libpng longjmp)\n", filename);
352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    break;
353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                case 4:
354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    fprintf(stderr, PROGNAME ":  insufficient memory\n");
355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    break;
356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                default:
357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    fprintf(stderr, PROGNAME
358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                      ":  unknown readpng_init() error\n");
359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    break;
360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            ++error;
362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        }
363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        if (error)
364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            fclose(infile);
365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (error) {
369ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#ifndef __CYGWIN__
370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        int ch;
371ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#endif
372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fprintf(stderr, PROGNAME ":  aborting.\n");
374ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#ifndef __CYGWIN__
375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        do
376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            ch = _getch();
377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        while (ch != 'q' && ch != 'Q' && ch != 0x1B);
378ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#endif
379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        exit(2);
380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    } else {
381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fprintf(stderr, "\n%s %s:  %s\n", PROGNAME, VERSION, appname);
382ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#ifndef __CYGWIN__
383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fprintf(stderr,
384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          "\n   [console window:  closing this window will terminate %s]\n\n",
385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          PROGNAME);
386ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#endif
387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* set the title-bar string, but make sure buffer doesn't overflow */
391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    alen = strlen(appname);
393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    flen = strlen(filename);
394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (alen + flen + 3 > 1023)
395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        sprintf(titlebar, "%s:  ...%s", appname, filename+(alen+flen+6-1023));
396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else
397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        sprintf(titlebar, "%s:  %s", appname, filename);
398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* if the user didn't specify a background color on the command line,
401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * check for one in the PNG file--if not, the initialized values of 0
402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * (black) will be used */
403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (have_bg) {
405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        unsigned r, g, b;   /* this approach quiets compiler warnings */
406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        sscanf(bgstr+1, "%2x%2x%2x", &r, &g, &b);
408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        bg_red   = (uch)r;
409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        bg_green = (uch)g;
410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        bg_blue  = (uch)b;
411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    } else if (readpng_get_bgcolor(&bg_red, &bg_green, &bg_blue) > 1) {
412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        readpng_cleanup(TRUE);
413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fprintf(stderr, PROGNAME
414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          ":  libpng error while checking for background color\n");
415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        exit(2);
416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* do the basic Windows initialization stuff, make the window and fill it
420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * with the background color */
421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (rpng_win_create_window(hInst, showmode))
423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        exit(2);
424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* decode the image, all at once */
427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    Trace((stderr, "calling readpng_get_image()\n"))
429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    image_data = readpng_get_image(display_exponent, &image_channels,
430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      &image_rowbytes);
431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    Trace((stderr, "done with readpng_get_image()\n"))
432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* done with PNG file, so clean up to minimize memory usage (but do NOT
435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     * nuke image_data!) */
436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    readpng_cleanup(FALSE);
438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fclose(infile);
439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (!image_data) {
441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fprintf(stderr, PROGNAME ":  unable to decode PNG image\n");
442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        exit(3);
443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* display image (composite with background if requested) */
447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    Trace((stderr, "calling rpng_win_display_image()\n"))
449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (rpng_win_display_image()) {
450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        free(image_data);
451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        exit(4);
452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    Trace((stderr, "done with rpng_win_display_image()\n"))
454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* wait for the user to tell us when to quit */
457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    printf(
459ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#ifndef __CYGWIN__
460ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik      "Done.  Press Q, Esc or mouse button 1 (within image window) to quit.\n"
461ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#else
462ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik      "Done.  Press mouse button 1 (within image window) to quit.\n"
463ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#endif
464ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik    );
465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fflush(stdout);
466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    while (GetMessage(&msg, NULL, 0, 0)) {
468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        TranslateMessage(&msg);
469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        DispatchMessage(&msg);
470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    /* OK, we're done:  clean up all image and Windows resources and go away */
474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    rpng_win_cleanup();
476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return msg.wParam;
478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic int rpng_win_create_window(HINSTANCE hInst, int showmode)
485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    uch *dest;
487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    int extra_width, extra_height;
488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    ulg i, j;
489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    WNDCLASSEX wndclass;
490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*---------------------------------------------------------------------------
493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    Allocate memory for the display-specific version of the image (round up
494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    to multiple of 4 for Windows DIB).
495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  ---------------------------------------------------------------------------*/
496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    wimage_rowbytes = ((3*image_width + 3L) >> 2) << 2;
498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (!(dib = (uch *)malloc(sizeof(BITMAPINFOHEADER) +
500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                              wimage_rowbytes*image_height)))
501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    {
502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        return 4;   /* fail */
503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*---------------------------------------------------------------------------
506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    Initialize the DIB.  Negative height means to use top-down BMP ordering
507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    (must be uncompressed, but that's what we want).  Bit count of 1, 4 or 8
508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    implies a colormap of RGBX quads, but 24-bit BMPs just use B,G,R values
509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    directly => wimage_data begins immediately after BMP header.
510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  ---------------------------------------------------------------------------*/
511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    memset(dib, 0, sizeof(BITMAPINFOHEADER));
513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    bmih = (BITMAPINFOHEADER *)dib;
514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    bmih->biSize = sizeof(BITMAPINFOHEADER);
515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    bmih->biWidth = image_width;
516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    bmih->biHeight = -((long)image_height);
517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    bmih->biPlanes = 1;
518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    bmih->biBitCount = 24;
519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    bmih->biCompression = 0;
520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    wimage_data = dib + sizeof(BITMAPINFOHEADER);
521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*---------------------------------------------------------------------------
523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    Fill in background color (black by default); data are in BGR order.
524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  ---------------------------------------------------------------------------*/
525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    for (j = 0;  j < image_height;  ++j) {
527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        dest = wimage_data + j*wimage_rowbytes;
528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        for (i = image_width;  i > 0;  --i) {
529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            *dest++ = bg_blue;
530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            *dest++ = bg_green;
531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            *dest++ = bg_red;
532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        }
533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*---------------------------------------------------------------------------
536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    Set the window parameters.
537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  ---------------------------------------------------------------------------*/
538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    memset(&wndclass, 0, sizeof(wndclass));
540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    wndclass.cbSize = sizeof(wndclass);
542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    wndclass.style = CS_HREDRAW | CS_VREDRAW;
543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    wndclass.lpfnWndProc = rpng_win_wndproc;
544893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    wndclass.hInstance = hInst;
545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
547893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);
548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    wndclass.lpszMenuName = NULL;
549893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    wndclass.lpszClassName = progname;
550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    RegisterClassEx(&wndclass);
553893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*---------------------------------------------------------------------------
555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    Finally, create the window.
556893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  ---------------------------------------------------------------------------*/
557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    extra_width  = 2*(GetSystemMetrics(SM_CXBORDER) +
559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                      GetSystemMetrics(SM_CXDLGFRAME));
560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    extra_height = 2*(GetSystemMetrics(SM_CYBORDER) +
561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                      GetSystemMetrics(SM_CYDLGFRAME)) +
562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                      GetSystemMetrics(SM_CYCAPTION);
563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    global_hwnd = CreateWindow(progname, titlebar, WS_OVERLAPPEDWINDOW,
565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      CW_USEDEFAULT, CW_USEDEFAULT, image_width+extra_width,
566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      image_height+extra_height, NULL, NULL, hInst, NULL);
567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    ShowWindow(global_hwnd, showmode);
569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    UpdateWindow(global_hwnd);
570893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return 0;
572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} /* end function rpng_win_create_window() */
574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic int rpng_win_display_image()
580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    uch *src, *dest;
582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    uch r, g, b, a;
583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    ulg i, row, lastrow;
584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    RECT rect;
585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    Trace((stderr, "beginning display loop (image_channels == %d)\n",
588893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      image_channels))
589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    Trace((stderr, "(width = %ld, rowbytes = %ld, wimage_rowbytes = %d)\n",
590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      image_width, image_rowbytes, wimage_rowbytes))
591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*---------------------------------------------------------------------------
594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    Blast image data to buffer.  This whole routine takes place before the
595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    message loop begins, so there's no real point in any pseudo-progressive
596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    display...
597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  ---------------------------------------------------------------------------*/
598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    for (lastrow = row = 0;  row < image_height;  ++row) {
600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        src = image_data + row*image_rowbytes;
601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        dest = wimage_data + row*wimage_rowbytes;
602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        if (image_channels == 3) {
603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = image_width;  i > 0;  --i) {
604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                r = *src++;
605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                g = *src++;
606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                b = *src++;
607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                *dest++ = b;
608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                *dest++ = g;   /* note reverse order */
609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                *dest++ = r;
610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        } else /* if (image_channels == 4) */ {
612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = image_width;  i > 0;  --i) {
613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                r = *src++;
614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                g = *src++;
615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                b = *src++;
616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                a = *src++;
617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                if (a == 255) {
618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    *dest++ = b;
619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    *dest++ = g;
620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    *dest++ = r;
621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                } else if (a == 0) {
622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    *dest++ = bg_blue;
623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    *dest++ = bg_green;
624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    *dest++ = bg_red;
625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                } else {
626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    /* this macro (copied from png.h) composites the
627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                     * foreground and background values and puts the
628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                     * result into the first argument; there are no
629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                     * side effects with the first argument */
630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    alpha_composite(*dest++, b, a, bg_blue);
631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    alpha_composite(*dest++, g, a, bg_green);
632893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    alpha_composite(*dest++, r, a, bg_red);
633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                }
634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
635893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        }
636893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        /* display after every 16 lines */
637893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        if (((row+1) & 0xf) == 0) {
638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            rect.left = 0L;
639893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            rect.top = (LONG)lastrow;
640893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            rect.right = (LONG)image_width;      /* possibly off by one? */
641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            rect.bottom = (LONG)lastrow + 16L;   /* possibly off by one? */
642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            InvalidateRect(global_hwnd, &rect, FALSE);
643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            UpdateWindow(global_hwnd);     /* similar to XFlush() */
644893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            lastrow = row + 1;
645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        }
646893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    Trace((stderr, "calling final image-flush routine\n"))
649893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (lastrow < image_height) {
650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        rect.left = 0L;
651893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        rect.top = (LONG)lastrow;
652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        rect.right = (LONG)image_width;      /* possibly off by one? */
653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        rect.bottom = (LONG)image_height;    /* possibly off by one? */
654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        InvalidateRect(global_hwnd, &rect, FALSE);
655893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        UpdateWindow(global_hwnd);     /* similar to XFlush() */
656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*
659893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    last param determines whether or not background is wiped before paint
660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    InvalidateRect(global_hwnd, NULL, TRUE);
661893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    UpdateWindow(global_hwnd);
662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
663893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
664893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return 0;
665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
666893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic void rpng_win_cleanup()
672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
673893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (image_data) {
674893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        free(image_data);
675893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        image_data = NULL;
676893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
677893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
678893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (dib) {
679893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        free(dib);
680893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        dib = NULL;
681893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
682893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
683893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
684893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
685893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
686893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
687893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
688893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectLRESULT CALLBACK rpng_win_wndproc(HWND hwnd, UINT iMsg, WPARAM wP, LPARAM lP)
689893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
690893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    HDC         hdc;
691893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    PAINTSTRUCT ps;
692893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    int rc;
693893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
694893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    switch (iMsg) {
695893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        case WM_CREATE:
696893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            /* one-time processing here, if any */
697893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            return 0;
698893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
699893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        case WM_PAINT:
700893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            hdc = BeginPaint(hwnd, &ps);
701893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    /*                    dest                          */
702893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            rc = StretchDIBits(hdc, 0, 0, image_width, image_height,
703893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    /*                    source                        */
704893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                                    0, 0, image_width, image_height,
705893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                                    wimage_data, (BITMAPINFO *)bmih,
706893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    /*              iUsage: no clue                     */
707893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                                    0, SRCCOPY);
708893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            EndPaint(hwnd, &ps);
709893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            return 0;
710893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
711893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        /* wait for the user to tell us when to quit */
712893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        case WM_CHAR:
713893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            switch (wP) {      /* only need one, so ignore repeat count */
714893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                case 'q':
715893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                case 'Q':
716893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                case 0x1B:     /* Esc key */
717893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    PostQuitMessage(0);
718893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
719893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            return 0;
720893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
721893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        case WM_LBUTTONDOWN:   /* another way of quitting */
722893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        case WM_DESTROY:
723893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            PostQuitMessage(0);
724893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            return 0;
725893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
726893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
727893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return DefWindowProc(hwnd, iMsg, wP, lP);
728893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
729