xref: /aosp_15_r20/external/libpng/contrib/visupng/VisualPng.c (revision a67afe4df73cf47866eedc69947994b8ff839aba)
1*a67afe4dSAndroid Build Coastguard Worker /*------------------------------------
2*a67afe4dSAndroid Build Coastguard Worker  *  VisualPng.C -- Shows a PNG image
3*a67afe4dSAndroid Build Coastguard Worker  *------------------------------------
4*a67afe4dSAndroid Build Coastguard Worker  *
5*a67afe4dSAndroid Build Coastguard Worker  * Copyright 2000,2017 Willem van Schaik.
6*a67afe4dSAndroid Build Coastguard Worker  *
7*a67afe4dSAndroid Build Coastguard Worker  * This code is released under the libpng license.
8*a67afe4dSAndroid Build Coastguard Worker  * For conditions of distribution and use, see the disclaimer
9*a67afe4dSAndroid Build Coastguard Worker  * and license in png.h
10*a67afe4dSAndroid Build Coastguard Worker  */
11*a67afe4dSAndroid Build Coastguard Worker 
12*a67afe4dSAndroid Build Coastguard Worker /* switches */
13*a67afe4dSAndroid Build Coastguard Worker 
14*a67afe4dSAndroid Build Coastguard Worker /* defines */
15*a67afe4dSAndroid Build Coastguard Worker 
16*a67afe4dSAndroid Build Coastguard Worker #define PROGNAME  "VisualPng"
17*a67afe4dSAndroid Build Coastguard Worker #define LONGNAME  "Win32 Viewer for PNG-files"
18*a67afe4dSAndroid Build Coastguard Worker #define VERSION   "1.0 of 2000 June 07"
19*a67afe4dSAndroid Build Coastguard Worker 
20*a67afe4dSAndroid Build Coastguard Worker /* constants */
21*a67afe4dSAndroid Build Coastguard Worker 
22*a67afe4dSAndroid Build Coastguard Worker #define MARGIN 8
23*a67afe4dSAndroid Build Coastguard Worker 
24*a67afe4dSAndroid Build Coastguard Worker /* standard includes */
25*a67afe4dSAndroid Build Coastguard Worker 
26*a67afe4dSAndroid Build Coastguard Worker #include <stdio.h>
27*a67afe4dSAndroid Build Coastguard Worker #include <stdlib.h>
28*a67afe4dSAndroid Build Coastguard Worker #include <string.h>
29*a67afe4dSAndroid Build Coastguard Worker #include <windows.h>
30*a67afe4dSAndroid Build Coastguard Worker #include <zlib.h>
31*a67afe4dSAndroid Build Coastguard Worker 
32*a67afe4dSAndroid Build Coastguard Worker /* application includes */
33*a67afe4dSAndroid Build Coastguard Worker 
34*a67afe4dSAndroid Build Coastguard Worker #include "png.h"
35*a67afe4dSAndroid Build Coastguard Worker #include "pngfile.h"
36*a67afe4dSAndroid Build Coastguard Worker #include "resource.h"
37*a67afe4dSAndroid Build Coastguard Worker 
38*a67afe4dSAndroid Build Coastguard Worker /* macros */
39*a67afe4dSAndroid Build Coastguard Worker 
40*a67afe4dSAndroid Build Coastguard Worker /* function prototypes */
41*a67afe4dSAndroid Build Coastguard Worker 
42*a67afe4dSAndroid Build Coastguard Worker LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
43*a67afe4dSAndroid Build Coastguard Worker BOOL    CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM) ;
44*a67afe4dSAndroid Build Coastguard Worker 
45*a67afe4dSAndroid Build Coastguard Worker BOOL CenterAbout (HWND hwndChild, HWND hwndParent);
46*a67afe4dSAndroid Build Coastguard Worker 
47*a67afe4dSAndroid Build Coastguard Worker BOOL BuildPngList (PTSTR pstrPathName, TCHAR **ppFileList, int *pFileCount,
48*a67afe4dSAndroid Build Coastguard Worker         int *pFileIndex);
49*a67afe4dSAndroid Build Coastguard Worker 
50*a67afe4dSAndroid Build Coastguard Worker BOOL SearchPngList (TCHAR *pFileList, int FileCount, int *pFileIndex,
51*a67afe4dSAndroid Build Coastguard Worker         PTSTR pstrPrevName, PTSTR pstrNextName);
52*a67afe4dSAndroid Build Coastguard Worker 
53*a67afe4dSAndroid Build Coastguard Worker BOOL LoadImageFile(HWND hwnd, PTSTR pstrPathName,
54*a67afe4dSAndroid Build Coastguard Worker         png_byte **ppbImage, int *pxImgSize, int *pyImgSize, int *piChannels,
55*a67afe4dSAndroid Build Coastguard Worker         png_color *pBkgColor);
56*a67afe4dSAndroid Build Coastguard Worker 
57*a67afe4dSAndroid Build Coastguard Worker BOOL DisplayImage (HWND hwnd, BYTE **ppDib,
58*a67afe4dSAndroid Build Coastguard Worker         BYTE **ppDiData, int cxWinSize, int cyWinSize,
59*a67afe4dSAndroid Build Coastguard Worker         BYTE *pbImage, int cxImgSize, int cyImgSize, int cImgChannels,
60*a67afe4dSAndroid Build Coastguard Worker         BOOL bStretched);
61*a67afe4dSAndroid Build Coastguard Worker 
62*a67afe4dSAndroid Build Coastguard Worker BOOL InitBitmap (
63*a67afe4dSAndroid Build Coastguard Worker         BYTE *pDiData, int cxWinSize, int cyWinSize);
64*a67afe4dSAndroid Build Coastguard Worker 
65*a67afe4dSAndroid Build Coastguard Worker BOOL FillBitmap (
66*a67afe4dSAndroid Build Coastguard Worker         BYTE *pDiData, int cxWinSize, int cyWinSize,
67*a67afe4dSAndroid Build Coastguard Worker         BYTE *pbImage, int cxImgSize, int cyImgSize, int cImgChannels,
68*a67afe4dSAndroid Build Coastguard Worker         BOOL bStretched);
69*a67afe4dSAndroid Build Coastguard Worker 
70*a67afe4dSAndroid Build Coastguard Worker /* a few global variables */
71*a67afe4dSAndroid Build Coastguard Worker 
72*a67afe4dSAndroid Build Coastguard Worker static char *szProgName = PROGNAME;
73*a67afe4dSAndroid Build Coastguard Worker static char *szAppName = LONGNAME;
74*a67afe4dSAndroid Build Coastguard Worker static char *szIconName = PROGNAME;
75*a67afe4dSAndroid Build Coastguard Worker static char szCmdFileName [MAX_PATH];
76*a67afe4dSAndroid Build Coastguard Worker 
77*a67afe4dSAndroid Build Coastguard Worker /* MAIN routine */
78*a67afe4dSAndroid Build Coastguard Worker 
WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)79*a67afe4dSAndroid Build Coastguard Worker int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
80*a67afe4dSAndroid Build Coastguard Worker                     PSTR szCmdLine, int iCmdShow)
81*a67afe4dSAndroid Build Coastguard Worker {
82*a67afe4dSAndroid Build Coastguard Worker     HACCEL   hAccel;
83*a67afe4dSAndroid Build Coastguard Worker     HWND     hwnd;
84*a67afe4dSAndroid Build Coastguard Worker     MSG      msg;
85*a67afe4dSAndroid Build Coastguard Worker     WNDCLASS wndclass;
86*a67afe4dSAndroid Build Coastguard Worker     int ixBorders, iyBorders;
87*a67afe4dSAndroid Build Coastguard Worker 
88*a67afe4dSAndroid Build Coastguard Worker     wndclass.style         = CS_HREDRAW | CS_VREDRAW;
89*a67afe4dSAndroid Build Coastguard Worker     wndclass.lpfnWndProc   = WndProc;
90*a67afe4dSAndroid Build Coastguard Worker     wndclass.cbClsExtra    = 0;
91*a67afe4dSAndroid Build Coastguard Worker     wndclass.cbWndExtra    = 0;
92*a67afe4dSAndroid Build Coastguard Worker     wndclass.hInstance     = hInstance;
93*a67afe4dSAndroid Build Coastguard Worker     wndclass.hIcon         = LoadIcon (hInstance, szIconName) ;
94*a67afe4dSAndroid Build Coastguard Worker     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW);
95*a67afe4dSAndroid Build Coastguard Worker     wndclass.hbrBackground = NULL; /* (HBRUSH) GetStockObject (GRAY_BRUSH); */
96*a67afe4dSAndroid Build Coastguard Worker     wndclass.lpszMenuName  = szProgName;
97*a67afe4dSAndroid Build Coastguard Worker     wndclass.lpszClassName = szProgName;
98*a67afe4dSAndroid Build Coastguard Worker 
99*a67afe4dSAndroid Build Coastguard Worker     if (!RegisterClass (&wndclass))
100*a67afe4dSAndroid Build Coastguard Worker     {
101*a67afe4dSAndroid Build Coastguard Worker         MessageBox (NULL, TEXT ("Error: this program requires Windows NT!"),
102*a67afe4dSAndroid Build Coastguard Worker             szProgName, MB_ICONERROR);
103*a67afe4dSAndroid Build Coastguard Worker         return 0;
104*a67afe4dSAndroid Build Coastguard Worker     }
105*a67afe4dSAndroid Build Coastguard Worker 
106*a67afe4dSAndroid Build Coastguard Worker     /* if filename given on command line, store it */
107*a67afe4dSAndroid Build Coastguard Worker     if ((szCmdLine != NULL) && (*szCmdLine != '\0'))
108*a67afe4dSAndroid Build Coastguard Worker         if (szCmdLine[0] == '"')
109*a67afe4dSAndroid Build Coastguard Worker             strncpy (szCmdFileName, szCmdLine + 1, strlen(szCmdLine) - 2);
110*a67afe4dSAndroid Build Coastguard Worker         else
111*a67afe4dSAndroid Build Coastguard Worker             strcpy (szCmdFileName, szCmdLine);
112*a67afe4dSAndroid Build Coastguard Worker     else
113*a67afe4dSAndroid Build Coastguard Worker         strcpy (szCmdFileName, "");
114*a67afe4dSAndroid Build Coastguard Worker 
115*a67afe4dSAndroid Build Coastguard Worker     /* calculate size of window-borders */
116*a67afe4dSAndroid Build Coastguard Worker     ixBorders = 2 * (GetSystemMetrics (SM_CXBORDER) +
117*a67afe4dSAndroid Build Coastguard Worker                      GetSystemMetrics (SM_CXDLGFRAME));
118*a67afe4dSAndroid Build Coastguard Worker     iyBorders = 2 * (GetSystemMetrics (SM_CYBORDER) +
119*a67afe4dSAndroid Build Coastguard Worker                      GetSystemMetrics (SM_CYDLGFRAME)) +
120*a67afe4dSAndroid Build Coastguard Worker                      GetSystemMetrics (SM_CYCAPTION) +
121*a67afe4dSAndroid Build Coastguard Worker                      GetSystemMetrics (SM_CYMENUSIZE) +
122*a67afe4dSAndroid Build Coastguard Worker                      1; /* WvS: don't ask me why?  */
123*a67afe4dSAndroid Build Coastguard Worker 
124*a67afe4dSAndroid Build Coastguard Worker     hwnd = CreateWindow (szProgName, szAppName,
125*a67afe4dSAndroid Build Coastguard Worker         WS_OVERLAPPEDWINDOW,
126*a67afe4dSAndroid Build Coastguard Worker         CW_USEDEFAULT, CW_USEDEFAULT,
127*a67afe4dSAndroid Build Coastguard Worker         512 + 2 * MARGIN + ixBorders, 384 + 2 * MARGIN + iyBorders,
128*a67afe4dSAndroid Build Coastguard Worker /*      CW_USEDEFAULT, CW_USEDEFAULT, */
129*a67afe4dSAndroid Build Coastguard Worker         NULL, NULL, hInstance, NULL);
130*a67afe4dSAndroid Build Coastguard Worker 
131*a67afe4dSAndroid Build Coastguard Worker     ShowWindow (hwnd, iCmdShow);
132*a67afe4dSAndroid Build Coastguard Worker     UpdateWindow (hwnd);
133*a67afe4dSAndroid Build Coastguard Worker 
134*a67afe4dSAndroid Build Coastguard Worker     hAccel = LoadAccelerators (hInstance, szProgName);
135*a67afe4dSAndroid Build Coastguard Worker 
136*a67afe4dSAndroid Build Coastguard Worker     while (GetMessage (&msg, NULL, 0, 0))
137*a67afe4dSAndroid Build Coastguard Worker     {
138*a67afe4dSAndroid Build Coastguard Worker         if (!TranslateAccelerator (hwnd, hAccel, &msg))
139*a67afe4dSAndroid Build Coastguard Worker         {
140*a67afe4dSAndroid Build Coastguard Worker             TranslateMessage (&msg);
141*a67afe4dSAndroid Build Coastguard Worker             DispatchMessage (&msg);
142*a67afe4dSAndroid Build Coastguard Worker         }
143*a67afe4dSAndroid Build Coastguard Worker     }
144*a67afe4dSAndroid Build Coastguard Worker     return msg.wParam;
145*a67afe4dSAndroid Build Coastguard Worker }
146*a67afe4dSAndroid Build Coastguard Worker 
WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)147*a67afe4dSAndroid Build Coastguard Worker LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
148*a67afe4dSAndroid Build Coastguard Worker         LPARAM lParam)
149*a67afe4dSAndroid Build Coastguard Worker {
150*a67afe4dSAndroid Build Coastguard Worker     static HINSTANCE          hInstance ;
151*a67afe4dSAndroid Build Coastguard Worker     static HDC                hdc;
152*a67afe4dSAndroid Build Coastguard Worker     static PAINTSTRUCT        ps;
153*a67afe4dSAndroid Build Coastguard Worker     static HMENU              hMenu;
154*a67afe4dSAndroid Build Coastguard Worker 
155*a67afe4dSAndroid Build Coastguard Worker     static BITMAPFILEHEADER  *pbmfh;
156*a67afe4dSAndroid Build Coastguard Worker     static BITMAPINFOHEADER  *pbmih;
157*a67afe4dSAndroid Build Coastguard Worker     static BYTE              *pbImage;
158*a67afe4dSAndroid Build Coastguard Worker     static int                cxWinSize, cyWinSize;
159*a67afe4dSAndroid Build Coastguard Worker     static int                cxImgSize, cyImgSize;
160*a67afe4dSAndroid Build Coastguard Worker     static int                cImgChannels;
161*a67afe4dSAndroid Build Coastguard Worker     static png_color          bkgColor = {127, 127, 127};
162*a67afe4dSAndroid Build Coastguard Worker 
163*a67afe4dSAndroid Build Coastguard Worker     static BOOL               bStretched = TRUE;
164*a67afe4dSAndroid Build Coastguard Worker 
165*a67afe4dSAndroid Build Coastguard Worker     static BYTE              *pDib = NULL;
166*a67afe4dSAndroid Build Coastguard Worker     static BYTE              *pDiData = NULL;
167*a67afe4dSAndroid Build Coastguard Worker 
168*a67afe4dSAndroid Build Coastguard Worker     static TCHAR              szImgPathName [MAX_PATH];
169*a67afe4dSAndroid Build Coastguard Worker     static TCHAR              szTitleName [MAX_PATH];
170*a67afe4dSAndroid Build Coastguard Worker 
171*a67afe4dSAndroid Build Coastguard Worker     static TCHAR             *pPngFileList = NULL;
172*a67afe4dSAndroid Build Coastguard Worker     static int                iPngFileCount;
173*a67afe4dSAndroid Build Coastguard Worker     static int                iPngFileIndex;
174*a67afe4dSAndroid Build Coastguard Worker 
175*a67afe4dSAndroid Build Coastguard Worker     BOOL                      bOk;
176*a67afe4dSAndroid Build Coastguard Worker 
177*a67afe4dSAndroid Build Coastguard Worker     switch (message)
178*a67afe4dSAndroid Build Coastguard Worker     {
179*a67afe4dSAndroid Build Coastguard Worker     case WM_CREATE:
180*a67afe4dSAndroid Build Coastguard Worker         hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
181*a67afe4dSAndroid Build Coastguard Worker         PngFileInitialize (hwnd);
182*a67afe4dSAndroid Build Coastguard Worker 
183*a67afe4dSAndroid Build Coastguard Worker         strcpy (szImgPathName, "");
184*a67afe4dSAndroid Build Coastguard Worker 
185*a67afe4dSAndroid Build Coastguard Worker         /* in case we process file given on command-line */
186*a67afe4dSAndroid Build Coastguard Worker 
187*a67afe4dSAndroid Build Coastguard Worker         if (szCmdFileName[0] != '\0')
188*a67afe4dSAndroid Build Coastguard Worker         {
189*a67afe4dSAndroid Build Coastguard Worker             strcpy (szImgPathName, szCmdFileName);
190*a67afe4dSAndroid Build Coastguard Worker 
191*a67afe4dSAndroid Build Coastguard Worker             /* read the other png-files in the directory for later */
192*a67afe4dSAndroid Build Coastguard Worker             /* next/previous commands */
193*a67afe4dSAndroid Build Coastguard Worker 
194*a67afe4dSAndroid Build Coastguard Worker             BuildPngList (szImgPathName, &pPngFileList, &iPngFileCount,
195*a67afe4dSAndroid Build Coastguard Worker                           &iPngFileIndex);
196*a67afe4dSAndroid Build Coastguard Worker 
197*a67afe4dSAndroid Build Coastguard Worker             /* load the image from file */
198*a67afe4dSAndroid Build Coastguard Worker 
199*a67afe4dSAndroid Build Coastguard Worker             if (!LoadImageFile (hwnd, szImgPathName,
200*a67afe4dSAndroid Build Coastguard Worker                 &pbImage, &cxImgSize, &cyImgSize, &cImgChannels, &bkgColor))
201*a67afe4dSAndroid Build Coastguard Worker                 return 0;
202*a67afe4dSAndroid Build Coastguard Worker 
203*a67afe4dSAndroid Build Coastguard Worker             /* invalidate the client area for later update */
204*a67afe4dSAndroid Build Coastguard Worker 
205*a67afe4dSAndroid Build Coastguard Worker             InvalidateRect (hwnd, NULL, TRUE);
206*a67afe4dSAndroid Build Coastguard Worker 
207*a67afe4dSAndroid Build Coastguard Worker             /* display the PNG into the DIBitmap */
208*a67afe4dSAndroid Build Coastguard Worker 
209*a67afe4dSAndroid Build Coastguard Worker             DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
210*a67afe4dSAndroid Build Coastguard Worker                 pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
211*a67afe4dSAndroid Build Coastguard Worker         }
212*a67afe4dSAndroid Build Coastguard Worker 
213*a67afe4dSAndroid Build Coastguard Worker         return 0;
214*a67afe4dSAndroid Build Coastguard Worker 
215*a67afe4dSAndroid Build Coastguard Worker     case WM_SIZE:
216*a67afe4dSAndroid Build Coastguard Worker         cxWinSize = LOWORD (lParam);
217*a67afe4dSAndroid Build Coastguard Worker         cyWinSize = HIWORD (lParam);
218*a67afe4dSAndroid Build Coastguard Worker 
219*a67afe4dSAndroid Build Coastguard Worker         /* invalidate the client area for later update */
220*a67afe4dSAndroid Build Coastguard Worker 
221*a67afe4dSAndroid Build Coastguard Worker         InvalidateRect (hwnd, NULL, TRUE);
222*a67afe4dSAndroid Build Coastguard Worker 
223*a67afe4dSAndroid Build Coastguard Worker         /* display the PNG into the DIBitmap */
224*a67afe4dSAndroid Build Coastguard Worker 
225*a67afe4dSAndroid Build Coastguard Worker         DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
226*a67afe4dSAndroid Build Coastguard Worker             pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
227*a67afe4dSAndroid Build Coastguard Worker 
228*a67afe4dSAndroid Build Coastguard Worker         return 0;
229*a67afe4dSAndroid Build Coastguard Worker 
230*a67afe4dSAndroid Build Coastguard Worker     case WM_INITMENUPOPUP:
231*a67afe4dSAndroid Build Coastguard Worker         hMenu = GetMenu (hwnd);
232*a67afe4dSAndroid Build Coastguard Worker 
233*a67afe4dSAndroid Build Coastguard Worker         if (pbImage)
234*a67afe4dSAndroid Build Coastguard Worker             EnableMenuItem (hMenu, IDM_FILE_SAVE, MF_ENABLED);
235*a67afe4dSAndroid Build Coastguard Worker         else
236*a67afe4dSAndroid Build Coastguard Worker             EnableMenuItem (hMenu, IDM_FILE_SAVE, MF_GRAYED);
237*a67afe4dSAndroid Build Coastguard Worker 
238*a67afe4dSAndroid Build Coastguard Worker         return 0;
239*a67afe4dSAndroid Build Coastguard Worker 
240*a67afe4dSAndroid Build Coastguard Worker     case WM_COMMAND:
241*a67afe4dSAndroid Build Coastguard Worker         hMenu = GetMenu (hwnd);
242*a67afe4dSAndroid Build Coastguard Worker 
243*a67afe4dSAndroid Build Coastguard Worker         switch (LOWORD (wParam))
244*a67afe4dSAndroid Build Coastguard Worker         {
245*a67afe4dSAndroid Build Coastguard Worker         case IDM_FILE_OPEN:
246*a67afe4dSAndroid Build Coastguard Worker 
247*a67afe4dSAndroid Build Coastguard Worker             /* show the File Open dialog box */
248*a67afe4dSAndroid Build Coastguard Worker 
249*a67afe4dSAndroid Build Coastguard Worker             if (!PngFileOpenDlg (hwnd, szImgPathName, szTitleName))
250*a67afe4dSAndroid Build Coastguard Worker                 return 0;
251*a67afe4dSAndroid Build Coastguard Worker 
252*a67afe4dSAndroid Build Coastguard Worker             /* read the other png-files in the directory for later */
253*a67afe4dSAndroid Build Coastguard Worker             /* next/previous commands */
254*a67afe4dSAndroid Build Coastguard Worker 
255*a67afe4dSAndroid Build Coastguard Worker             BuildPngList (szImgPathName, &pPngFileList, &iPngFileCount,
256*a67afe4dSAndroid Build Coastguard Worker                           &iPngFileIndex);
257*a67afe4dSAndroid Build Coastguard Worker 
258*a67afe4dSAndroid Build Coastguard Worker             /* load the image from file */
259*a67afe4dSAndroid Build Coastguard Worker 
260*a67afe4dSAndroid Build Coastguard Worker             if (!LoadImageFile (hwnd, szImgPathName,
261*a67afe4dSAndroid Build Coastguard Worker                 &pbImage, &cxImgSize, &cyImgSize, &cImgChannels, &bkgColor))
262*a67afe4dSAndroid Build Coastguard Worker                 return 0;
263*a67afe4dSAndroid Build Coastguard Worker 
264*a67afe4dSAndroid Build Coastguard Worker             /* invalidate the client area for later update */
265*a67afe4dSAndroid Build Coastguard Worker 
266*a67afe4dSAndroid Build Coastguard Worker             InvalidateRect (hwnd, NULL, TRUE);
267*a67afe4dSAndroid Build Coastguard Worker 
268*a67afe4dSAndroid Build Coastguard Worker             /* display the PNG into the DIBitmap */
269*a67afe4dSAndroid Build Coastguard Worker 
270*a67afe4dSAndroid Build Coastguard Worker             DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
271*a67afe4dSAndroid Build Coastguard Worker                 pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
272*a67afe4dSAndroid Build Coastguard Worker 
273*a67afe4dSAndroid Build Coastguard Worker             return 0;
274*a67afe4dSAndroid Build Coastguard Worker 
275*a67afe4dSAndroid Build Coastguard Worker         case IDM_FILE_SAVE:
276*a67afe4dSAndroid Build Coastguard Worker 
277*a67afe4dSAndroid Build Coastguard Worker             /* show the File Save dialog box */
278*a67afe4dSAndroid Build Coastguard Worker 
279*a67afe4dSAndroid Build Coastguard Worker             if (!PngFileSaveDlg (hwnd, szImgPathName, szTitleName))
280*a67afe4dSAndroid Build Coastguard Worker                 return 0;
281*a67afe4dSAndroid Build Coastguard Worker 
282*a67afe4dSAndroid Build Coastguard Worker             /* save the PNG to a disk file */
283*a67afe4dSAndroid Build Coastguard Worker 
284*a67afe4dSAndroid Build Coastguard Worker             SetCursor (LoadCursor (NULL, IDC_WAIT));
285*a67afe4dSAndroid Build Coastguard Worker             ShowCursor (TRUE);
286*a67afe4dSAndroid Build Coastguard Worker 
287*a67afe4dSAndroid Build Coastguard Worker             bOk = PngSaveImage (szImgPathName, pDiData, cxWinSize, cyWinSize,
288*a67afe4dSAndroid Build Coastguard Worker                   bkgColor);
289*a67afe4dSAndroid Build Coastguard Worker 
290*a67afe4dSAndroid Build Coastguard Worker             ShowCursor (FALSE);
291*a67afe4dSAndroid Build Coastguard Worker             SetCursor (LoadCursor (NULL, IDC_ARROW));
292*a67afe4dSAndroid Build Coastguard Worker 
293*a67afe4dSAndroid Build Coastguard Worker             if (!bOk)
294*a67afe4dSAndroid Build Coastguard Worker                 MessageBox (hwnd, TEXT ("Error in saving the PNG image"),
295*a67afe4dSAndroid Build Coastguard Worker                 szProgName, MB_ICONEXCLAMATION | MB_OK);
296*a67afe4dSAndroid Build Coastguard Worker             return 0;
297*a67afe4dSAndroid Build Coastguard Worker 
298*a67afe4dSAndroid Build Coastguard Worker         case IDM_FILE_NEXT:
299*a67afe4dSAndroid Build Coastguard Worker 
300*a67afe4dSAndroid Build Coastguard Worker             /* read next entry in the directory */
301*a67afe4dSAndroid Build Coastguard Worker 
302*a67afe4dSAndroid Build Coastguard Worker             if (SearchPngList (pPngFileList, iPngFileCount, &iPngFileIndex,
303*a67afe4dSAndroid Build Coastguard Worker                 NULL, szImgPathName))
304*a67afe4dSAndroid Build Coastguard Worker             {
305*a67afe4dSAndroid Build Coastguard Worker                 if (strcmp (szImgPathName, "") == 0)
306*a67afe4dSAndroid Build Coastguard Worker                     return 0;
307*a67afe4dSAndroid Build Coastguard Worker 
308*a67afe4dSAndroid Build Coastguard Worker                 /* load the image from file */
309*a67afe4dSAndroid Build Coastguard Worker 
310*a67afe4dSAndroid Build Coastguard Worker                 if (!LoadImageFile (hwnd, szImgPathName, &pbImage,
311*a67afe4dSAndroid Build Coastguard Worker                         &cxImgSize, &cyImgSize, &cImgChannels, &bkgColor))
312*a67afe4dSAndroid Build Coastguard Worker                     return 0;
313*a67afe4dSAndroid Build Coastguard Worker 
314*a67afe4dSAndroid Build Coastguard Worker                 /* invalidate the client area for later update */
315*a67afe4dSAndroid Build Coastguard Worker 
316*a67afe4dSAndroid Build Coastguard Worker                 InvalidateRect (hwnd, NULL, TRUE);
317*a67afe4dSAndroid Build Coastguard Worker 
318*a67afe4dSAndroid Build Coastguard Worker                 /* display the PNG into the DIBitmap */
319*a67afe4dSAndroid Build Coastguard Worker 
320*a67afe4dSAndroid Build Coastguard Worker                 DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
321*a67afe4dSAndroid Build Coastguard Worker                     pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
322*a67afe4dSAndroid Build Coastguard Worker             }
323*a67afe4dSAndroid Build Coastguard Worker 
324*a67afe4dSAndroid Build Coastguard Worker             return 0;
325*a67afe4dSAndroid Build Coastguard Worker 
326*a67afe4dSAndroid Build Coastguard Worker         case IDM_FILE_PREVIOUS:
327*a67afe4dSAndroid Build Coastguard Worker 
328*a67afe4dSAndroid Build Coastguard Worker             /* read previous entry in the directory */
329*a67afe4dSAndroid Build Coastguard Worker 
330*a67afe4dSAndroid Build Coastguard Worker             if (SearchPngList (pPngFileList, iPngFileCount, &iPngFileIndex,
331*a67afe4dSAndroid Build Coastguard Worker                 szImgPathName, NULL))
332*a67afe4dSAndroid Build Coastguard Worker             {
333*a67afe4dSAndroid Build Coastguard Worker 
334*a67afe4dSAndroid Build Coastguard Worker                 if (strcmp (szImgPathName, "") == 0)
335*a67afe4dSAndroid Build Coastguard Worker                     return 0;
336*a67afe4dSAndroid Build Coastguard Worker 
337*a67afe4dSAndroid Build Coastguard Worker                 /* load the image from file */
338*a67afe4dSAndroid Build Coastguard Worker 
339*a67afe4dSAndroid Build Coastguard Worker                 if (!LoadImageFile (hwnd, szImgPathName, &pbImage, &cxImgSize,
340*a67afe4dSAndroid Build Coastguard Worker                     &cyImgSize, &cImgChannels, &bkgColor))
341*a67afe4dSAndroid Build Coastguard Worker                     return 0;
342*a67afe4dSAndroid Build Coastguard Worker 
343*a67afe4dSAndroid Build Coastguard Worker                 /* invalidate the client area for later update */
344*a67afe4dSAndroid Build Coastguard Worker 
345*a67afe4dSAndroid Build Coastguard Worker                 InvalidateRect (hwnd, NULL, TRUE);
346*a67afe4dSAndroid Build Coastguard Worker 
347*a67afe4dSAndroid Build Coastguard Worker                 /* display the PNG into the DIBitmap */
348*a67afe4dSAndroid Build Coastguard Worker 
349*a67afe4dSAndroid Build Coastguard Worker                 DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
350*a67afe4dSAndroid Build Coastguard Worker                     pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
351*a67afe4dSAndroid Build Coastguard Worker             }
352*a67afe4dSAndroid Build Coastguard Worker 
353*a67afe4dSAndroid Build Coastguard Worker             return 0;
354*a67afe4dSAndroid Build Coastguard Worker 
355*a67afe4dSAndroid Build Coastguard Worker         case IDM_FILE_EXIT:
356*a67afe4dSAndroid Build Coastguard Worker 
357*a67afe4dSAndroid Build Coastguard Worker             /* more cleanup needed... */
358*a67afe4dSAndroid Build Coastguard Worker 
359*a67afe4dSAndroid Build Coastguard Worker             /* free image buffer */
360*a67afe4dSAndroid Build Coastguard Worker 
361*a67afe4dSAndroid Build Coastguard Worker             if (pDib != NULL)
362*a67afe4dSAndroid Build Coastguard Worker             {
363*a67afe4dSAndroid Build Coastguard Worker                 free (pDib);
364*a67afe4dSAndroid Build Coastguard Worker                 pDib = NULL;
365*a67afe4dSAndroid Build Coastguard Worker             }
366*a67afe4dSAndroid Build Coastguard Worker 
367*a67afe4dSAndroid Build Coastguard Worker             /* free file-list */
368*a67afe4dSAndroid Build Coastguard Worker 
369*a67afe4dSAndroid Build Coastguard Worker             if (pPngFileList != NULL)
370*a67afe4dSAndroid Build Coastguard Worker             {
371*a67afe4dSAndroid Build Coastguard Worker                 free (pPngFileList);
372*a67afe4dSAndroid Build Coastguard Worker                 pPngFileList = NULL;
373*a67afe4dSAndroid Build Coastguard Worker             }
374*a67afe4dSAndroid Build Coastguard Worker 
375*a67afe4dSAndroid Build Coastguard Worker             /* let's go ... */
376*a67afe4dSAndroid Build Coastguard Worker 
377*a67afe4dSAndroid Build Coastguard Worker             exit (0);
378*a67afe4dSAndroid Build Coastguard Worker 
379*a67afe4dSAndroid Build Coastguard Worker             return 0;
380*a67afe4dSAndroid Build Coastguard Worker 
381*a67afe4dSAndroid Build Coastguard Worker         case IDM_OPTIONS_STRETCH:
382*a67afe4dSAndroid Build Coastguard Worker             bStretched = !bStretched;
383*a67afe4dSAndroid Build Coastguard Worker             if (bStretched)
384*a67afe4dSAndroid Build Coastguard Worker                 CheckMenuItem (hMenu, IDM_OPTIONS_STRETCH, MF_CHECKED);
385*a67afe4dSAndroid Build Coastguard Worker             else
386*a67afe4dSAndroid Build Coastguard Worker                 CheckMenuItem (hMenu, IDM_OPTIONS_STRETCH, MF_UNCHECKED);
387*a67afe4dSAndroid Build Coastguard Worker 
388*a67afe4dSAndroid Build Coastguard Worker             /* invalidate the client area for later update */
389*a67afe4dSAndroid Build Coastguard Worker 
390*a67afe4dSAndroid Build Coastguard Worker             InvalidateRect (hwnd, NULL, TRUE);
391*a67afe4dSAndroid Build Coastguard Worker 
392*a67afe4dSAndroid Build Coastguard Worker             /* display the PNG into the DIBitmap */
393*a67afe4dSAndroid Build Coastguard Worker 
394*a67afe4dSAndroid Build Coastguard Worker             DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
395*a67afe4dSAndroid Build Coastguard Worker                 pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
396*a67afe4dSAndroid Build Coastguard Worker 
397*a67afe4dSAndroid Build Coastguard Worker             return 0;
398*a67afe4dSAndroid Build Coastguard Worker 
399*a67afe4dSAndroid Build Coastguard Worker         case IDM_HELP_ABOUT:
400*a67afe4dSAndroid Build Coastguard Worker             DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;
401*a67afe4dSAndroid Build Coastguard Worker             return 0;
402*a67afe4dSAndroid Build Coastguard Worker 
403*a67afe4dSAndroid Build Coastguard Worker         } /* end switch */
404*a67afe4dSAndroid Build Coastguard Worker 
405*a67afe4dSAndroid Build Coastguard Worker         break;
406*a67afe4dSAndroid Build Coastguard Worker 
407*a67afe4dSAndroid Build Coastguard Worker     case WM_PAINT:
408*a67afe4dSAndroid Build Coastguard Worker         hdc = BeginPaint (hwnd, &ps);
409*a67afe4dSAndroid Build Coastguard Worker 
410*a67afe4dSAndroid Build Coastguard Worker         if (pDib)
411*a67afe4dSAndroid Build Coastguard Worker             SetDIBitsToDevice (hdc, 0, 0, cxWinSize, cyWinSize, 0, 0,
412*a67afe4dSAndroid Build Coastguard Worker                 0, cyWinSize, pDiData, (BITMAPINFO *) pDib, DIB_RGB_COLORS);
413*a67afe4dSAndroid Build Coastguard Worker 
414*a67afe4dSAndroid Build Coastguard Worker         EndPaint (hwnd, &ps);
415*a67afe4dSAndroid Build Coastguard Worker         return 0;
416*a67afe4dSAndroid Build Coastguard Worker 
417*a67afe4dSAndroid Build Coastguard Worker     case WM_DESTROY:
418*a67afe4dSAndroid Build Coastguard Worker         if (pbmfh)
419*a67afe4dSAndroid Build Coastguard Worker         {
420*a67afe4dSAndroid Build Coastguard Worker             free (pbmfh);
421*a67afe4dSAndroid Build Coastguard Worker             pbmfh = NULL;
422*a67afe4dSAndroid Build Coastguard Worker         }
423*a67afe4dSAndroid Build Coastguard Worker 
424*a67afe4dSAndroid Build Coastguard Worker         PostQuitMessage (0);
425*a67afe4dSAndroid Build Coastguard Worker         return 0;
426*a67afe4dSAndroid Build Coastguard Worker     }
427*a67afe4dSAndroid Build Coastguard Worker 
428*a67afe4dSAndroid Build Coastguard Worker     return DefWindowProc (hwnd, message, wParam, lParam);
429*a67afe4dSAndroid Build Coastguard Worker }
430*a67afe4dSAndroid Build Coastguard Worker 
AboutDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)431*a67afe4dSAndroid Build Coastguard Worker BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,
432*a67afe4dSAndroid Build Coastguard Worker                             WPARAM wParam, LPARAM lParam)
433*a67afe4dSAndroid Build Coastguard Worker {
434*a67afe4dSAndroid Build Coastguard Worker      switch (message)
435*a67afe4dSAndroid Build Coastguard Worker      {
436*a67afe4dSAndroid Build Coastguard Worker      case WM_INITDIALOG :
437*a67afe4dSAndroid Build Coastguard Worker           ShowWindow (hDlg, SW_HIDE);
438*a67afe4dSAndroid Build Coastguard Worker           CenterAbout (hDlg, GetWindow (hDlg, GW_OWNER));
439*a67afe4dSAndroid Build Coastguard Worker           ShowWindow (hDlg, SW_SHOW);
440*a67afe4dSAndroid Build Coastguard Worker           return TRUE ;
441*a67afe4dSAndroid Build Coastguard Worker 
442*a67afe4dSAndroid Build Coastguard Worker      case WM_COMMAND :
443*a67afe4dSAndroid Build Coastguard Worker           switch (LOWORD (wParam))
444*a67afe4dSAndroid Build Coastguard Worker           {
445*a67afe4dSAndroid Build Coastguard Worker           case IDOK :
446*a67afe4dSAndroid Build Coastguard Worker           case IDCANCEL :
447*a67afe4dSAndroid Build Coastguard Worker                EndDialog (hDlg, 0) ;
448*a67afe4dSAndroid Build Coastguard Worker                return TRUE ;
449*a67afe4dSAndroid Build Coastguard Worker           }
450*a67afe4dSAndroid Build Coastguard Worker           break ;
451*a67afe4dSAndroid Build Coastguard Worker      }
452*a67afe4dSAndroid Build Coastguard Worker      return FALSE ;
453*a67afe4dSAndroid Build Coastguard Worker }
454*a67afe4dSAndroid Build Coastguard Worker 
455*a67afe4dSAndroid Build Coastguard Worker /*---------------
456*a67afe4dSAndroid Build Coastguard Worker  *  CenterAbout
457*a67afe4dSAndroid Build Coastguard Worker  *---------------
458*a67afe4dSAndroid Build Coastguard Worker  */
CenterAbout(HWND hwndChild,HWND hwndParent)459*a67afe4dSAndroid Build Coastguard Worker BOOL CenterAbout (HWND hwndChild, HWND hwndParent)
460*a67afe4dSAndroid Build Coastguard Worker {
461*a67afe4dSAndroid Build Coastguard Worker    RECT    rChild, rParent, rWorkArea;
462*a67afe4dSAndroid Build Coastguard Worker    int     wChild, hChild, wParent, hParent;
463*a67afe4dSAndroid Build Coastguard Worker    int     xNew, yNew;
464*a67afe4dSAndroid Build Coastguard Worker    BOOL  bResult;
465*a67afe4dSAndroid Build Coastguard Worker 
466*a67afe4dSAndroid Build Coastguard Worker    /* Get the Height and Width of the child window */
467*a67afe4dSAndroid Build Coastguard Worker    GetWindowRect (hwndChild, &rChild);
468*a67afe4dSAndroid Build Coastguard Worker    wChild = rChild.right - rChild.left;
469*a67afe4dSAndroid Build Coastguard Worker    hChild = rChild.bottom - rChild.top;
470*a67afe4dSAndroid Build Coastguard Worker 
471*a67afe4dSAndroid Build Coastguard Worker    /* Get the Height and Width of the parent window */
472*a67afe4dSAndroid Build Coastguard Worker    GetWindowRect (hwndParent, &rParent);
473*a67afe4dSAndroid Build Coastguard Worker    wParent = rParent.right - rParent.left;
474*a67afe4dSAndroid Build Coastguard Worker    hParent = rParent.bottom - rParent.top;
475*a67afe4dSAndroid Build Coastguard Worker 
476*a67afe4dSAndroid Build Coastguard Worker    /* Get the limits of the 'workarea' */
477*a67afe4dSAndroid Build Coastguard Worker    bResult = SystemParametersInfo(
478*a67afe4dSAndroid Build Coastguard Worker       SPI_GETWORKAREA,  /* system parameter to query or set */
479*a67afe4dSAndroid Build Coastguard Worker       sizeof(RECT),
480*a67afe4dSAndroid Build Coastguard Worker       &rWorkArea,
481*a67afe4dSAndroid Build Coastguard Worker       0);
482*a67afe4dSAndroid Build Coastguard Worker    if (!bResult) {
483*a67afe4dSAndroid Build Coastguard Worker       rWorkArea.left = rWorkArea.top = 0;
484*a67afe4dSAndroid Build Coastguard Worker       rWorkArea.right = GetSystemMetrics(SM_CXSCREEN);
485*a67afe4dSAndroid Build Coastguard Worker       rWorkArea.bottom = GetSystemMetrics(SM_CYSCREEN);
486*a67afe4dSAndroid Build Coastguard Worker    }
487*a67afe4dSAndroid Build Coastguard Worker 
488*a67afe4dSAndroid Build Coastguard Worker    /* Calculate new X position, then adjust for workarea */
489*a67afe4dSAndroid Build Coastguard Worker    xNew = rParent.left + ((wParent - wChild) /2);
490*a67afe4dSAndroid Build Coastguard Worker    if (xNew < rWorkArea.left) {
491*a67afe4dSAndroid Build Coastguard Worker       xNew = rWorkArea.left;
492*a67afe4dSAndroid Build Coastguard Worker    } else if ((xNew+wChild) > rWorkArea.right) {
493*a67afe4dSAndroid Build Coastguard Worker       xNew = rWorkArea.right - wChild;
494*a67afe4dSAndroid Build Coastguard Worker    }
495*a67afe4dSAndroid Build Coastguard Worker 
496*a67afe4dSAndroid Build Coastguard Worker    /* Calculate new Y position, then adjust for workarea */
497*a67afe4dSAndroid Build Coastguard Worker    yNew = rParent.top  + ((hParent - hChild) /2);
498*a67afe4dSAndroid Build Coastguard Worker    if (yNew < rWorkArea.top) {
499*a67afe4dSAndroid Build Coastguard Worker       yNew = rWorkArea.top;
500*a67afe4dSAndroid Build Coastguard Worker    } else if ((yNew+hChild) > rWorkArea.bottom) {
501*a67afe4dSAndroid Build Coastguard Worker       yNew = rWorkArea.bottom - hChild;
502*a67afe4dSAndroid Build Coastguard Worker    }
503*a67afe4dSAndroid Build Coastguard Worker 
504*a67afe4dSAndroid Build Coastguard Worker    /* Set it, and return */
505*a67afe4dSAndroid Build Coastguard Worker    return SetWindowPos (hwndChild, NULL, xNew, yNew, 0, 0, SWP_NOSIZE |
506*a67afe4dSAndroid Build Coastguard Worker           SWP_NOZORDER);
507*a67afe4dSAndroid Build Coastguard Worker }
508*a67afe4dSAndroid Build Coastguard Worker 
509*a67afe4dSAndroid Build Coastguard Worker /*----------------
510*a67afe4dSAndroid Build Coastguard Worker  *  BuildPngList
511*a67afe4dSAndroid Build Coastguard Worker  *----------------
512*a67afe4dSAndroid Build Coastguard Worker  */
BuildPngList(PTSTR pstrPathName,TCHAR ** ppFileList,int * pFileCount,int * pFileIndex)513*a67afe4dSAndroid Build Coastguard Worker BOOL BuildPngList (PTSTR pstrPathName, TCHAR **ppFileList, int *pFileCount,
514*a67afe4dSAndroid Build Coastguard Worker      int *pFileIndex)
515*a67afe4dSAndroid Build Coastguard Worker {
516*a67afe4dSAndroid Build Coastguard Worker     static TCHAR              szImgPathName [MAX_PATH];
517*a67afe4dSAndroid Build Coastguard Worker     static TCHAR              szImgFileName [MAX_PATH];
518*a67afe4dSAndroid Build Coastguard Worker     static TCHAR              szImgFindName [MAX_PATH];
519*a67afe4dSAndroid Build Coastguard Worker 
520*a67afe4dSAndroid Build Coastguard Worker     WIN32_FIND_DATA           finddata;
521*a67afe4dSAndroid Build Coastguard Worker     HANDLE                    hFind;
522*a67afe4dSAndroid Build Coastguard Worker 
523*a67afe4dSAndroid Build Coastguard Worker     static TCHAR              szTmp [MAX_PATH];
524*a67afe4dSAndroid Build Coastguard Worker     BOOL                      bOk;
525*a67afe4dSAndroid Build Coastguard Worker     int                       i, ii;
526*a67afe4dSAndroid Build Coastguard Worker     int                       j, jj;
527*a67afe4dSAndroid Build Coastguard Worker 
528*a67afe4dSAndroid Build Coastguard Worker     /* free previous file-list */
529*a67afe4dSAndroid Build Coastguard Worker 
530*a67afe4dSAndroid Build Coastguard Worker     if (*ppFileList != NULL)
531*a67afe4dSAndroid Build Coastguard Worker     {
532*a67afe4dSAndroid Build Coastguard Worker         free (*ppFileList);
533*a67afe4dSAndroid Build Coastguard Worker         *ppFileList = NULL;
534*a67afe4dSAndroid Build Coastguard Worker     }
535*a67afe4dSAndroid Build Coastguard Worker 
536*a67afe4dSAndroid Build Coastguard Worker     /* extract foldername, filename and search-name */
537*a67afe4dSAndroid Build Coastguard Worker 
538*a67afe4dSAndroid Build Coastguard Worker     strcpy (szImgPathName, pstrPathName);
539*a67afe4dSAndroid Build Coastguard Worker     strcpy (szImgFileName, strrchr (pstrPathName, '\\') + 1);
540*a67afe4dSAndroid Build Coastguard Worker 
541*a67afe4dSAndroid Build Coastguard Worker     strcpy (szImgFindName, szImgPathName);
542*a67afe4dSAndroid Build Coastguard Worker     *(strrchr (szImgFindName, '\\') + 1) = '\0';
543*a67afe4dSAndroid Build Coastguard Worker     strcat (szImgFindName, "*.png");
544*a67afe4dSAndroid Build Coastguard Worker 
545*a67afe4dSAndroid Build Coastguard Worker     /* first cycle: count number of files in directory for memory allocation */
546*a67afe4dSAndroid Build Coastguard Worker 
547*a67afe4dSAndroid Build Coastguard Worker     *pFileCount = 0;
548*a67afe4dSAndroid Build Coastguard Worker 
549*a67afe4dSAndroid Build Coastguard Worker     hFind = FindFirstFile(szImgFindName, &finddata);
550*a67afe4dSAndroid Build Coastguard Worker     bOk = (hFind != (HANDLE) -1);
551*a67afe4dSAndroid Build Coastguard Worker 
552*a67afe4dSAndroid Build Coastguard Worker     while (bOk)
553*a67afe4dSAndroid Build Coastguard Worker     {
554*a67afe4dSAndroid Build Coastguard Worker         *pFileCount += 1;
555*a67afe4dSAndroid Build Coastguard Worker         bOk = FindNextFile(hFind, &finddata);
556*a67afe4dSAndroid Build Coastguard Worker     }
557*a67afe4dSAndroid Build Coastguard Worker     FindClose(hFind);
558*a67afe4dSAndroid Build Coastguard Worker 
559*a67afe4dSAndroid Build Coastguard Worker     /* allocation memory for file-list */
560*a67afe4dSAndroid Build Coastguard Worker 
561*a67afe4dSAndroid Build Coastguard Worker     *ppFileList = (TCHAR *) malloc (*pFileCount * MAX_PATH);
562*a67afe4dSAndroid Build Coastguard Worker 
563*a67afe4dSAndroid Build Coastguard Worker     /* second cycle: read directory and store filenames in file-list */
564*a67afe4dSAndroid Build Coastguard Worker 
565*a67afe4dSAndroid Build Coastguard Worker     hFind = FindFirstFile(szImgFindName, &finddata);
566*a67afe4dSAndroid Build Coastguard Worker     bOk = (hFind != (HANDLE) -1);
567*a67afe4dSAndroid Build Coastguard Worker 
568*a67afe4dSAndroid Build Coastguard Worker     i = 0;
569*a67afe4dSAndroid Build Coastguard Worker     ii = 0;
570*a67afe4dSAndroid Build Coastguard Worker     while (bOk)
571*a67afe4dSAndroid Build Coastguard Worker     {
572*a67afe4dSAndroid Build Coastguard Worker         strcpy (*ppFileList + ii, szImgPathName);
573*a67afe4dSAndroid Build Coastguard Worker         strcpy (strrchr(*ppFileList + ii, '\\') + 1, finddata.cFileName);
574*a67afe4dSAndroid Build Coastguard Worker 
575*a67afe4dSAndroid Build Coastguard Worker         if (strcmp(pstrPathName, *ppFileList + ii) == 0)
576*a67afe4dSAndroid Build Coastguard Worker             *pFileIndex = i;
577*a67afe4dSAndroid Build Coastguard Worker 
578*a67afe4dSAndroid Build Coastguard Worker         ii += MAX_PATH;
579*a67afe4dSAndroid Build Coastguard Worker         i++;
580*a67afe4dSAndroid Build Coastguard Worker 
581*a67afe4dSAndroid Build Coastguard Worker         bOk = FindNextFile(hFind, &finddata);
582*a67afe4dSAndroid Build Coastguard Worker     }
583*a67afe4dSAndroid Build Coastguard Worker     FindClose(hFind);
584*a67afe4dSAndroid Build Coastguard Worker 
585*a67afe4dSAndroid Build Coastguard Worker     /* finally we must sort the file-list */
586*a67afe4dSAndroid Build Coastguard Worker 
587*a67afe4dSAndroid Build Coastguard Worker     for (i = 0; i < *pFileCount - 1; i++)
588*a67afe4dSAndroid Build Coastguard Worker     {
589*a67afe4dSAndroid Build Coastguard Worker         ii = i * MAX_PATH;
590*a67afe4dSAndroid Build Coastguard Worker         for (j = i+1; j < *pFileCount; j++)
591*a67afe4dSAndroid Build Coastguard Worker         {
592*a67afe4dSAndroid Build Coastguard Worker             jj = j * MAX_PATH;
593*a67afe4dSAndroid Build Coastguard Worker             if (strcmp (*ppFileList + ii, *ppFileList + jj) > 0)
594*a67afe4dSAndroid Build Coastguard Worker             {
595*a67afe4dSAndroid Build Coastguard Worker                 strcpy (szTmp, *ppFileList + jj);
596*a67afe4dSAndroid Build Coastguard Worker                 strcpy (*ppFileList + jj, *ppFileList + ii);
597*a67afe4dSAndroid Build Coastguard Worker                 strcpy (*ppFileList + ii, szTmp);
598*a67afe4dSAndroid Build Coastguard Worker 
599*a67afe4dSAndroid Build Coastguard Worker                 /* check if this was the current image that we moved */
600*a67afe4dSAndroid Build Coastguard Worker 
601*a67afe4dSAndroid Build Coastguard Worker                 if (*pFileIndex == i)
602*a67afe4dSAndroid Build Coastguard Worker                     *pFileIndex = j;
603*a67afe4dSAndroid Build Coastguard Worker                 else
604*a67afe4dSAndroid Build Coastguard Worker                     if (*pFileIndex == j)
605*a67afe4dSAndroid Build Coastguard Worker                         *pFileIndex = i;
606*a67afe4dSAndroid Build Coastguard Worker             }
607*a67afe4dSAndroid Build Coastguard Worker         }
608*a67afe4dSAndroid Build Coastguard Worker     }
609*a67afe4dSAndroid Build Coastguard Worker 
610*a67afe4dSAndroid Build Coastguard Worker     return TRUE;
611*a67afe4dSAndroid Build Coastguard Worker }
612*a67afe4dSAndroid Build Coastguard Worker 
613*a67afe4dSAndroid Build Coastguard Worker /*----------------
614*a67afe4dSAndroid Build Coastguard Worker  *  SearchPngList
615*a67afe4dSAndroid Build Coastguard Worker  *----------------
616*a67afe4dSAndroid Build Coastguard Worker  */
617*a67afe4dSAndroid Build Coastguard Worker 
SearchPngList(TCHAR * pFileList,int FileCount,int * pFileIndex,PTSTR pstrPrevName,PTSTR pstrNextName)618*a67afe4dSAndroid Build Coastguard Worker BOOL SearchPngList (
619*a67afe4dSAndroid Build Coastguard Worker         TCHAR *pFileList, int FileCount, int *pFileIndex,
620*a67afe4dSAndroid Build Coastguard Worker         PTSTR pstrPrevName, PTSTR pstrNextName)
621*a67afe4dSAndroid Build Coastguard Worker {
622*a67afe4dSAndroid Build Coastguard Worker     if (FileCount > 0)
623*a67afe4dSAndroid Build Coastguard Worker     {
624*a67afe4dSAndroid Build Coastguard Worker         /* get previous entry */
625*a67afe4dSAndroid Build Coastguard Worker 
626*a67afe4dSAndroid Build Coastguard Worker         if (pstrPrevName != NULL)
627*a67afe4dSAndroid Build Coastguard Worker         {
628*a67afe4dSAndroid Build Coastguard Worker             if (*pFileIndex > 0)
629*a67afe4dSAndroid Build Coastguard Worker                 *pFileIndex -= 1;
630*a67afe4dSAndroid Build Coastguard Worker             else
631*a67afe4dSAndroid Build Coastguard Worker                 *pFileIndex = FileCount - 1;
632*a67afe4dSAndroid Build Coastguard Worker 
633*a67afe4dSAndroid Build Coastguard Worker             strcpy (pstrPrevName, pFileList + (*pFileIndex * MAX_PATH));
634*a67afe4dSAndroid Build Coastguard Worker         }
635*a67afe4dSAndroid Build Coastguard Worker 
636*a67afe4dSAndroid Build Coastguard Worker         /* get next entry */
637*a67afe4dSAndroid Build Coastguard Worker 
638*a67afe4dSAndroid Build Coastguard Worker         if (pstrNextName != NULL)
639*a67afe4dSAndroid Build Coastguard Worker         {
640*a67afe4dSAndroid Build Coastguard Worker             if (*pFileIndex < FileCount - 1)
641*a67afe4dSAndroid Build Coastguard Worker                 *pFileIndex += 1;
642*a67afe4dSAndroid Build Coastguard Worker             else
643*a67afe4dSAndroid Build Coastguard Worker                 *pFileIndex = 0;
644*a67afe4dSAndroid Build Coastguard Worker 
645*a67afe4dSAndroid Build Coastguard Worker             strcpy (pstrNextName, pFileList + (*pFileIndex * MAX_PATH));
646*a67afe4dSAndroid Build Coastguard Worker         }
647*a67afe4dSAndroid Build Coastguard Worker 
648*a67afe4dSAndroid Build Coastguard Worker         return TRUE;
649*a67afe4dSAndroid Build Coastguard Worker     }
650*a67afe4dSAndroid Build Coastguard Worker     else
651*a67afe4dSAndroid Build Coastguard Worker     {
652*a67afe4dSAndroid Build Coastguard Worker         return FALSE;
653*a67afe4dSAndroid Build Coastguard Worker     }
654*a67afe4dSAndroid Build Coastguard Worker }
655*a67afe4dSAndroid Build Coastguard Worker 
656*a67afe4dSAndroid Build Coastguard Worker /*-----------------
657*a67afe4dSAndroid Build Coastguard Worker  *  LoadImageFile
658*a67afe4dSAndroid Build Coastguard Worker  *-----------------
659*a67afe4dSAndroid Build Coastguard Worker  */
660*a67afe4dSAndroid Build Coastguard Worker 
LoadImageFile(HWND hwnd,PTSTR pstrPathName,png_byte ** ppbImage,int * pxImgSize,int * pyImgSize,int * piChannels,png_color * pBkgColor)661*a67afe4dSAndroid Build Coastguard Worker BOOL LoadImageFile (HWND hwnd, PTSTR pstrPathName,
662*a67afe4dSAndroid Build Coastguard Worker                 png_byte **ppbImage, int *pxImgSize, int *pyImgSize,
663*a67afe4dSAndroid Build Coastguard Worker                 int *piChannels, png_color *pBkgColor)
664*a67afe4dSAndroid Build Coastguard Worker {
665*a67afe4dSAndroid Build Coastguard Worker     static TCHAR szTmp [MAX_PATH];
666*a67afe4dSAndroid Build Coastguard Worker 
667*a67afe4dSAndroid Build Coastguard Worker     /* if there's an existing PNG, free the memory */
668*a67afe4dSAndroid Build Coastguard Worker 
669*a67afe4dSAndroid Build Coastguard Worker     if (*ppbImage)
670*a67afe4dSAndroid Build Coastguard Worker     {
671*a67afe4dSAndroid Build Coastguard Worker         free (*ppbImage);
672*a67afe4dSAndroid Build Coastguard Worker         *ppbImage = NULL;
673*a67afe4dSAndroid Build Coastguard Worker     }
674*a67afe4dSAndroid Build Coastguard Worker 
675*a67afe4dSAndroid Build Coastguard Worker     /* Load the entire PNG into memory */
676*a67afe4dSAndroid Build Coastguard Worker 
677*a67afe4dSAndroid Build Coastguard Worker     SetCursor (LoadCursor (NULL, IDC_WAIT));
678*a67afe4dSAndroid Build Coastguard Worker     ShowCursor (TRUE);
679*a67afe4dSAndroid Build Coastguard Worker 
680*a67afe4dSAndroid Build Coastguard Worker     PngLoadImage (pstrPathName, ppbImage, pxImgSize, pyImgSize, piChannels,
681*a67afe4dSAndroid Build Coastguard Worker                   pBkgColor);
682*a67afe4dSAndroid Build Coastguard Worker 
683*a67afe4dSAndroid Build Coastguard Worker     ShowCursor (FALSE);
684*a67afe4dSAndroid Build Coastguard Worker     SetCursor (LoadCursor (NULL, IDC_ARROW));
685*a67afe4dSAndroid Build Coastguard Worker 
686*a67afe4dSAndroid Build Coastguard Worker     if (*ppbImage != NULL)
687*a67afe4dSAndroid Build Coastguard Worker     {
688*a67afe4dSAndroid Build Coastguard Worker         sprintf (szTmp, "VisualPng - %s", strrchr(pstrPathName, '\\') + 1);
689*a67afe4dSAndroid Build Coastguard Worker         SetWindowText (hwnd, szTmp);
690*a67afe4dSAndroid Build Coastguard Worker     }
691*a67afe4dSAndroid Build Coastguard Worker     else
692*a67afe4dSAndroid Build Coastguard Worker     {
693*a67afe4dSAndroid Build Coastguard Worker         MessageBox (hwnd, TEXT ("Error in loading the PNG image"),
694*a67afe4dSAndroid Build Coastguard Worker             szProgName, MB_ICONEXCLAMATION | MB_OK);
695*a67afe4dSAndroid Build Coastguard Worker         return FALSE;
696*a67afe4dSAndroid Build Coastguard Worker     }
697*a67afe4dSAndroid Build Coastguard Worker 
698*a67afe4dSAndroid Build Coastguard Worker     return TRUE;
699*a67afe4dSAndroid Build Coastguard Worker }
700*a67afe4dSAndroid Build Coastguard Worker 
701*a67afe4dSAndroid Build Coastguard Worker /*----------------
702*a67afe4dSAndroid Build Coastguard Worker  *  DisplayImage
703*a67afe4dSAndroid Build Coastguard Worker  *----------------
704*a67afe4dSAndroid Build Coastguard Worker  */
DisplayImage(HWND hwnd,BYTE ** ppDib,BYTE ** ppDiData,int cxWinSize,int cyWinSize,BYTE * pbImage,int cxImgSize,int cyImgSize,int cImgChannels,BOOL bStretched)705*a67afe4dSAndroid Build Coastguard Worker BOOL DisplayImage (HWND hwnd, BYTE **ppDib,
706*a67afe4dSAndroid Build Coastguard Worker         BYTE **ppDiData, int cxWinSize, int cyWinSize,
707*a67afe4dSAndroid Build Coastguard Worker         BYTE *pbImage, int cxImgSize, int cyImgSize, int cImgChannels,
708*a67afe4dSAndroid Build Coastguard Worker         BOOL bStretched)
709*a67afe4dSAndroid Build Coastguard Worker {
710*a67afe4dSAndroid Build Coastguard Worker     BYTE                       *pDib = *ppDib;
711*a67afe4dSAndroid Build Coastguard Worker     BYTE                       *pDiData = *ppDiData;
712*a67afe4dSAndroid Build Coastguard Worker     /* BITMAPFILEHEADER        *pbmfh; */
713*a67afe4dSAndroid Build Coastguard Worker     BITMAPINFOHEADER           *pbmih;
714*a67afe4dSAndroid Build Coastguard Worker     WORD                        wDIRowBytes;
715*a67afe4dSAndroid Build Coastguard Worker     png_color                   bkgBlack = {0, 0, 0};
716*a67afe4dSAndroid Build Coastguard Worker     png_color                   bkgGray  = {127, 127, 127};
717*a67afe4dSAndroid Build Coastguard Worker     png_color                   bkgWhite = {255, 255, 255};
718*a67afe4dSAndroid Build Coastguard Worker 
719*a67afe4dSAndroid Build Coastguard Worker     /* allocate memory for the Device Independent bitmap */
720*a67afe4dSAndroid Build Coastguard Worker 
721*a67afe4dSAndroid Build Coastguard Worker     wDIRowBytes = (WORD) ((3 * cxWinSize + 3L) >> 2) << 2;
722*a67afe4dSAndroid Build Coastguard Worker 
723*a67afe4dSAndroid Build Coastguard Worker     if (pDib)
724*a67afe4dSAndroid Build Coastguard Worker     {
725*a67afe4dSAndroid Build Coastguard Worker         free (pDib);
726*a67afe4dSAndroid Build Coastguard Worker         pDib = NULL;
727*a67afe4dSAndroid Build Coastguard Worker     }
728*a67afe4dSAndroid Build Coastguard Worker 
729*a67afe4dSAndroid Build Coastguard Worker     if (cyWinSize > ((size_t)(-1))/wDIRowBytes) {
730*a67afe4dSAndroid Build Coastguard Worker     {
731*a67afe4dSAndroid Build Coastguard Worker         MessageBox (hwnd, TEXT ("Visual PNG: image is too big");
732*a67afe4dSAndroid Build Coastguard Worker     }
733*a67afe4dSAndroid Build Coastguard Worker     if (!(pDib = (BYTE *) malloc (sizeof(BITMAPINFOHEADER) +
734*a67afe4dSAndroid Build Coastguard Worker         wDIRowBytes * cyWinSize)))
735*a67afe4dSAndroid Build Coastguard Worker     {
736*a67afe4dSAndroid Build Coastguard Worker         MessageBox (hwnd, TEXT ("Error in displaying the PNG image"),
737*a67afe4dSAndroid Build Coastguard Worker             szProgName, MB_ICONEXCLAMATION | MB_OK);
738*a67afe4dSAndroid Build Coastguard Worker         *ppDib = pDib = NULL;
739*a67afe4dSAndroid Build Coastguard Worker         return FALSE;
740*a67afe4dSAndroid Build Coastguard Worker     }
741*a67afe4dSAndroid Build Coastguard Worker     *ppDib = pDib;
742*a67afe4dSAndroid Build Coastguard Worker     memset (pDib, 0, sizeof(BITMAPINFOHEADER));
743*a67afe4dSAndroid Build Coastguard Worker 
744*a67afe4dSAndroid Build Coastguard Worker     /* initialize the dib-structure */
745*a67afe4dSAndroid Build Coastguard Worker 
746*a67afe4dSAndroid Build Coastguard Worker     pbmih = (BITMAPINFOHEADER *) pDib;
747*a67afe4dSAndroid Build Coastguard Worker     pbmih->biSize = sizeof(BITMAPINFOHEADER);
748*a67afe4dSAndroid Build Coastguard Worker     pbmih->biWidth = cxWinSize;
749*a67afe4dSAndroid Build Coastguard Worker     pbmih->biHeight = -((long) cyWinSize);
750*a67afe4dSAndroid Build Coastguard Worker     pbmih->biPlanes = 1;
751*a67afe4dSAndroid Build Coastguard Worker     pbmih->biBitCount = 24;
752*a67afe4dSAndroid Build Coastguard Worker     pbmih->biCompression = 0;
753*a67afe4dSAndroid Build Coastguard Worker     pDiData = pDib + sizeof(BITMAPINFOHEADER);
754*a67afe4dSAndroid Build Coastguard Worker     *ppDiData = pDiData;
755*a67afe4dSAndroid Build Coastguard Worker 
756*a67afe4dSAndroid Build Coastguard Worker     /* first fill bitmap with gray and image border */
757*a67afe4dSAndroid Build Coastguard Worker 
758*a67afe4dSAndroid Build Coastguard Worker     InitBitmap (pDiData, cxWinSize, cyWinSize);
759*a67afe4dSAndroid Build Coastguard Worker 
760*a67afe4dSAndroid Build Coastguard Worker     /* then fill bitmap with image */
761*a67afe4dSAndroid Build Coastguard Worker 
762*a67afe4dSAndroid Build Coastguard Worker     if (pbImage)
763*a67afe4dSAndroid Build Coastguard Worker     {
764*a67afe4dSAndroid Build Coastguard Worker         FillBitmap (
765*a67afe4dSAndroid Build Coastguard Worker             pDiData, cxWinSize, cyWinSize,
766*a67afe4dSAndroid Build Coastguard Worker             pbImage, cxImgSize, cyImgSize, cImgChannels,
767*a67afe4dSAndroid Build Coastguard Worker             bStretched);
768*a67afe4dSAndroid Build Coastguard Worker     }
769*a67afe4dSAndroid Build Coastguard Worker 
770*a67afe4dSAndroid Build Coastguard Worker     return TRUE;
771*a67afe4dSAndroid Build Coastguard Worker }
772*a67afe4dSAndroid Build Coastguard Worker 
773*a67afe4dSAndroid Build Coastguard Worker /*--------------
774*a67afe4dSAndroid Build Coastguard Worker  *  InitBitmap
775*a67afe4dSAndroid Build Coastguard Worker  *--------------
776*a67afe4dSAndroid Build Coastguard Worker  */
777*a67afe4dSAndroid Build Coastguard Worker BOOL InitBitmap (BYTE *pDiData, int cxWinSize, int cyWinSize)
778*a67afe4dSAndroid Build Coastguard Worker {
779*a67afe4dSAndroid Build Coastguard Worker     BYTE *dst;
780*a67afe4dSAndroid Build Coastguard Worker     int x, y, col;
781*a67afe4dSAndroid Build Coastguard Worker 
782*a67afe4dSAndroid Build Coastguard Worker     /* initialize the background with gray */
783*a67afe4dSAndroid Build Coastguard Worker 
784*a67afe4dSAndroid Build Coastguard Worker     dst = pDiData;
785*a67afe4dSAndroid Build Coastguard Worker     for (y = 0; y < cyWinSize; y++)
786*a67afe4dSAndroid Build Coastguard Worker     {
787*a67afe4dSAndroid Build Coastguard Worker         col = 0;
788*a67afe4dSAndroid Build Coastguard Worker         for (x = 0; x < cxWinSize; x++)
789*a67afe4dSAndroid Build Coastguard Worker         {
790*a67afe4dSAndroid Build Coastguard Worker             /* fill with GRAY */
791*a67afe4dSAndroid Build Coastguard Worker             *dst++ = 127;
792*a67afe4dSAndroid Build Coastguard Worker             *dst++ = 127;
793*a67afe4dSAndroid Build Coastguard Worker             *dst++ = 127;
794*a67afe4dSAndroid Build Coastguard Worker             col += 3;
795*a67afe4dSAndroid Build Coastguard Worker         }
796*a67afe4dSAndroid Build Coastguard Worker         /* rows start on 4 byte boundaries */
797*a67afe4dSAndroid Build Coastguard Worker         while ((col % 4) != 0)
798*a67afe4dSAndroid Build Coastguard Worker         {
799*a67afe4dSAndroid Build Coastguard Worker             dst++;
800*a67afe4dSAndroid Build Coastguard Worker             col++;
801*a67afe4dSAndroid Build Coastguard Worker         }
802*a67afe4dSAndroid Build Coastguard Worker     }
803*a67afe4dSAndroid Build Coastguard Worker 
804*a67afe4dSAndroid Build Coastguard Worker     return TRUE;
805*a67afe4dSAndroid Build Coastguard Worker }
806*a67afe4dSAndroid Build Coastguard Worker 
807*a67afe4dSAndroid Build Coastguard Worker /*--------------
808*a67afe4dSAndroid Build Coastguard Worker  *  FillBitmap
809*a67afe4dSAndroid Build Coastguard Worker  *--------------
810*a67afe4dSAndroid Build Coastguard Worker  */
811*a67afe4dSAndroid Build Coastguard Worker BOOL FillBitmap (
812*a67afe4dSAndroid Build Coastguard Worker         BYTE *pDiData, int cxWinSize, int cyWinSize,
813*a67afe4dSAndroid Build Coastguard Worker         BYTE *pbImage, int cxImgSize, int cyImgSize, int cImgChannels,
814*a67afe4dSAndroid Build Coastguard Worker         BOOL bStretched)
815*a67afe4dSAndroid Build Coastguard Worker {
816*a67afe4dSAndroid Build Coastguard Worker     BYTE *pStretchedImage;
817*a67afe4dSAndroid Build Coastguard Worker     BYTE *pImg;
818*a67afe4dSAndroid Build Coastguard Worker     BYTE *src, *dst;
819*a67afe4dSAndroid Build Coastguard Worker     BYTE r, g, b, a;
820*a67afe4dSAndroid Build Coastguard Worker     const int cDIChannels = 3;
821*a67afe4dSAndroid Build Coastguard Worker     WORD wImgRowBytes;
822*a67afe4dSAndroid Build Coastguard Worker     WORD wDIRowBytes;
823*a67afe4dSAndroid Build Coastguard Worker     int cxNewSize, cyNewSize;
824*a67afe4dSAndroid Build Coastguard Worker     int cxImgPos, cyImgPos;
825*a67afe4dSAndroid Build Coastguard Worker     int xImg, yImg;
826*a67afe4dSAndroid Build Coastguard Worker     int xWin, yWin;
827*a67afe4dSAndroid Build Coastguard Worker     int xOld, yOld;
828*a67afe4dSAndroid Build Coastguard Worker     int xNew, yNew;
829*a67afe4dSAndroid Build Coastguard Worker 
830*a67afe4dSAndroid Build Coastguard Worker     if (bStretched)
831*a67afe4dSAndroid Build Coastguard Worker     {
832*a67afe4dSAndroid Build Coastguard Worker         cxNewSize = cxWinSize - 2 * MARGIN;
833*a67afe4dSAndroid Build Coastguard Worker         cyNewSize = cyWinSize - 2 * MARGIN;
834*a67afe4dSAndroid Build Coastguard Worker 
835*a67afe4dSAndroid Build Coastguard Worker         /* stretch the image to it's window determined size */
836*a67afe4dSAndroid Build Coastguard Worker 
837*a67afe4dSAndroid Build Coastguard Worker         /* the following two are mathematically the same, but the first
838*a67afe4dSAndroid Build Coastguard Worker          * has side-effects because of rounding
839*a67afe4dSAndroid Build Coastguard Worker          */
840*a67afe4dSAndroid Build Coastguard Worker /*      if ((cyNewSize / cxNewSize) > (cyImgSize / cxImgSize)) */
841*a67afe4dSAndroid Build Coastguard Worker         if ((cyNewSize * cxImgSize) > (cyImgSize * cxNewSize))
842*a67afe4dSAndroid Build Coastguard Worker         {
843*a67afe4dSAndroid Build Coastguard Worker             cyNewSize = cxNewSize * cyImgSize / cxImgSize;
844*a67afe4dSAndroid Build Coastguard Worker             cxImgPos = MARGIN;
845*a67afe4dSAndroid Build Coastguard Worker             cyImgPos = (cyWinSize - cyNewSize) / 2;
846*a67afe4dSAndroid Build Coastguard Worker         }
847*a67afe4dSAndroid Build Coastguard Worker         else
848*a67afe4dSAndroid Build Coastguard Worker         {
849*a67afe4dSAndroid Build Coastguard Worker             cxNewSize = cyNewSize * cxImgSize / cyImgSize;
850*a67afe4dSAndroid Build Coastguard Worker             cyImgPos = MARGIN;
851*a67afe4dSAndroid Build Coastguard Worker             cxImgPos = (cxWinSize - cxNewSize) / 2;
852*a67afe4dSAndroid Build Coastguard Worker         }
853*a67afe4dSAndroid Build Coastguard Worker 
854*a67afe4dSAndroid Build Coastguard Worker         if (cyNewSize > ((size_t)(-1))/(cImgChannels * cxNewSize)) {
855*a67afe4dSAndroid Build Coastguard Worker         {
856*a67afe4dSAndroid Build Coastguard Worker             MessageBox (hwnd, TEXT ("Visual PNG: stretched image is too big");
857*a67afe4dSAndroid Build Coastguard Worker         }
858*a67afe4dSAndroid Build Coastguard Worker         pStretchedImage = malloc (cImgChannels * cxNewSize * cyNewSize);
859*a67afe4dSAndroid Build Coastguard Worker         pImg = pStretchedImage;
860*a67afe4dSAndroid Build Coastguard Worker 
861*a67afe4dSAndroid Build Coastguard Worker         for (yNew = 0; yNew < cyNewSize; yNew++)
862*a67afe4dSAndroid Build Coastguard Worker         {
863*a67afe4dSAndroid Build Coastguard Worker             yOld = yNew * cyImgSize / cyNewSize;
864*a67afe4dSAndroid Build Coastguard Worker             for (xNew = 0; xNew < cxNewSize; xNew++)
865*a67afe4dSAndroid Build Coastguard Worker             {
866*a67afe4dSAndroid Build Coastguard Worker                 xOld = xNew * cxImgSize / cxNewSize;
867*a67afe4dSAndroid Build Coastguard Worker 
868*a67afe4dSAndroid Build Coastguard Worker                 r = *(pbImage + cImgChannels * ((yOld * cxImgSize) + xOld) + 0);
869*a67afe4dSAndroid Build Coastguard Worker                 g = *(pbImage + cImgChannels * ((yOld * cxImgSize) + xOld) + 1);
870*a67afe4dSAndroid Build Coastguard Worker                 b = *(pbImage + cImgChannels * ((yOld * cxImgSize) + xOld) + 2);
871*a67afe4dSAndroid Build Coastguard Worker                 *pImg++ = r;
872*a67afe4dSAndroid Build Coastguard Worker                 *pImg++ = g;
873*a67afe4dSAndroid Build Coastguard Worker                 *pImg++ = b;
874*a67afe4dSAndroid Build Coastguard Worker                 if (cImgChannels == 4)
875*a67afe4dSAndroid Build Coastguard Worker                 {
876*a67afe4dSAndroid Build Coastguard Worker                     a = *(pbImage + cImgChannels * ((yOld * cxImgSize) + xOld)
877*a67afe4dSAndroid Build Coastguard Worker                         + 3);
878*a67afe4dSAndroid Build Coastguard Worker                     *pImg++ = a;
879*a67afe4dSAndroid Build Coastguard Worker                 }
880*a67afe4dSAndroid Build Coastguard Worker             }
881*a67afe4dSAndroid Build Coastguard Worker         }
882*a67afe4dSAndroid Build Coastguard Worker 
883*a67afe4dSAndroid Build Coastguard Worker         /* calculate row-bytes */
884*a67afe4dSAndroid Build Coastguard Worker 
885*a67afe4dSAndroid Build Coastguard Worker         wImgRowBytes = cImgChannels * cxNewSize;
886*a67afe4dSAndroid Build Coastguard Worker         wDIRowBytes = (WORD) ((cDIChannels * cxWinSize + 3L) >> 2) << 2;
887*a67afe4dSAndroid Build Coastguard Worker 
888*a67afe4dSAndroid Build Coastguard Worker         /* copy image to screen */
889*a67afe4dSAndroid Build Coastguard Worker 
890*a67afe4dSAndroid Build Coastguard Worker         for (yImg = 0, yWin = cyImgPos; yImg < cyNewSize; yImg++, yWin++)
891*a67afe4dSAndroid Build Coastguard Worker         {
892*a67afe4dSAndroid Build Coastguard Worker             if (yWin >= cyWinSize - cyImgPos)
893*a67afe4dSAndroid Build Coastguard Worker                 break;
894*a67afe4dSAndroid Build Coastguard Worker             src = pStretchedImage + yImg * wImgRowBytes;
895*a67afe4dSAndroid Build Coastguard Worker             dst = pDiData + yWin * wDIRowBytes + cxImgPos * cDIChannels;
896*a67afe4dSAndroid Build Coastguard Worker 
897*a67afe4dSAndroid Build Coastguard Worker             for (xImg = 0, xWin = cxImgPos; xImg < cxNewSize; xImg++, xWin++)
898*a67afe4dSAndroid Build Coastguard Worker             {
899*a67afe4dSAndroid Build Coastguard Worker                 if (xWin >= cxWinSize - cxImgPos)
900*a67afe4dSAndroid Build Coastguard Worker                     break;
901*a67afe4dSAndroid Build Coastguard Worker                 r = *src++;
902*a67afe4dSAndroid Build Coastguard Worker                 g = *src++;
903*a67afe4dSAndroid Build Coastguard Worker                 b = *src++;
904*a67afe4dSAndroid Build Coastguard Worker                 *dst++ = b; /* note the reverse order  */
905*a67afe4dSAndroid Build Coastguard Worker                 *dst++ = g;
906*a67afe4dSAndroid Build Coastguard Worker                 *dst++ = r;
907*a67afe4dSAndroid Build Coastguard Worker                 if (cImgChannels == 4)
908*a67afe4dSAndroid Build Coastguard Worker                 {
909*a67afe4dSAndroid Build Coastguard Worker                     a = *src++;
910*a67afe4dSAndroid Build Coastguard Worker                 }
911*a67afe4dSAndroid Build Coastguard Worker             }
912*a67afe4dSAndroid Build Coastguard Worker         }
913*a67afe4dSAndroid Build Coastguard Worker 
914*a67afe4dSAndroid Build Coastguard Worker         /* free memory */
915*a67afe4dSAndroid Build Coastguard Worker 
916*a67afe4dSAndroid Build Coastguard Worker         if (pStretchedImage != NULL)
917*a67afe4dSAndroid Build Coastguard Worker         {
918*a67afe4dSAndroid Build Coastguard Worker             free (pStretchedImage);
919*a67afe4dSAndroid Build Coastguard Worker             pStretchedImage = NULL;
920*a67afe4dSAndroid Build Coastguard Worker         }
921*a67afe4dSAndroid Build Coastguard Worker 
922*a67afe4dSAndroid Build Coastguard Worker     }
923*a67afe4dSAndroid Build Coastguard Worker 
924*a67afe4dSAndroid Build Coastguard Worker     /* process the image not-stretched */
925*a67afe4dSAndroid Build Coastguard Worker 
926*a67afe4dSAndroid Build Coastguard Worker     else
927*a67afe4dSAndroid Build Coastguard Worker     {
928*a67afe4dSAndroid Build Coastguard Worker         /* calculate the central position */
929*a67afe4dSAndroid Build Coastguard Worker 
930*a67afe4dSAndroid Build Coastguard Worker         cxImgPos = (cxWinSize - cxImgSize) / 2;
931*a67afe4dSAndroid Build Coastguard Worker         cyImgPos = (cyWinSize - cyImgSize) / 2;
932*a67afe4dSAndroid Build Coastguard Worker 
933*a67afe4dSAndroid Build Coastguard Worker         /* check for image larger than window */
934*a67afe4dSAndroid Build Coastguard Worker 
935*a67afe4dSAndroid Build Coastguard Worker         if (cxImgPos < MARGIN)
936*a67afe4dSAndroid Build Coastguard Worker             cxImgPos = MARGIN;
937*a67afe4dSAndroid Build Coastguard Worker         if (cyImgPos < MARGIN)
938*a67afe4dSAndroid Build Coastguard Worker             cyImgPos = MARGIN;
939*a67afe4dSAndroid Build Coastguard Worker 
940*a67afe4dSAndroid Build Coastguard Worker         /* calculate both row-bytes */
941*a67afe4dSAndroid Build Coastguard Worker 
942*a67afe4dSAndroid Build Coastguard Worker         wImgRowBytes = cImgChannels * cxImgSize;
943*a67afe4dSAndroid Build Coastguard Worker         wDIRowBytes = (WORD) ((cDIChannels * cxWinSize + 3L) >> 2) << 2;
944*a67afe4dSAndroid Build Coastguard Worker 
945*a67afe4dSAndroid Build Coastguard Worker         /* copy image to screen */
946*a67afe4dSAndroid Build Coastguard Worker 
947*a67afe4dSAndroid Build Coastguard Worker         for (yImg = 0, yWin = cyImgPos; yImg < cyImgSize; yImg++, yWin++)
948*a67afe4dSAndroid Build Coastguard Worker         {
949*a67afe4dSAndroid Build Coastguard Worker             if (yWin >= cyWinSize - MARGIN)
950*a67afe4dSAndroid Build Coastguard Worker                 break;
951*a67afe4dSAndroid Build Coastguard Worker             src = pbImage + yImg * wImgRowBytes;
952*a67afe4dSAndroid Build Coastguard Worker             dst = pDiData + yWin * wDIRowBytes + cxImgPos * cDIChannels;
953*a67afe4dSAndroid Build Coastguard Worker 
954*a67afe4dSAndroid Build Coastguard Worker             for (xImg = 0, xWin = cxImgPos; xImg < cxImgSize; xImg++, xWin++)
955*a67afe4dSAndroid Build Coastguard Worker             {
956*a67afe4dSAndroid Build Coastguard Worker                 if (xWin >= cxWinSize - MARGIN)
957*a67afe4dSAndroid Build Coastguard Worker                     break;
958*a67afe4dSAndroid Build Coastguard Worker                 r = *src++;
959*a67afe4dSAndroid Build Coastguard Worker                 g = *src++;
960*a67afe4dSAndroid Build Coastguard Worker                 b = *src++;
961*a67afe4dSAndroid Build Coastguard Worker                 *dst++ = b; /* note the reverse order  */
962*a67afe4dSAndroid Build Coastguard Worker                 *dst++ = g;
963*a67afe4dSAndroid Build Coastguard Worker                 *dst++ = r;
964*a67afe4dSAndroid Build Coastguard Worker                 if (cImgChannels == 4)
965*a67afe4dSAndroid Build Coastguard Worker                 {
966*a67afe4dSAndroid Build Coastguard Worker                     a = *src++;
967*a67afe4dSAndroid Build Coastguard Worker                 }
968*a67afe4dSAndroid Build Coastguard Worker             }
969*a67afe4dSAndroid Build Coastguard Worker         }
970*a67afe4dSAndroid Build Coastguard Worker     }
971*a67afe4dSAndroid Build Coastguard Worker 
972*a67afe4dSAndroid Build Coastguard Worker     return TRUE;
973*a67afe4dSAndroid Build Coastguard Worker }
974*a67afe4dSAndroid Build Coastguard Worker 
975*a67afe4dSAndroid Build Coastguard Worker /*-----------------
976*a67afe4dSAndroid Build Coastguard Worker  *  end of source
977*a67afe4dSAndroid Build Coastguard Worker  *-----------------
978*a67afe4dSAndroid Build Coastguard Worker  */
979