]> icculus.org git repositories - btb/d2x.git/blob - unused/win95/winapp.c
use the orientation parameter of g3_draw_bitmap
[btb/d2x.git] / unused / win95 / winapp.c
1 /*
2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
11 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13
14
15
16 #define _WIN32
17 #define WIN32_LEAN_AND_MEAN
18
19 #include <windows.h>
20 #include <stdio.h>
21 #include <string.h>
22 #include "mono.h"
23 #include "winapp.h"
24 #include "dd.h"
25
26 static HWND hWAppWnd = 0;
27 static HINSTANCE hWAppInstance = 0;
28
29
30 void SetLibraryWinInfo(HWND hWnd, HINSTANCE hInstance)
31 {
32         hWAppWnd = hWnd;
33         hWAppInstance = hInstance;
34 }
35
36
37 HWND GetLibraryWindow(void)
38 {
39         return hWAppWnd;
40 }
41
42
43 HINSTANCE GetLibraryWinInstance(void)
44 {
45         return hWAppInstance;   
46 }
47
48
49 //      Console Functions
50
51 static BOOL ConInit=FALSE;
52 static HANDLE ConStdOut;
53 static HANDLE ConStdIn;
54
55 void cinit()
56 {
57         AllocConsole();
58         ConStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
59         ConStdIn = GetStdHandle(STD_INPUT_HANDLE);
60         ConInit = TRUE;
61 }
62
63 void cclose()
64 {
65         ConInit = FALSE;
66 }
67
68
69 void cprintf(char *text, ...)
70 {
71         char buffer[1000];
72         va_list args;
73         DWORD size;
74
75         if (!ConInit) return;   
76
77         va_start(args, text );
78         vsprintf(buffer,text,args);
79
80         WriteConsole(ConStdOut, buffer, strlen(buffer), &size, NULL);
81 }
82
83
84 int cgetch()
85 {
86         char buffer[3];
87         DWORD chread;
88
89         ReadConsole(ConStdIn, buffer, sizeof(TCHAR), &chread, NULL);
90         return (int)buffer[0];
91 }
92         
93
94 //      Log Functions
95
96 static FILE *LogFile=NULL;
97
98 void loginit(char *name)
99 {
100         if (LogFile) return;
101
102         LogFile = fopen(name, "wt");
103         if (!LogFile) {
104                 MessageBox(NULL, "Unable to create descentw.log!", "Descent II Beta Error", MB_OK);
105                 return;
106         }
107
108         fprintf(LogFile, "%s begins.\n--------------------------------------\n\n",name);
109         fflush(LogFile);
110 }
111
112
113 void logclose()
114 {
115         if (!LogFile) return;
116
117         fprintf(LogFile, "\n-----------------------------------------\nlog ends.\n");
118
119         fclose(LogFile);
120         
121         LogFile = NULL;
122 }       
123
124
125 void logentry(char *format, ...)
126 {
127         char buffer[256];
128         va_list args;
129
130         if (!LogFile) return;   
131
132         va_start(args, format );
133         vsprintf(buffer, format ,args);
134
135         mprintf((0, "%s", buffer));
136         fprintf(LogFile, "%s", buffer);
137         fflush(LogFile);
138 }
139
140
141 //      Disk stuff
142
143 unsigned int GetFreeDiskSpace()
144 {
145         DWORD sec_per_cluster,
146                         bytes_per_sec,
147                         free_clusters,
148                         total_clusters;
149
150         if (!GetDiskFreeSpace(
151                 NULL,
152                 &sec_per_cluster,
153                 &bytes_per_sec,
154                 &free_clusters,
155                 &total_clusters)) return 0x7fffffff;
156
157         return (uint)(free_clusters * sec_per_cluster * bytes_per_sec);
158 }
159
160
161 //      Clipboarding functions
162
163 HBITMAP win95_screen_shot()
164 {
165         HDC hdcscreen;
166         HDC hdccapture;
167         HBITMAP screen_bitmap;
168         HBITMAP old_bitmap;
169
170 //@@    hdcscreen = CreateDC("DISPLAY", NULL, NULL, NULL);
171         IDirectDrawSurface_GetDC(dd_grd_screencanv->lpdds, &hdcscreen);
172         hdccapture = CreateCompatibleDC(hdcscreen);
173         
174         screen_bitmap = CreateCompatibleBitmap(hdcscreen, GRMODEINFO(w), GRMODEINFO(h));
175
176         if (!screen_bitmap) {
177                 DeleteDC(hdccapture);
178                 IDirectDrawSurface_ReleaseDC(dd_grd_screencanv->lpdds, hdcscreen);
179         //@@    DeleteDC(hdcscreen);
180                 return NULL;
181         }
182
183         old_bitmap = SelectObject(hdccapture, screen_bitmap);
184         if (!old_bitmap) {
185                 DeleteObject(screen_bitmap);
186                 DeleteDC(hdccapture);
187                 IDirectDrawSurface_ReleaseDC(dd_grd_screencanv->lpdds, hdcscreen);
188                 //@@    DeleteDC(hdcscreen);
189                 return NULL;
190         }
191         
192         if (!BitBlt(hdccapture, 0,0,GRMODEINFO(w), GRMODEINFO(h), hdcscreen, 0, 0,
193                         SRCCOPY)) {
194                 SelectObject(hdccapture, old_bitmap);
195                 DeleteObject(screen_bitmap);
196                 DeleteDC(hdccapture);
197                 IDirectDrawSurface_ReleaseDC(dd_grd_screencanv->lpdds, hdcscreen);
198         //@@    DeleteDC(hdcscreen);
199                 return NULL;
200         }
201
202         screen_bitmap = SelectObject(hdccapture, old_bitmap);
203         DeleteDC(hdccapture);
204
205         IDirectDrawSurface_ReleaseDC(dd_grd_screencanv->lpdds, hdcscreen);
206 //@@    DeleteDC(hdcscreen);
207
208         return screen_bitmap;
209 }               
210
211
212 HANDLE win95_dib_from_bitmap(HBITMAP hbm)
213 {
214         HANDLE hMem,hX;
215         BITMAP bm;
216         BITMAPINFOHEADER bi;
217         BITMAPINFOHEADER *pbi;
218         RGBQUAD *rgbp;
219         HDC hdc;
220         char grpal[768];
221         int i;
222         HRESULT hRes;
223
224         GetObject(hbm, sizeof(bm), &bm);
225
226         memset(&bi, 0, sizeof(bi));
227         
228         bi.biSize = sizeof(BITMAPINFOHEADER);
229         bi.biWidth = bm.bmWidth;
230         bi.biHeight = bm.bmHeight;
231         bi.biPlanes = 1;
232         bi.biBitCount = bm.bmPlanes * bm.bmBitsPixel;
233         bi.biCompression = BI_RGB;
234
235         hMem = GlobalAlloc(GHND, bi.biSize + 256 * sizeof(RGBQUAD));
236         if (!hMem) {
237                 mprintf((1, "WINAPP: Unable to allocate memory for DIB.\n"));
238                 return NULL;
239         }
240
241         pbi = (BITMAPINFOHEADER *)GlobalLock(hMem);
242         *pbi = bi;
243
244         hRes = IDirectDrawSurface_GetDC(dd_grd_screencanv->lpdds, &hdc);
245         if (hRes != DD_OK) {
246                 GlobalFree(hMem);
247                 mprintf((1, "WINAPP: Unable to get GDI DC for DIB creation.\n"));
248                 return NULL;
249         }
250         GetDIBits(hdc, hbm, 0, bi.biHeight, NULL, (BITMAPINFO *)pbi, DIB_RGB_COLORS);
251         bi = *pbi;
252         GlobalUnlock(hMem); 
253         
254         if (!bi.biSizeImage) {
255                 bi.biSizeImage = bi.biWidth * bi.biHeight;
256         }               
257         
258         hX = GlobalReAlloc(hMem, bi.biSize + 256*sizeof(RGBQUAD) + bi.biSizeImage,0);
259         if (!hX) {
260                 GlobalFree(hMem);
261                 IDirectDrawSurface_ReleaseDC(dd_grd_screencanv->lpdds, hdc);
262                 mprintf((1, "WINAPP: Unable to reallocate mem for DIB.\n"));
263                 return NULL;
264         }
265         hMem = hX;
266
267         pbi = GlobalLock(hMem);
268         
269         if (!GetDIBits(hdc, hbm, 0, 
270                         pbi->biHeight, 
271                         (LPSTR)pbi + pbi->biSize + 256*sizeof(RGBQUAD),
272                         (BITMAPINFO *)pbi, DIB_RGB_COLORS)) {
273                 GlobalUnlock(hMem);
274                 GlobalFree(hMem);
275                 IDirectDrawSurface_ReleaseDC(dd_grd_screencanv->lpdds, hdc);
276                 mprintf((1, "WINAPP: GetDIBits was unable to get needed info.\n"));
277                 return NULL;
278         }
279         bi = *pbi;
280
281         IDirectDrawSurface_ReleaseDC(dd_grd_screencanv->lpdds, hdc);
282         
283         rgbp = (RGBQUAD *)(((LPSTR)pbi + pbi->biSize));
284
285         gr_palette_read(grpal);
286         for (i = 0; i < 256; i++) 
287         {
288                 rgbp[i].rgbRed = grpal[i*3]<<2;
289                 rgbp[i].rgbGreen = grpal[i*3+1]<<2;
290                 rgbp[i].rgbBlue = grpal[i*3+2]<<2;
291                 rgbp[i].rgbReserved = 0;
292         }                       
293
294         GlobalUnlock(hMem);
295
296         return hMem;
297 }
298
299                 
300