Fixed off-by-one error if bitblt width or height is negative.
[wine/hacks.git] / programs / view / view.c
blob396329389de8d7be7bb1e49a78e517fe393d96d7
1 #include <windows.h>
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)
9 /* Wine seems to need this */
10 #include <commdlg.h>
12 #include "globals.h"
13 #include "resource.h"
14 #include <stdio.h>
16 BOOL FileIsPlaceable( LPCSTR szFileName );
17 HMETAFILE GetPlaceableMetaFile( HWND hwnd, LPCSTR szFileName );
19 #define FN_LENGTH 80
21 HMETAFILE hmf;
22 int deltax = 0, deltay = 0;
23 int width = 0, height = 0;
24 BOOL isAldus;
26 BOOL FileOpen(HWND hWnd, char *fn)
28 OPENFILENAME ofn = { sizeof(OPENFILENAME),
29 0, 0, "Metafiles\0*.wmf\0", NULL, 0, 0, NULL,
30 FN_LENGTH, NULL, 0, NULL, NULL, OFN_CREATEPROMPT |
31 OFN_SHOWHELP, 0, 0, NULL, 0, NULL };
32 ofn.hwndOwner = hWnd;
33 ofn.lpstrFile = fn;
34 return GetOpenFileName(&ofn);
38 LRESULT CALLBACK WndProc(HWND hwnd,
39 UINT uMessage,
40 WPARAM wparam,
41 LPARAM lparam)
43 switch (uMessage)
45 case WM_PAINT:
47 PAINTSTRUCT ps;
48 BeginPaint(hwnd, &ps);
49 SetMapMode(ps.hdc, MM_ANISOTROPIC);
50 SetViewportExtEx(ps.hdc, width, height, NULL);
51 SetViewportOrgEx(ps.hdc, deltax, deltay, NULL);
52 if(hmf) PlayMetaFile(ps.hdc, hmf);
53 EndPaint(hwnd, &ps);
56 break;
58 case WM_COMMAND: /* message: command from application menu */
59 switch (GET_WM_COMMAND_ID(wparam,lparam))
61 case IDM_HELLO:
62 MessageBox( hwnd , "Hello there world!", "Hello", MB_OK);
63 break;
65 case IDM_OPEN:
67 char filename[FN_LENGTH];
68 if (FileOpen(hwnd, filename)) {
69 isAldus = FileIsPlaceable(filename);
70 if (isAldus) {
71 hmf = GetPlaceableMetaFile(hwnd, filename);
72 } else {
73 RECT r;
74 hmf = GetMetaFile(filename);
75 GetClientRect(hwnd, &r);
76 width = r.right - r.left;
77 height = r.bottom - r.top;
79 InvalidateRect( hwnd, NULL, TRUE );
82 break;
84 case IDM_SET_EXT_TO_WIN:
86 RECT r;
87 GetClientRect(hwnd, &r);
88 width = r.right - r.left;
89 height = r.bottom - r.top;
90 InvalidateRect( hwnd, NULL, TRUE );
92 break;
95 case IDM_LEFT:
96 deltax += 100;
97 InvalidateRect( hwnd, NULL, TRUE );
98 break;
99 case IDM_RIGHT:
100 deltax -= 100;
101 InvalidateRect( hwnd, NULL, TRUE );
102 break;
103 case IDM_UP:
104 deltay += 100;
105 InvalidateRect( hwnd, NULL, TRUE );
106 break;
107 case IDM_DOWN:
108 deltay -= 100;
109 InvalidateRect( hwnd, NULL, TRUE );
110 break;
112 case IDM_EXIT:
113 DestroyWindow(hwnd);
114 break;
116 default:
117 return DefWindowProc(hwnd, uMessage, wparam, lparam);
119 break;
121 case WM_DESTROY: /* message: window being destroyed */
122 PostQuitMessage(0);
123 break;
125 default: /* Passes it on if unproccessed */
126 return DefWindowProc(hwnd, uMessage, wparam, lparam);
128 return 0;
131 BOOL FileIsPlaceable( LPCSTR szFileName )
133 HFILE hInFile;
134 OFSTRUCT inof;
135 APMFILEHEADER apmh;
137 if( (hInFile = OpenFile( szFileName, &inof, OF_READ ) ) == HFILE_ERROR )
138 return FALSE;
140 if( _lread( hInFile, &apmh, sizeof(APMFILEHEADER) )
141 != sizeof(APMFILEHEADER) )
143 _lclose( hInFile );
144 return FALSE;
146 _lclose( hInFile );
148 /* Is it placeable? */
149 return (apmh.key == APMHEADER_KEY);
152 HMETAFILE GetPlaceableMetaFile( HWND hwnd, LPCSTR szFileName )
154 LPSTR lpData;
155 METAHEADER mfHeader;
156 APMFILEHEADER APMHeader;
157 HFILE fh;
158 HMETAFILE hmf;
159 OFSTRUCT inof;
160 WORD checksum, *p;
161 int i;
163 if( (fh = OpenFile( szFileName, &inof, OF_READ ) ) == HFILE_ERROR ) return 0;
164 _llseek(fh, 0, 0);
165 if (!_lread(fh, (LPSTR)&APMHeader, sizeof(APMFILEHEADER))) return 0;
166 _llseek(fh, sizeof(APMFILEHEADER), 0);
167 checksum = 0;
168 p = (WORD *) &APMHeader;
170 for(i=0; i<10; i++)
171 checksum ^= *p++;
172 if (checksum != APMHeader.checksum) {
173 char msg[128];
174 sprintf(msg, "Computed checksum %04x != stored checksum %04x\n",
175 checksum, APMHeader.checksum);
176 MessageBox(hwnd, msg, "Checksum failed", MB_OK);
177 return 0;
180 if (!_lread(fh, (LPSTR)&mfHeader, sizeof(METAHEADER))) return 0;
182 if (!(lpData = (LPSTR) GlobalAlloc(GPTR, (mfHeader.mtSize * 2L)))) return 0;
184 _llseek(fh, sizeof(APMFILEHEADER), 0);
185 if (!_lread(fh, lpData, (UINT)(mfHeader.mtSize * 2L)))
187 GlobalFree(lpData);
188 _lclose(fh);
189 return 0;
191 _lclose(fh);
193 if (!(hmf = SetMetaFileBitsEx(mfHeader.mtSize*2, lpData)))
194 return 0;
197 width = APMHeader.bbox.Right - APMHeader.bbox.Left;
198 height = APMHeader.bbox.Bottom - APMHeader.bbox.Top;
200 /* printf("Ok! width %d height %d inch %d\n", width, height, APMHeader.inch); */
201 width = width*96/APMHeader.inch;
202 height = height*96/APMHeader.inch;
204 deltax = 0;
205 deltay = 0 ;
206 return hmf;