No longer directly accessing debuggee memory.
[wine] / programs / view / view.c
1 #include <windows.h>
2
3 /* 
4 #include <windowsx.h>
5    Wine doesn't have windowsx.h, so we use this
6 */
7 #define       GET_WM_COMMAND_ID(wp,lp)        LOWORD(wp)
8
9 /* Wine seems to need this */
10 #include <commdlg.h>
11
12 #include "globals.h"        
13 #include <stdio.h>
14
15 BOOL FileIsPlaceable( LPCSTR szFileName );
16 HMETAFILE GetPlaceableMetaFile( HWND hwnd, LPCSTR szFileName );
17
18 #define FN_LENGTH 80
19
20 HMETAFILE hmf;
21 int deltax = 0, deltay = 0;
22 int width = 0, height = 0;
23 BOOL isAldus;
24
25 BOOL FileOpen(HWND hWnd, char *fn)
26 {
27   OPENFILENAME ofn = { sizeof(OPENFILENAME),
28                        0, 0, "Metafiles\0*.wmf\0", NULL, 0, 0, NULL, 
29                        FN_LENGTH, NULL, 0, NULL, NULL, OFN_CREATEPROMPT |
30                        OFN_SHOWHELP, 0, 0, NULL, 0, NULL };
31   ofn.hwndOwner = hWnd;
32   ofn.lpstrFile = fn;
33   return GetOpenFileName(&ofn);
34 }
35
36
37 LRESULT CALLBACK WndProc(HWND hwnd,
38                          UINT uMessage,
39                          WPARAM wparam,
40                          LPARAM lparam)
41 {
42   switch (uMessage)
43     {
44     case WM_PAINT: 
45       {
46         PAINTSTRUCT ps; 
47         BeginPaint(hwnd, &ps);
48         SetMapMode(ps.hdc, MM_ANISOTROPIC);
49         SetViewportExtEx(ps.hdc, width, height, NULL);
50         SetViewportOrgEx(ps.hdc, deltax, deltay, NULL);
51         if(hmf) PlayMetaFile(ps.hdc, hmf);
52         EndPaint(hwnd, &ps);
53
54       }
55       break;
56
57     case WM_COMMAND: /* message: command from application menu */
58       switch (GET_WM_COMMAND_ID(wparam,lparam))
59         {
60         case IDM_HELLO:
61           MessageBox( hwnd , "Hello there world!", "Hello", MB_OK);
62           break;
63
64         case IDM_OPEN:
65           {
66             char filename[FN_LENGTH];
67             if (FileOpen(hwnd, filename)) {
68               isAldus = FileIsPlaceable(filename);
69               if (isAldus) {
70                 hmf = GetPlaceableMetaFile(hwnd, filename);
71               } else {
72                 RECT r;
73                 hmf = GetMetaFile(filename);
74                 GetClientRect(hwnd, &r);
75                 width = r.right - r.left;
76                 height = r.bottom - r.top;
77               }
78               InvalidateRect( hwnd, NULL, TRUE );
79             }
80           }
81           break;
82           
83         case IDM_SET_EXT_TO_WIN:
84           {
85             RECT r;
86             GetClientRect(hwnd, &r);
87             width = r.right - r.left;
88             height = r.bottom - r.top;
89             InvalidateRect( hwnd, NULL, TRUE );
90           }
91           break;
92
93           
94         case IDM_LEFT:
95           deltax += 100;
96           InvalidateRect( hwnd, NULL, TRUE );
97           break;
98         case IDM_RIGHT:
99           deltax -= 100;
100           InvalidateRect( hwnd, NULL, TRUE );
101           break;
102         case IDM_UP:
103           deltay += 100;
104           InvalidateRect( hwnd, NULL, TRUE );
105           break;
106         case IDM_DOWN:
107           deltay -= 100;
108           InvalidateRect( hwnd, NULL, TRUE );
109           break;
110
111         case IDM_EXIT:
112           DestroyWindow(hwnd);
113           break;
114
115         default:
116           return DefWindowProc(hwnd, uMessage, wparam, lparam);
117         }
118       break;
119
120     case WM_DESTROY:  /* message: window being destroyed */
121       PostQuitMessage(0);
122       break;
123
124     default:          /* Passes it on if unproccessed */
125       return DefWindowProc(hwnd, uMessage, wparam, lparam);
126     }
127     return 0;
128 }
129
130 BOOL FileIsPlaceable( LPCSTR szFileName )
131 {
132   HFILE         hInFile;
133   OFSTRUCT              inof;
134   APMFILEHEADER apmh;
135
136   if( (hInFile = OpenFile( szFileName, &inof, OF_READ ) ) == HFILE_ERROR )
137     return FALSE;
138
139   if( _lread( hInFile, &apmh, sizeof(APMFILEHEADER) ) 
140       != sizeof(APMFILEHEADER) )
141     {
142       _lclose( hInFile );
143       return FALSE;
144     }
145   _lclose( hInFile );
146
147   /* Is it placeable? */
148   return (apmh.key == APMHEADER_KEY);
149 }
150
151 HMETAFILE GetPlaceableMetaFile( HWND hwnd, LPCSTR szFileName )
152 {
153   LPSTR lpData;
154   METAHEADER mfHeader;
155   APMFILEHEADER APMHeader;
156   HFILE fh;
157   HMETAFILE hmf;
158   OFSTRUCT inof;
159   WORD checksum, *p;
160   int i;
161
162   if( (fh = OpenFile( szFileName, &inof, OF_READ ) ) == HFILE_ERROR ) return 0;
163   _llseek(fh, 0, 0);
164   if (!_lread(fh, (LPSTR)&APMHeader, sizeof(APMFILEHEADER))) return 0;
165   _llseek(fh, sizeof(APMFILEHEADER), 0);
166   checksum = 0;
167   p = (WORD *) &APMHeader;
168
169   for(i=0; i<10; i++) 
170     checksum ^= *p++;
171   if (checksum != APMHeader.checksum) {
172     char msg[128];
173     sprintf(msg, "Computed checksum %04x != stored checksum %04x\n", 
174            checksum, APMHeader.checksum);
175         MessageBox(hwnd, msg, "Checksum failed", MB_OK);
176     return 0;
177   }
178
179   if (!_lread(fh, (LPSTR)&mfHeader, sizeof(METAHEADER))) return 0;
180
181   if (!(lpData = (LPSTR) GlobalAlloc(GPTR, (mfHeader.mtSize * 2L)))) return 0;
182
183   _llseek(fh, sizeof(APMFILEHEADER), 0);
184   if (!_lread(fh, lpData, (UINT)(mfHeader.mtSize * 2L)))
185   {
186     GlobalFree(lpData);
187     _lclose(fh);
188     return 0;
189   }
190   _lclose(fh);
191
192   if (!(hmf = SetMetaFileBitsEx(mfHeader.mtSize*2, lpData))) 
193     return 0;
194
195   
196   width = APMHeader.bbox.Right - APMHeader.bbox.Left;
197   height = APMHeader.bbox.Bottom - APMHeader.bbox.Top;
198
199   /*      printf("Ok! width %d height %d inch %d\n", width, height, APMHeader.inch);  */
200   width = width*96/APMHeader.inch;
201   height = height*96/APMHeader.inch;
202
203   deltax = 0;
204   deltay = 0 ;
205   return hmf;
206 }
207
208