author | Sam Lantinga <slouken@libsdl.org> |
Fri, 25 Jun 2004 05:24:50 +0000 | |
changeset 901 | fd4a6847ddc0 |
parent 833 | 31fa08b36380 |
child 971 | 96671ebc50a4 |
permissions | -rw-r--r-- |
0 | 1 |
/* |
2 |
SDL - Simple DirectMedia Layer |
|
769
b8d311d90021
Updated copyright information for 2004 (Happy New Year!)
Sam Lantinga <slouken@libsdl.org>
parents:
525
diff
changeset
|
3 |
Copyright (C) 1997-2004 Sam Lantinga |
0 | 4 |
|
5 |
This library is free software; you can redistribute it and/or |
|
6 |
modify it under the terms of the GNU Library General Public |
|
7 |
License as published by the Free Software Foundation; either |
|
8 |
version 2 of the License, or (at your option) any later version. |
|
9 |
||
10 |
This library is distributed in the hope that it will be useful, |
|
11 |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
13 |
Library General Public License for more details. |
|
14 |
||
15 |
You should have received a copy of the GNU Library General Public |
|
16 |
License along with this library; if not, write to the Free |
|
17 |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
18 |
||
19 |
Sam Lantinga |
|
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
169
diff
changeset
|
20 |
slouken@libsdl.org |
0 | 21 |
*/ |
22 |
||
23 |
#ifdef SAVE_RCSID |
|
24 |
static char rcsid = |
|
25 |
"@(#) $Id$"; |
|
26 |
#endif |
|
27 |
||
28 |
#include <stdio.h> |
|
29 |
#include <stdlib.h> |
|
30 |
#include <malloc.h> |
|
31 |
#include <windows.h> |
|
32 |
#include "directx.h" |
|
33 |
||
34 |
/* Not yet in the mingw32 cross-compile headers */ |
|
35 |
#ifndef CDS_FULLSCREEN |
|
36 |
#define CDS_FULLSCREEN 4 |
|
37 |
#endif |
|
38 |
||
39 |
#include "SDL_error.h" |
|
40 |
#include "SDL_timer.h" |
|
41 |
#include "SDL_events.h" |
|
42 |
#include "SDL_syswm.h" |
|
43 |
#include "SDL_sysvideo.h" |
|
44 |
#include "SDL_blit.h" |
|
45 |
#include "SDL_pixels_c.h" |
|
46 |
#include "SDL_dx5video.h" |
|
47 |
#include "SDL_syswm_c.h" |
|
48 |
#include "SDL_sysmouse_c.h" |
|
49 |
#include "SDL_dx5events_c.h" |
|
50 |
#include "SDL_dx5yuv_c.h" |
|
51 |
#include "SDL_wingl_c.h" |
|
52 |
||
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
53 |
#ifdef _WIN32_WCE |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
54 |
#define NO_CHANGEDISPLAYSETTINGS |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
55 |
#endif |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
56 |
#ifndef WS_MAXIMIZE |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
57 |
#define WS_MAXIMIZE 0 |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
58 |
#endif |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
59 |
#ifndef SWP_NOCOPYBITS |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
60 |
#define SWP_NOCOPYBITS 0 |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
61 |
#endif |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
62 |
#ifndef PC_NOCOLLAPSE |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
63 |
#define PC_NOCOLLAPSE 0 |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
64 |
#endif |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
65 |
|
0 | 66 |
|
67 |
/* DirectX function pointers for video and events */ |
|
68 |
HRESULT (WINAPI *DDrawCreate)( GUID FAR *lpGUID, LPDIRECTDRAW FAR *lplpDD, IUnknown FAR *pUnkOuter ); |
|
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
69 |
HRESULT (WINAPI *DInputCreate)(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUT *ppDI, LPUNKNOWN punkOuter); |
0 | 70 |
|
71 |
/* This is the rect EnumModes2 uses */ |
|
72 |
struct DX5EnumRect { |
|
73 |
SDL_Rect r; |
|
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
74 |
int refreshRate; |
0 | 75 |
struct DX5EnumRect* next; |
76 |
}; |
|
77 |
static struct DX5EnumRect *enumlists[NUM_MODELISTS]; |
|
78 |
||
79 |
/* |
|
80 |
* Experimentally determined values for c_cfDI* constants used in DirectX 5.0 |
|
81 |
*/ |
|
82 |
||
83 |
/* Keyboard */ |
|
84 |
||
85 |
static DIOBJECTDATAFORMAT KBD_fmt[] = { |
|
86 |
{ &GUID_Key, 0, 0x8000000C, 0x00000000 }, |
|
87 |
{ &GUID_Key, 1, 0x8000010C, 0x00000000 }, |
|
88 |
{ &GUID_Key, 2, 0x8000020C, 0x00000000 }, |
|
89 |
{ &GUID_Key, 3, 0x8000030C, 0x00000000 }, |
|
90 |
{ &GUID_Key, 4, 0x8000040C, 0x00000000 }, |
|
91 |
{ &GUID_Key, 5, 0x8000050C, 0x00000000 }, |
|
92 |
{ &GUID_Key, 6, 0x8000060C, 0x00000000 }, |
|
93 |
{ &GUID_Key, 7, 0x8000070C, 0x00000000 }, |
|
94 |
{ &GUID_Key, 8, 0x8000080C, 0x00000000 }, |
|
95 |
{ &GUID_Key, 9, 0x8000090C, 0x00000000 }, |
|
96 |
{ &GUID_Key, 10, 0x80000A0C, 0x00000000 }, |
|
97 |
{ &GUID_Key, 11, 0x80000B0C, 0x00000000 }, |
|
98 |
{ &GUID_Key, 12, 0x80000C0C, 0x00000000 }, |
|
99 |
{ &GUID_Key, 13, 0x80000D0C, 0x00000000 }, |
|
100 |
{ &GUID_Key, 14, 0x80000E0C, 0x00000000 }, |
|
101 |
{ &GUID_Key, 15, 0x80000F0C, 0x00000000 }, |
|
102 |
{ &GUID_Key, 16, 0x8000100C, 0x00000000 }, |
|
103 |
{ &GUID_Key, 17, 0x8000110C, 0x00000000 }, |
|
104 |
{ &GUID_Key, 18, 0x8000120C, 0x00000000 }, |
|
105 |
{ &GUID_Key, 19, 0x8000130C, 0x00000000 }, |
|
106 |
{ &GUID_Key, 20, 0x8000140C, 0x00000000 }, |
|
107 |
{ &GUID_Key, 21, 0x8000150C, 0x00000000 }, |
|
108 |
{ &GUID_Key, 22, 0x8000160C, 0x00000000 }, |
|
109 |
{ &GUID_Key, 23, 0x8000170C, 0x00000000 }, |
|
110 |
{ &GUID_Key, 24, 0x8000180C, 0x00000000 }, |
|
111 |
{ &GUID_Key, 25, 0x8000190C, 0x00000000 }, |
|
112 |
{ &GUID_Key, 26, 0x80001A0C, 0x00000000 }, |
|
113 |
{ &GUID_Key, 27, 0x80001B0C, 0x00000000 }, |
|
114 |
{ &GUID_Key, 28, 0x80001C0C, 0x00000000 }, |
|
115 |
{ &GUID_Key, 29, 0x80001D0C, 0x00000000 }, |
|
116 |
{ &GUID_Key, 30, 0x80001E0C, 0x00000000 }, |
|
117 |
{ &GUID_Key, 31, 0x80001F0C, 0x00000000 }, |
|
118 |
{ &GUID_Key, 32, 0x8000200C, 0x00000000 }, |
|
119 |
{ &GUID_Key, 33, 0x8000210C, 0x00000000 }, |
|
120 |
{ &GUID_Key, 34, 0x8000220C, 0x00000000 }, |
|
121 |
{ &GUID_Key, 35, 0x8000230C, 0x00000000 }, |
|
122 |
{ &GUID_Key, 36, 0x8000240C, 0x00000000 }, |
|
123 |
{ &GUID_Key, 37, 0x8000250C, 0x00000000 }, |
|
124 |
{ &GUID_Key, 38, 0x8000260C, 0x00000000 }, |
|
125 |
{ &GUID_Key, 39, 0x8000270C, 0x00000000 }, |
|
126 |
{ &GUID_Key, 40, 0x8000280C, 0x00000000 }, |
|
127 |
{ &GUID_Key, 41, 0x8000290C, 0x00000000 }, |
|
128 |
{ &GUID_Key, 42, 0x80002A0C, 0x00000000 }, |
|
129 |
{ &GUID_Key, 43, 0x80002B0C, 0x00000000 }, |
|
130 |
{ &GUID_Key, 44, 0x80002C0C, 0x00000000 }, |
|
131 |
{ &GUID_Key, 45, 0x80002D0C, 0x00000000 }, |
|
132 |
{ &GUID_Key, 46, 0x80002E0C, 0x00000000 }, |
|
133 |
{ &GUID_Key, 47, 0x80002F0C, 0x00000000 }, |
|
134 |
{ &GUID_Key, 48, 0x8000300C, 0x00000000 }, |
|
135 |
{ &GUID_Key, 49, 0x8000310C, 0x00000000 }, |
|
136 |
{ &GUID_Key, 50, 0x8000320C, 0x00000000 }, |
|
137 |
{ &GUID_Key, 51, 0x8000330C, 0x00000000 }, |
|
138 |
{ &GUID_Key, 52, 0x8000340C, 0x00000000 }, |
|
139 |
{ &GUID_Key, 53, 0x8000350C, 0x00000000 }, |
|
140 |
{ &GUID_Key, 54, 0x8000360C, 0x00000000 }, |
|
141 |
{ &GUID_Key, 55, 0x8000370C, 0x00000000 }, |
|
142 |
{ &GUID_Key, 56, 0x8000380C, 0x00000000 }, |
|
143 |
{ &GUID_Key, 57, 0x8000390C, 0x00000000 }, |
|
144 |
{ &GUID_Key, 58, 0x80003A0C, 0x00000000 }, |
|
145 |
{ &GUID_Key, 59, 0x80003B0C, 0x00000000 }, |
|
146 |
{ &GUID_Key, 60, 0x80003C0C, 0x00000000 }, |
|
147 |
{ &GUID_Key, 61, 0x80003D0C, 0x00000000 }, |
|
148 |
{ &GUID_Key, 62, 0x80003E0C, 0x00000000 }, |
|
149 |
{ &GUID_Key, 63, 0x80003F0C, 0x00000000 }, |
|
150 |
{ &GUID_Key, 64, 0x8000400C, 0x00000000 }, |
|
151 |
{ &GUID_Key, 65, 0x8000410C, 0x00000000 }, |
|
152 |
{ &GUID_Key, 66, 0x8000420C, 0x00000000 }, |
|
153 |
{ &GUID_Key, 67, 0x8000430C, 0x00000000 }, |
|
154 |
{ &GUID_Key, 68, 0x8000440C, 0x00000000 }, |
|
155 |
{ &GUID_Key, 69, 0x8000450C, 0x00000000 }, |
|
156 |
{ &GUID_Key, 70, 0x8000460C, 0x00000000 }, |
|
157 |
{ &GUID_Key, 71, 0x8000470C, 0x00000000 }, |
|
158 |
{ &GUID_Key, 72, 0x8000480C, 0x00000000 }, |
|
159 |
{ &GUID_Key, 73, 0x8000490C, 0x00000000 }, |
|
160 |
{ &GUID_Key, 74, 0x80004A0C, 0x00000000 }, |
|
161 |
{ &GUID_Key, 75, 0x80004B0C, 0x00000000 }, |
|
162 |
{ &GUID_Key, 76, 0x80004C0C, 0x00000000 }, |
|
163 |
{ &GUID_Key, 77, 0x80004D0C, 0x00000000 }, |
|
164 |
{ &GUID_Key, 78, 0x80004E0C, 0x00000000 }, |
|
165 |
{ &GUID_Key, 79, 0x80004F0C, 0x00000000 }, |
|
166 |
{ &GUID_Key, 80, 0x8000500C, 0x00000000 }, |
|
167 |
{ &GUID_Key, 81, 0x8000510C, 0x00000000 }, |
|
168 |
{ &GUID_Key, 82, 0x8000520C, 0x00000000 }, |
|
169 |
{ &GUID_Key, 83, 0x8000530C, 0x00000000 }, |
|
170 |
{ &GUID_Key, 84, 0x8000540C, 0x00000000 }, |
|
171 |
{ &GUID_Key, 85, 0x8000550C, 0x00000000 }, |
|
172 |
{ &GUID_Key, 86, 0x8000560C, 0x00000000 }, |
|
173 |
{ &GUID_Key, 87, 0x8000570C, 0x00000000 }, |
|
174 |
{ &GUID_Key, 88, 0x8000580C, 0x00000000 }, |
|
175 |
{ &GUID_Key, 89, 0x8000590C, 0x00000000 }, |
|
176 |
{ &GUID_Key, 90, 0x80005A0C, 0x00000000 }, |
|
177 |
{ &GUID_Key, 91, 0x80005B0C, 0x00000000 }, |
|
178 |
{ &GUID_Key, 92, 0x80005C0C, 0x00000000 }, |
|
179 |
{ &GUID_Key, 93, 0x80005D0C, 0x00000000 }, |
|
180 |
{ &GUID_Key, 94, 0x80005E0C, 0x00000000 }, |
|
181 |
{ &GUID_Key, 95, 0x80005F0C, 0x00000000 }, |
|
182 |
{ &GUID_Key, 96, 0x8000600C, 0x00000000 }, |
|
183 |
{ &GUID_Key, 97, 0x8000610C, 0x00000000 }, |
|
184 |
{ &GUID_Key, 98, 0x8000620C, 0x00000000 }, |
|
185 |
{ &GUID_Key, 99, 0x8000630C, 0x00000000 }, |
|
186 |
{ &GUID_Key, 100, 0x8000640C, 0x00000000 }, |
|
187 |
{ &GUID_Key, 101, 0x8000650C, 0x00000000 }, |
|
188 |
{ &GUID_Key, 102, 0x8000660C, 0x00000000 }, |
|
189 |
{ &GUID_Key, 103, 0x8000670C, 0x00000000 }, |
|
190 |
{ &GUID_Key, 104, 0x8000680C, 0x00000000 }, |
|
191 |
{ &GUID_Key, 105, 0x8000690C, 0x00000000 }, |
|
192 |
{ &GUID_Key, 106, 0x80006A0C, 0x00000000 }, |
|
193 |
{ &GUID_Key, 107, 0x80006B0C, 0x00000000 }, |
|
194 |
{ &GUID_Key, 108, 0x80006C0C, 0x00000000 }, |
|
195 |
{ &GUID_Key, 109, 0x80006D0C, 0x00000000 }, |
|
196 |
{ &GUID_Key, 110, 0x80006E0C, 0x00000000 }, |
|
197 |
{ &GUID_Key, 111, 0x80006F0C, 0x00000000 }, |
|
198 |
{ &GUID_Key, 112, 0x8000700C, 0x00000000 }, |
|
199 |
{ &GUID_Key, 113, 0x8000710C, 0x00000000 }, |
|
200 |
{ &GUID_Key, 114, 0x8000720C, 0x00000000 }, |
|
201 |
{ &GUID_Key, 115, 0x8000730C, 0x00000000 }, |
|
202 |
{ &GUID_Key, 116, 0x8000740C, 0x00000000 }, |
|
203 |
{ &GUID_Key, 117, 0x8000750C, 0x00000000 }, |
|
204 |
{ &GUID_Key, 118, 0x8000760C, 0x00000000 }, |
|
205 |
{ &GUID_Key, 119, 0x8000770C, 0x00000000 }, |
|
206 |
{ &GUID_Key, 120, 0x8000780C, 0x00000000 }, |
|
207 |
{ &GUID_Key, 121, 0x8000790C, 0x00000000 }, |
|
208 |
{ &GUID_Key, 122, 0x80007A0C, 0x00000000 }, |
|
209 |
{ &GUID_Key, 123, 0x80007B0C, 0x00000000 }, |
|
210 |
{ &GUID_Key, 124, 0x80007C0C, 0x00000000 }, |
|
211 |
{ &GUID_Key, 125, 0x80007D0C, 0x00000000 }, |
|
212 |
{ &GUID_Key, 126, 0x80007E0C, 0x00000000 }, |
|
213 |
{ &GUID_Key, 127, 0x80007F0C, 0x00000000 }, |
|
214 |
{ &GUID_Key, 128, 0x8000800C, 0x00000000 }, |
|
215 |
{ &GUID_Key, 129, 0x8000810C, 0x00000000 }, |
|
216 |
{ &GUID_Key, 130, 0x8000820C, 0x00000000 }, |
|
217 |
{ &GUID_Key, 131, 0x8000830C, 0x00000000 }, |
|
218 |
{ &GUID_Key, 132, 0x8000840C, 0x00000000 }, |
|
219 |
{ &GUID_Key, 133, 0x8000850C, 0x00000000 }, |
|
220 |
{ &GUID_Key, 134, 0x8000860C, 0x00000000 }, |
|
221 |
{ &GUID_Key, 135, 0x8000870C, 0x00000000 }, |
|
222 |
{ &GUID_Key, 136, 0x8000880C, 0x00000000 }, |
|
223 |
{ &GUID_Key, 137, 0x8000890C, 0x00000000 }, |
|
224 |
{ &GUID_Key, 138, 0x80008A0C, 0x00000000 }, |
|
225 |
{ &GUID_Key, 139, 0x80008B0C, 0x00000000 }, |
|
226 |
{ &GUID_Key, 140, 0x80008C0C, 0x00000000 }, |
|
227 |
{ &GUID_Key, 141, 0x80008D0C, 0x00000000 }, |
|
228 |
{ &GUID_Key, 142, 0x80008E0C, 0x00000000 }, |
|
229 |
{ &GUID_Key, 143, 0x80008F0C, 0x00000000 }, |
|
230 |
{ &GUID_Key, 144, 0x8000900C, 0x00000000 }, |
|
231 |
{ &GUID_Key, 145, 0x8000910C, 0x00000000 }, |
|
232 |
{ &GUID_Key, 146, 0x8000920C, 0x00000000 }, |
|
233 |
{ &GUID_Key, 147, 0x8000930C, 0x00000000 }, |
|
234 |
{ &GUID_Key, 148, 0x8000940C, 0x00000000 }, |
|
235 |
{ &GUID_Key, 149, 0x8000950C, 0x00000000 }, |
|
236 |
{ &GUID_Key, 150, 0x8000960C, 0x00000000 }, |
|
237 |
{ &GUID_Key, 151, 0x8000970C, 0x00000000 }, |
|
238 |
{ &GUID_Key, 152, 0x8000980C, 0x00000000 }, |
|
239 |
{ &GUID_Key, 153, 0x8000990C, 0x00000000 }, |
|
240 |
{ &GUID_Key, 154, 0x80009A0C, 0x00000000 }, |
|
241 |
{ &GUID_Key, 155, 0x80009B0C, 0x00000000 }, |
|
242 |
{ &GUID_Key, 156, 0x80009C0C, 0x00000000 }, |
|
243 |
{ &GUID_Key, 157, 0x80009D0C, 0x00000000 }, |
|
244 |
{ &GUID_Key, 158, 0x80009E0C, 0x00000000 }, |
|
245 |
{ &GUID_Key, 159, 0x80009F0C, 0x00000000 }, |
|
246 |
{ &GUID_Key, 160, 0x8000A00C, 0x00000000 }, |
|
247 |
{ &GUID_Key, 161, 0x8000A10C, 0x00000000 }, |
|
248 |
{ &GUID_Key, 162, 0x8000A20C, 0x00000000 }, |
|
249 |
{ &GUID_Key, 163, 0x8000A30C, 0x00000000 }, |
|
250 |
{ &GUID_Key, 164, 0x8000A40C, 0x00000000 }, |
|
251 |
{ &GUID_Key, 165, 0x8000A50C, 0x00000000 }, |
|
252 |
{ &GUID_Key, 166, 0x8000A60C, 0x00000000 }, |
|
253 |
{ &GUID_Key, 167, 0x8000A70C, 0x00000000 }, |
|
254 |
{ &GUID_Key, 168, 0x8000A80C, 0x00000000 }, |
|
255 |
{ &GUID_Key, 169, 0x8000A90C, 0x00000000 }, |
|
256 |
{ &GUID_Key, 170, 0x8000AA0C, 0x00000000 }, |
|
257 |
{ &GUID_Key, 171, 0x8000AB0C, 0x00000000 }, |
|
258 |
{ &GUID_Key, 172, 0x8000AC0C, 0x00000000 }, |
|
259 |
{ &GUID_Key, 173, 0x8000AD0C, 0x00000000 }, |
|
260 |
{ &GUID_Key, 174, 0x8000AE0C, 0x00000000 }, |
|
261 |
{ &GUID_Key, 175, 0x8000AF0C, 0x00000000 }, |
|
262 |
{ &GUID_Key, 176, 0x8000B00C, 0x00000000 }, |
|
263 |
{ &GUID_Key, 177, 0x8000B10C, 0x00000000 }, |
|
264 |
{ &GUID_Key, 178, 0x8000B20C, 0x00000000 }, |
|
265 |
{ &GUID_Key, 179, 0x8000B30C, 0x00000000 }, |
|
266 |
{ &GUID_Key, 180, 0x8000B40C, 0x00000000 }, |
|
267 |
{ &GUID_Key, 181, 0x8000B50C, 0x00000000 }, |
|
268 |
{ &GUID_Key, 182, 0x8000B60C, 0x00000000 }, |
|
269 |
{ &GUID_Key, 183, 0x8000B70C, 0x00000000 }, |
|
270 |
{ &GUID_Key, 184, 0x8000B80C, 0x00000000 }, |
|
271 |
{ &GUID_Key, 185, 0x8000B90C, 0x00000000 }, |
|
272 |
{ &GUID_Key, 186, 0x8000BA0C, 0x00000000 }, |
|
273 |
{ &GUID_Key, 187, 0x8000BB0C, 0x00000000 }, |
|
274 |
{ &GUID_Key, 188, 0x8000BC0C, 0x00000000 }, |
|
275 |
{ &GUID_Key, 189, 0x8000BD0C, 0x00000000 }, |
|
276 |
{ &GUID_Key, 190, 0x8000BE0C, 0x00000000 }, |
|
277 |
{ &GUID_Key, 191, 0x8000BF0C, 0x00000000 }, |
|
278 |
{ &GUID_Key, 192, 0x8000C00C, 0x00000000 }, |
|
279 |
{ &GUID_Key, 193, 0x8000C10C, 0x00000000 }, |
|
280 |
{ &GUID_Key, 194, 0x8000C20C, 0x00000000 }, |
|
281 |
{ &GUID_Key, 195, 0x8000C30C, 0x00000000 }, |
|
282 |
{ &GUID_Key, 196, 0x8000C40C, 0x00000000 }, |
|
283 |
{ &GUID_Key, 197, 0x8000C50C, 0x00000000 }, |
|
284 |
{ &GUID_Key, 198, 0x8000C60C, 0x00000000 }, |
|
285 |
{ &GUID_Key, 199, 0x8000C70C, 0x00000000 }, |
|
286 |
{ &GUID_Key, 200, 0x8000C80C, 0x00000000 }, |
|
287 |
{ &GUID_Key, 201, 0x8000C90C, 0x00000000 }, |
|
288 |
{ &GUID_Key, 202, 0x8000CA0C, 0x00000000 }, |
|
289 |
{ &GUID_Key, 203, 0x8000CB0C, 0x00000000 }, |
|
290 |
{ &GUID_Key, 204, 0x8000CC0C, 0x00000000 }, |
|
291 |
{ &GUID_Key, 205, 0x8000CD0C, 0x00000000 }, |
|
292 |
{ &GUID_Key, 206, 0x8000CE0C, 0x00000000 }, |
|
293 |
{ &GUID_Key, 207, 0x8000CF0C, 0x00000000 }, |
|
294 |
{ &GUID_Key, 208, 0x8000D00C, 0x00000000 }, |
|
295 |
{ &GUID_Key, 209, 0x8000D10C, 0x00000000 }, |
|
296 |
{ &GUID_Key, 210, 0x8000D20C, 0x00000000 }, |
|
297 |
{ &GUID_Key, 211, 0x8000D30C, 0x00000000 }, |
|
298 |
{ &GUID_Key, 212, 0x8000D40C, 0x00000000 }, |
|
299 |
{ &GUID_Key, 213, 0x8000D50C, 0x00000000 }, |
|
300 |
{ &GUID_Key, 214, 0x8000D60C, 0x00000000 }, |
|
301 |
{ &GUID_Key, 215, 0x8000D70C, 0x00000000 }, |
|
302 |
{ &GUID_Key, 216, 0x8000D80C, 0x00000000 }, |
|
303 |
{ &GUID_Key, 217, 0x8000D90C, 0x00000000 }, |
|
304 |
{ &GUID_Key, 218, 0x8000DA0C, 0x00000000 }, |
|
305 |
{ &GUID_Key, 219, 0x8000DB0C, 0x00000000 }, |
|
306 |
{ &GUID_Key, 220, 0x8000DC0C, 0x00000000 }, |
|
307 |
{ &GUID_Key, 221, 0x8000DD0C, 0x00000000 }, |
|
308 |
{ &GUID_Key, 222, 0x8000DE0C, 0x00000000 }, |
|
309 |
{ &GUID_Key, 223, 0x8000DF0C, 0x00000000 }, |
|
310 |
{ &GUID_Key, 224, 0x8000E00C, 0x00000000 }, |
|
311 |
{ &GUID_Key, 225, 0x8000E10C, 0x00000000 }, |
|
312 |
{ &GUID_Key, 226, 0x8000E20C, 0x00000000 }, |
|
313 |
{ &GUID_Key, 227, 0x8000E30C, 0x00000000 }, |
|
314 |
{ &GUID_Key, 228, 0x8000E40C, 0x00000000 }, |
|
315 |
{ &GUID_Key, 229, 0x8000E50C, 0x00000000 }, |
|
316 |
{ &GUID_Key, 230, 0x8000E60C, 0x00000000 }, |
|
317 |
{ &GUID_Key, 231, 0x8000E70C, 0x00000000 }, |
|
318 |
{ &GUID_Key, 232, 0x8000E80C, 0x00000000 }, |
|
319 |
{ &GUID_Key, 233, 0x8000E90C, 0x00000000 }, |
|
320 |
{ &GUID_Key, 234, 0x8000EA0C, 0x00000000 }, |
|
321 |
{ &GUID_Key, 235, 0x8000EB0C, 0x00000000 }, |
|
322 |
{ &GUID_Key, 236, 0x8000EC0C, 0x00000000 }, |
|
323 |
{ &GUID_Key, 237, 0x8000ED0C, 0x00000000 }, |
|
324 |
{ &GUID_Key, 238, 0x8000EE0C, 0x00000000 }, |
|
325 |
{ &GUID_Key, 239, 0x8000EF0C, 0x00000000 }, |
|
326 |
{ &GUID_Key, 240, 0x8000F00C, 0x00000000 }, |
|
327 |
{ &GUID_Key, 241, 0x8000F10C, 0x00000000 }, |
|
328 |
{ &GUID_Key, 242, 0x8000F20C, 0x00000000 }, |
|
329 |
{ &GUID_Key, 243, 0x8000F30C, 0x00000000 }, |
|
330 |
{ &GUID_Key, 244, 0x8000F40C, 0x00000000 }, |
|
331 |
{ &GUID_Key, 245, 0x8000F50C, 0x00000000 }, |
|
332 |
{ &GUID_Key, 246, 0x8000F60C, 0x00000000 }, |
|
333 |
{ &GUID_Key, 247, 0x8000F70C, 0x00000000 }, |
|
334 |
{ &GUID_Key, 248, 0x8000F80C, 0x00000000 }, |
|
335 |
{ &GUID_Key, 249, 0x8000F90C, 0x00000000 }, |
|
336 |
{ &GUID_Key, 250, 0x8000FA0C, 0x00000000 }, |
|
337 |
{ &GUID_Key, 251, 0x8000FB0C, 0x00000000 }, |
|
338 |
{ &GUID_Key, 252, 0x8000FC0C, 0x00000000 }, |
|
339 |
{ &GUID_Key, 253, 0x8000FD0C, 0x00000000 }, |
|
340 |
{ &GUID_Key, 254, 0x8000FE0C, 0x00000000 }, |
|
341 |
{ &GUID_Key, 255, 0x8000FF0C, 0x00000000 }, |
|
342 |
}; |
|
343 |
||
344 |
const DIDATAFORMAT c_dfDIKeyboard = { 24, 16, 0x00000002, 256, 256, KBD_fmt }; |
|
345 |
||
346 |
||
347 |
/* Mouse */ |
|
348 |
||
349 |
static DIOBJECTDATAFORMAT PTR_fmt[] = { |
|
350 |
{ &GUID_XAxis, 0, 0x00FFFF03, 0x00000000 }, |
|
351 |
{ &GUID_YAxis, 4, 0x00FFFF03, 0x00000000 }, |
|
352 |
{ &GUID_ZAxis, 8, 0x80FFFF03, 0x00000000 }, |
|
353 |
{ NULL, 12, 0x00FFFF0C, 0x00000000 }, |
|
354 |
{ NULL, 13, 0x00FFFF0C, 0x00000000 }, |
|
355 |
{ NULL, 14, 0x80FFFF0C, 0x00000000 }, |
|
356 |
{ NULL, 15, 0x80FFFF0C, 0x00000000 }, |
|
357 |
}; |
|
358 |
||
359 |
const DIDATAFORMAT c_dfDIMouse = { 24, 16, 0x00000002, 16, 7, PTR_fmt }; |
|
360 |
||
361 |
||
362 |
/* Joystick */ |
|
363 |
||
364 |
static DIOBJECTDATAFORMAT JOY_fmt[] = { |
|
365 |
{ &GUID_XAxis, 0, 0x80FFFF03, 0x00000100 }, |
|
366 |
{ &GUID_YAxis, 4, 0x80FFFF03, 0x00000100 }, |
|
367 |
{ &GUID_ZAxis, 8, 0x80FFFF03, 0x00000100 }, |
|
368 |
{ &GUID_RxAxis, 12, 0x80FFFF03, 0x00000100 }, |
|
369 |
{ &GUID_RyAxis, 16, 0x80FFFF03, 0x00000100 }, |
|
370 |
{ &GUID_RzAxis, 20, 0x80FFFF03, 0x00000100 }, |
|
371 |
{ &GUID_Slider, 24, 0x80FFFF03, 0x00000100 }, |
|
372 |
{ &GUID_Slider, 28, 0x80FFFF03, 0x00000100 }, |
|
373 |
{ &GUID_POV, 32, 0x80FFFF10, 0x00000000 }, |
|
374 |
{ &GUID_POV, 36, 0x80FFFF10, 0x00000000 }, |
|
375 |
{ &GUID_POV, 40, 0x80FFFF10, 0x00000000 }, |
|
376 |
{ &GUID_POV, 44, 0x80FFFF10, 0x00000000 }, |
|
377 |
{ NULL, 48, 0x80FFFF0C, 0x00000000 }, |
|
378 |
{ NULL, 49, 0x80FFFF0C, 0x00000000 }, |
|
379 |
{ NULL, 50, 0x80FFFF0C, 0x00000000 }, |
|
380 |
{ NULL, 51, 0x80FFFF0C, 0x00000000 }, |
|
381 |
{ NULL, 52, 0x80FFFF0C, 0x00000000 }, |
|
382 |
{ NULL, 53, 0x80FFFF0C, 0x00000000 }, |
|
383 |
{ NULL, 54, 0x80FFFF0C, 0x00000000 }, |
|
384 |
{ NULL, 55, 0x80FFFF0C, 0x00000000 }, |
|
385 |
{ NULL, 56, 0x80FFFF0C, 0x00000000 }, |
|
386 |
{ NULL, 57, 0x80FFFF0C, 0x00000000 }, |
|
387 |
{ NULL, 58, 0x80FFFF0C, 0x00000000 }, |
|
388 |
{ NULL, 59, 0x80FFFF0C, 0x00000000 }, |
|
389 |
{ NULL, 60, 0x80FFFF0C, 0x00000000 }, |
|
390 |
{ NULL, 61, 0x80FFFF0C, 0x00000000 }, |
|
391 |
{ NULL, 62, 0x80FFFF0C, 0x00000000 }, |
|
392 |
{ NULL, 63, 0x80FFFF0C, 0x00000000 }, |
|
393 |
{ NULL, 64, 0x80FFFF0C, 0x00000000 }, |
|
394 |
{ NULL, 65, 0x80FFFF0C, 0x00000000 }, |
|
395 |
{ NULL, 66, 0x80FFFF0C, 0x00000000 }, |
|
396 |
{ NULL, 67, 0x80FFFF0C, 0x00000000 }, |
|
397 |
{ NULL, 68, 0x80FFFF0C, 0x00000000 }, |
|
398 |
{ NULL, 69, 0x80FFFF0C, 0x00000000 }, |
|
399 |
{ NULL, 70, 0x80FFFF0C, 0x00000000 }, |
|
400 |
{ NULL, 71, 0x80FFFF0C, 0x00000000 }, |
|
401 |
{ NULL, 72, 0x80FFFF0C, 0x00000000 }, |
|
402 |
{ NULL, 73, 0x80FFFF0C, 0x00000000 }, |
|
403 |
{ NULL, 74, 0x80FFFF0C, 0x00000000 }, |
|
404 |
{ NULL, 75, 0x80FFFF0C, 0x00000000 }, |
|
405 |
{ NULL, 76, 0x80FFFF0C, 0x00000000 }, |
|
406 |
{ NULL, 77, 0x80FFFF0C, 0x00000000 }, |
|
407 |
{ NULL, 78, 0x80FFFF0C, 0x00000000 }, |
|
408 |
{ NULL, 79, 0x80FFFF0C, 0x00000000 }, |
|
409 |
}; |
|
410 |
||
411 |
const DIDATAFORMAT c_dfDIJoystick = { 24, 16, 0x00000001, 80, 44, JOY_fmt }; |
|
412 |
||
413 |
||
414 |
/* Initialization/Query functions */ |
|
415 |
static int DX5_VideoInit(_THIS, SDL_PixelFormat *vformat); |
|
416 |
static SDL_Rect **DX5_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags); |
|
417 |
static SDL_Surface *DX5_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags); |
|
418 |
static int DX5_SetColors(_THIS, int firstcolor, int ncolors, |
|
419 |
SDL_Color *colors); |
|
420 |
static int DX5_SetGammaRamp(_THIS, Uint16 *ramp); |
|
421 |
static int DX5_GetGammaRamp(_THIS, Uint16 *ramp); |
|
422 |
static void DX5_VideoQuit(_THIS); |
|
423 |
||
424 |
/* Hardware surface functions */ |
|
425 |
static int DX5_AllocHWSurface(_THIS, SDL_Surface *surface); |
|
426 |
static int DX5_CheckHWBlit(_THIS, SDL_Surface *src, SDL_Surface *dst); |
|
427 |
static int DX5_FillHWRect(_THIS, SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); |
|
428 |
static int DX5_SetHWColorKey(_THIS, SDL_Surface *surface, Uint32 key); |
|
429 |
static int DX5_SetHWAlpha(_THIS, SDL_Surface *surface, Uint8 alpha); |
|
430 |
static int DX5_LockHWSurface(_THIS, SDL_Surface *surface); |
|
431 |
static void DX5_UnlockHWSurface(_THIS, SDL_Surface *surface); |
|
432 |
static int DX5_FlipHWSurface(_THIS, SDL_Surface *surface); |
|
433 |
static void DX5_FreeHWSurface(_THIS, SDL_Surface *surface); |
|
434 |
||
435 |
static int DX5_AllocDDSurface(_THIS, SDL_Surface *surface, |
|
436 |
LPDIRECTDRAWSURFACE3 requested, Uint32 flag); |
|
437 |
||
438 |
/* Windows message handling functions */ |
|
439 |
static void DX5_RealizePalette(_THIS); |
|
440 |
static void DX5_PaletteChanged(_THIS, HWND window); |
|
441 |
static void DX5_WinPAINT(_THIS, HDC hdc); |
|
442 |
||
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
443 |
/* WinDIB driver functions for manipulating gamma ramps */ |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
444 |
extern int DIB_SetGammaRamp(_THIS, Uint16 *ramp); |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
445 |
extern int DIB_GetGammaRamp(_THIS, Uint16 *ramp); |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
446 |
extern void DIB_QuitGamma(_THIS); |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
447 |
|
0 | 448 |
/* DX5 driver bootstrap functions */ |
449 |
||
450 |
static int DX5_Available(void) |
|
451 |
{ |
|
452 |
HINSTANCE DInputDLL; |
|
453 |
HINSTANCE DDrawDLL; |
|
454 |
int dinput_ok; |
|
455 |
int ddraw_ok; |
|
456 |
||
457 |
/* Version check DINPUT.DLL and DDRAW.DLL (Is DirectX okay?) */ |
|
458 |
dinput_ok = 0; |
|
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
459 |
DInputDLL = LoadLibrary(TEXT("DINPUT.DLL")); |
0 | 460 |
if ( DInputDLL != NULL ) { |
461 |
dinput_ok = 1; |
|
462 |
FreeLibrary(DInputDLL); |
|
463 |
} |
|
464 |
ddraw_ok = 0; |
|
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
465 |
DDrawDLL = LoadLibrary(TEXT("DDRAW.DLL")); |
0 | 466 |
if ( DDrawDLL != NULL ) { |
467 |
HRESULT (WINAPI *DDrawCreate)(GUID *,LPDIRECTDRAW *,IUnknown *); |
|
468 |
LPDIRECTDRAW DDraw; |
|
469 |
||
470 |
/* Try to create a valid DirectDraw object */ |
|
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
471 |
DDrawCreate = (void *)GetProcAddress(DDrawDLL, TEXT("DirectDrawCreate")); |
0 | 472 |
if ( (DDrawCreate != NULL) |
473 |
&& !FAILED(DDrawCreate(NULL, &DDraw, NULL)) ) { |
|
474 |
if ( !FAILED(IDirectDraw_SetCooperativeLevel(DDraw, |
|
475 |
NULL, DDSCL_NORMAL)) ) { |
|
476 |
DDSURFACEDESC desc; |
|
477 |
LPDIRECTDRAWSURFACE DDrawSurf; |
|
478 |
LPDIRECTDRAWSURFACE3 DDrawSurf3; |
|
479 |
||
480 |
/* Try to create a DirectDrawSurface3 object */ |
|
481 |
memset(&desc, 0, sizeof(desc)); |
|
482 |
desc.dwSize = sizeof(desc); |
|
483 |
desc.dwFlags = DDSD_CAPS; |
|
484 |
desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_VIDEOMEMORY; |
|
485 |
if ( !FAILED(IDirectDraw_CreateSurface(DDraw, &desc, |
|
486 |
&DDrawSurf, NULL)) ) { |
|
487 |
if ( !FAILED(IDirectDrawSurface_QueryInterface(DDrawSurf, |
|
488 |
&IID_IDirectDrawSurface3, (LPVOID *)&DDrawSurf3)) ) { |
|
489 |
/* Yay! */ |
|
490 |
ddraw_ok = 1; |
|
491 |
||
492 |
/* Clean up.. */ |
|
493 |
IDirectDrawSurface3_Release(DDrawSurf3); |
|
494 |
} |
|
495 |
IDirectDrawSurface_Release(DDrawSurf); |
|
496 |
} |
|
497 |
} |
|
498 |
IDirectDraw_Release(DDraw); |
|
499 |
} |
|
500 |
FreeLibrary(DDrawDLL); |
|
501 |
} |
|
502 |
return(dinput_ok && ddraw_ok); |
|
503 |
} |
|
504 |
||
505 |
/* Functions for loading the DirectX functions dynamically */ |
|
506 |
static HINSTANCE DDrawDLL = NULL; |
|
507 |
static HINSTANCE DInputDLL = NULL; |
|
508 |
||
509 |
static void DX5_Unload(void) |
|
510 |
{ |
|
511 |
if ( DDrawDLL != NULL ) { |
|
512 |
FreeLibrary(DDrawDLL); |
|
513 |
DDrawCreate = NULL; |
|
514 |
DDrawDLL = NULL; |
|
515 |
} |
|
516 |
if ( DInputDLL != NULL ) { |
|
517 |
FreeLibrary(DInputDLL); |
|
518 |
DInputCreate = NULL; |
|
519 |
DInputDLL = NULL; |
|
520 |
} |
|
521 |
} |
|
522 |
static int DX5_Load(void) |
|
523 |
{ |
|
524 |
int status; |
|
525 |
||
526 |
DX5_Unload(); |
|
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
527 |
DDrawDLL = LoadLibrary(TEXT("DDRAW.DLL")); |
0 | 528 |
if ( DDrawDLL != NULL ) { |
529 |
DDrawCreate = (void *)GetProcAddress(DDrawDLL, |
|
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
530 |
TEXT("DirectDrawCreate")); |
0 | 531 |
} |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
532 |
DInputDLL = LoadLibrary(TEXT("DINPUT.DLL")); |
0 | 533 |
if ( DInputDLL != NULL ) { |
534 |
DInputCreate = (void *)GetProcAddress(DInputDLL, |
|
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
535 |
TEXT("DirectInputCreateA")); |
0 | 536 |
} |
537 |
if ( DDrawDLL && DDrawCreate && DInputDLL && DInputCreate ) { |
|
538 |
status = 0; |
|
539 |
} else { |
|
540 |
DX5_Unload(); |
|
541 |
status = -1; |
|
542 |
} |
|
543 |
return status; |
|
544 |
} |
|
545 |
||
546 |
static void DX5_DeleteDevice(SDL_VideoDevice *this) |
|
547 |
{ |
|
548 |
/* Free DirectDraw object */ |
|
549 |
if ( ddraw2 != NULL ) { |
|
550 |
IDirectDraw2_Release(ddraw2); |
|
551 |
} |
|
552 |
DX5_Unload(); |
|
553 |
if ( this ) { |
|
554 |
if ( this->hidden ) { |
|
555 |
free(this->hidden); |
|
556 |
} |
|
557 |
if ( this->gl_data ) { |
|
558 |
free(this->gl_data); |
|
559 |
} |
|
560 |
free(this); |
|
561 |
} |
|
562 |
} |
|
563 |
||
564 |
static SDL_VideoDevice *DX5_CreateDevice(int devindex) |
|
565 |
{ |
|
566 |
SDL_VideoDevice *device; |
|
567 |
||
568 |
/* Load DirectX */ |
|
569 |
if ( DX5_Load() < 0 ) { |
|
570 |
return(NULL); |
|
571 |
} |
|
572 |
||
573 |
/* Initialize all variables that we clean on shutdown */ |
|
574 |
device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice)); |
|
575 |
if ( device ) { |
|
576 |
memset(device, 0, (sizeof *device)); |
|
577 |
device->hidden = (struct SDL_PrivateVideoData *) |
|
578 |
malloc((sizeof *device->hidden)); |
|
579 |
device->gl_data = (struct SDL_PrivateGLData *) |
|
580 |
malloc((sizeof *device->gl_data)); |
|
581 |
} |
|
582 |
if ( (device == NULL) || (device->hidden == NULL) || |
|
583 |
(device->gl_data == NULL) ) { |
|
584 |
SDL_OutOfMemory(); |
|
585 |
DX5_DeleteDevice(device); |
|
586 |
return(NULL); |
|
587 |
} |
|
588 |
memset(device->hidden, 0, (sizeof *device->hidden)); |
|
589 |
memset(device->gl_data, 0, (sizeof *device->gl_data)); |
|
590 |
||
591 |
/* Set the function pointers */ |
|
592 |
device->VideoInit = DX5_VideoInit; |
|
593 |
device->ListModes = DX5_ListModes; |
|
594 |
device->SetVideoMode = DX5_SetVideoMode; |
|
595 |
device->UpdateMouse = WIN_UpdateMouse; |
|
596 |
device->CreateYUVOverlay = DX5_CreateYUVOverlay; |
|
597 |
device->SetColors = DX5_SetColors; |
|
598 |
device->UpdateRects = NULL; |
|
599 |
device->VideoQuit = DX5_VideoQuit; |
|
600 |
device->AllocHWSurface = DX5_AllocHWSurface; |
|
601 |
device->CheckHWBlit = DX5_CheckHWBlit; |
|
602 |
device->FillHWRect = DX5_FillHWRect; |
|
603 |
device->SetHWColorKey = DX5_SetHWColorKey; |
|
604 |
device->SetHWAlpha = DX5_SetHWAlpha; |
|
605 |
device->LockHWSurface = DX5_LockHWSurface; |
|
606 |
device->UnlockHWSurface = DX5_UnlockHWSurface; |
|
607 |
device->FlipHWSurface = DX5_FlipHWSurface; |
|
608 |
device->FreeHWSurface = DX5_FreeHWSurface; |
|
609 |
device->SetGammaRamp = DX5_SetGammaRamp; |
|
610 |
device->GetGammaRamp = DX5_GetGammaRamp; |
|
611 |
#ifdef HAVE_OPENGL |
|
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
612 |
device->GL_LoadLibrary = WIN_GL_LoadLibrary; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
613 |
device->GL_GetProcAddress = WIN_GL_GetProcAddress; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
614 |
device->GL_GetAttribute = WIN_GL_GetAttribute; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
615 |
device->GL_MakeCurrent = WIN_GL_MakeCurrent; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
616 |
device->GL_SwapBuffers = WIN_GL_SwapBuffers; |
0 | 617 |
#endif |
618 |
device->SetCaption = WIN_SetWMCaption; |
|
619 |
device->SetIcon = WIN_SetWMIcon; |
|
620 |
device->IconifyWindow = WIN_IconifyWindow; |
|
621 |
device->GrabInput = WIN_GrabInput; |
|
622 |
device->GetWMInfo = WIN_GetWMInfo; |
|
623 |
device->FreeWMCursor = WIN_FreeWMCursor; |
|
624 |
device->CreateWMCursor = WIN_CreateWMCursor; |
|
625 |
device->ShowWMCursor = WIN_ShowWMCursor; |
|
626 |
device->WarpWMCursor = WIN_WarpWMCursor; |
|
627 |
device->CheckMouseMode = WIN_CheckMouseMode; |
|
628 |
device->InitOSKeymap = DX5_InitOSKeymap; |
|
629 |
device->PumpEvents = DX5_PumpEvents; |
|
630 |
||
631 |
/* Set up the windows message handling functions */ |
|
632 |
WIN_RealizePalette = DX5_RealizePalette; |
|
633 |
WIN_PaletteChanged = DX5_PaletteChanged; |
|
634 |
WIN_WinPAINT = DX5_WinPAINT; |
|
635 |
HandleMessage = DX5_HandleMessage; |
|
636 |
||
637 |
device->free = DX5_DeleteDevice; |
|
638 |
||
639 |
/* We're finally ready */ |
|
640 |
return device; |
|
641 |
} |
|
642 |
||
643 |
VideoBootStrap DIRECTX_bootstrap = { |
|
644 |
"directx", "Win95/98/2000 DirectX", |
|
645 |
DX5_Available, DX5_CreateDevice |
|
646 |
}; |
|
647 |
||
648 |
static HRESULT WINAPI EnumModes2(DDSURFACEDESC *desc, VOID *udata) |
|
649 |
{ |
|
650 |
SDL_VideoDevice *this = (SDL_VideoDevice *)udata; |
|
651 |
struct DX5EnumRect *enumrect; |
|
652 |
#if defined(NONAMELESSUNION) |
|
653 |
int bpp = desc->ddpfPixelFormat.u1.dwRGBBitCount; |
|
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
654 |
int refreshRate = desc->u2.dwRefreshRate; |
0 | 655 |
#else |
656 |
int bpp = desc->ddpfPixelFormat.dwRGBBitCount; |
|
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
657 |
int refreshRate = desc->dwRefreshRate; |
0 | 658 |
#endif |
659 |
||
660 |
switch (bpp) { |
|
661 |
case 8: |
|
662 |
case 16: |
|
663 |
case 24: |
|
664 |
case 32: |
|
665 |
bpp /= 8; --bpp; |
|
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
666 |
if ( enumlists[bpp] && |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
667 |
enumlists[bpp]->r.w == (Uint16)desc->dwWidth && |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
668 |
enumlists[bpp]->r.h == (Uint16)desc->dwHeight ) { |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
669 |
if ( refreshRate > enumlists[bpp]->refreshRate && |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
670 |
refreshRate <= 85 /* safe value? */ ) { |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
671 |
enumlists[bpp]->refreshRate = refreshRate; |
815
6176f9a0d61a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
809
diff
changeset
|
672 |
#ifdef DDRAW_DEBUG |
6176f9a0d61a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
809
diff
changeset
|
673 |
fprintf(stderr, "New refresh rate for %d bpp: %dx%d at %d Hz\n", (bpp+1)*8, (int)desc->dwWidth, (int)desc->dwHeight, refreshRate); |
6176f9a0d61a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
809
diff
changeset
|
674 |
#endif |
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
675 |
} |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
676 |
break; |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
677 |
} |
0 | 678 |
++SDL_nummodes[bpp]; |
679 |
enumrect = (struct DX5EnumRect*)malloc(sizeof(struct DX5EnumRect)); |
|
680 |
if ( !enumrect ) { |
|
681 |
SDL_OutOfMemory(); |
|
682 |
return(DDENUMRET_CANCEL); |
|
683 |
} |
|
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
684 |
enumrect->refreshRate = refreshRate; |
0 | 685 |
enumrect->r.x = 0; |
686 |
enumrect->r.y = 0; |
|
687 |
enumrect->r.w = (Uint16)desc->dwWidth; |
|
688 |
enumrect->r.h = (Uint16)desc->dwHeight; |
|
689 |
enumrect->next = enumlists[bpp]; |
|
690 |
enumlists[bpp] = enumrect; |
|
815
6176f9a0d61a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
809
diff
changeset
|
691 |
#ifdef DDRAW_DEBUG |
6176f9a0d61a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
809
diff
changeset
|
692 |
fprintf(stderr, "New mode for %d bpp: %dx%d at %d Hz\n", (bpp+1)*8, (int)desc->dwWidth, (int)desc->dwHeight, refreshRate); |
6176f9a0d61a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
809
diff
changeset
|
693 |
#endif |
0 | 694 |
break; |
695 |
} |
|
696 |
||
697 |
return(DDENUMRET_OK); |
|
698 |
} |
|
699 |
||
700 |
void SetDDerror(const char *function, int code) |
|
701 |
{ |
|
702 |
static char *error; |
|
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
703 |
static char errbuf[1024]; |
0 | 704 |
|
705 |
errbuf[0] = 0; |
|
706 |
switch (code) { |
|
707 |
case DDERR_GENERIC: |
|
708 |
error = "Undefined error!"; |
|
709 |
break; |
|
710 |
case DDERR_EXCEPTION: |
|
711 |
error = "Exception encountered"; |
|
712 |
break; |
|
713 |
case DDERR_INVALIDOBJECT: |
|
714 |
error = "Invalid object"; |
|
715 |
break; |
|
716 |
case DDERR_INVALIDPARAMS: |
|
717 |
error = "Invalid parameters"; |
|
718 |
break; |
|
719 |
case DDERR_NOTFOUND: |
|
720 |
error = "Object not found"; |
|
721 |
break; |
|
722 |
case DDERR_INVALIDRECT: |
|
723 |
error = "Invalid rectangle"; |
|
724 |
break; |
|
725 |
case DDERR_INVALIDCAPS: |
|
726 |
error = "Invalid caps member"; |
|
727 |
break; |
|
728 |
case DDERR_INVALIDPIXELFORMAT: |
|
729 |
error = "Invalid pixel format"; |
|
730 |
break; |
|
731 |
case DDERR_OUTOFMEMORY: |
|
732 |
error = "Out of memory"; |
|
733 |
break; |
|
734 |
case DDERR_OUTOFVIDEOMEMORY: |
|
735 |
error = "Out of video memory"; |
|
736 |
break; |
|
737 |
case DDERR_SURFACEBUSY: |
|
738 |
error = "Surface busy"; |
|
739 |
break; |
|
740 |
case DDERR_SURFACELOST: |
|
741 |
error = "Surface was lost"; |
|
742 |
break; |
|
743 |
case DDERR_WASSTILLDRAWING: |
|
744 |
error = "DirectDraw is still drawing"; |
|
745 |
break; |
|
746 |
case DDERR_INVALIDSURFACETYPE: |
|
747 |
error = "Invalid surface type"; |
|
748 |
break; |
|
749 |
case DDERR_NOEXCLUSIVEMODE: |
|
750 |
error = "Not in exclusive access mode"; |
|
751 |
break; |
|
752 |
case DDERR_NOPALETTEATTACHED: |
|
753 |
error = "No palette attached"; |
|
754 |
break; |
|
755 |
case DDERR_NOPALETTEHW: |
|
756 |
error = "No palette hardware"; |
|
757 |
break; |
|
758 |
case DDERR_NOT8BITCOLOR: |
|
759 |
error = "Not 8-bit color"; |
|
760 |
break; |
|
761 |
case DDERR_EXCLUSIVEMODEALREADYSET: |
|
762 |
error = "Exclusive mode was already set"; |
|
763 |
break; |
|
764 |
case DDERR_HWNDALREADYSET: |
|
765 |
error = "Window handle already set"; |
|
766 |
break; |
|
767 |
case DDERR_HWNDSUBCLASSED: |
|
768 |
error = "Window handle is subclassed"; |
|
769 |
break; |
|
770 |
case DDERR_NOBLTHW: |
|
771 |
error = "No blit hardware"; |
|
772 |
break; |
|
773 |
case DDERR_IMPLICITLYCREATED: |
|
774 |
error = "Surface was implicitly created"; |
|
775 |
break; |
|
776 |
case DDERR_INCOMPATIBLEPRIMARY: |
|
777 |
error = "Incompatible primary surface"; |
|
778 |
break; |
|
779 |
case DDERR_NOCOOPERATIVELEVELSET: |
|
780 |
error = "No cooperative level set"; |
|
781 |
break; |
|
782 |
case DDERR_NODIRECTDRAWHW: |
|
783 |
error = "No DirectDraw hardware"; |
|
784 |
break; |
|
785 |
case DDERR_NOEMULATION: |
|
786 |
error = "No emulation available"; |
|
787 |
break; |
|
788 |
case DDERR_NOFLIPHW: |
|
789 |
error = "No flip hardware"; |
|
790 |
break; |
|
791 |
case DDERR_NOTFLIPPABLE: |
|
792 |
error = "Surface not flippable"; |
|
793 |
break; |
|
794 |
case DDERR_PRIMARYSURFACEALREADYEXISTS: |
|
795 |
error = "Primary surface already exists"; |
|
796 |
break; |
|
797 |
case DDERR_UNSUPPORTEDMODE: |
|
798 |
error = "Unsupported mode"; |
|
799 |
break; |
|
800 |
case DDERR_WRONGMODE: |
|
801 |
error = "Surface created in different mode"; |
|
802 |
break; |
|
803 |
case DDERR_UNSUPPORTED: |
|
804 |
error = "Operation not supported"; |
|
805 |
break; |
|
806 |
case E_NOINTERFACE: |
|
807 |
error = "Interface not present"; |
|
808 |
break; |
|
809 |
default: |
|
810 |
sprintf(errbuf, "%s: Unknown DirectDraw error: 0x%x", |
|
811 |
function, code); |
|
812 |
break; |
|
813 |
} |
|
814 |
if ( ! errbuf[0] ) { |
|
815 |
sprintf(errbuf, "%s: %s", function, error); |
|
816 |
} |
|
817 |
SDL_SetError("%s", errbuf); |
|
818 |
return; |
|
819 |
} |
|
820 |
||
821 |
||
822 |
static int DX5_UpdateVideoInfo(_THIS) |
|
823 |
{ |
|
824 |
/* This needs to be DDCAPS_DX5 for the DirectDraw2 interface */ |
|
825 |
#if DIRECTDRAW_VERSION <= 0x300 |
|
826 |
#error Your version of DirectX must be greater than or equal to 5.0 |
|
827 |
#endif |
|
334
f65715bd8ad8
Fixed DirectX fullscreen gamma control (thanks John!)
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
828 |
#ifndef IDirectDrawGammaControl_SetGammaRamp |
0 | 829 |
/*if gamma is undefined then we really have directx <= 0x500*/ |
830 |
DDCAPS DDCaps; |
|
831 |
#else |
|
832 |
DDCAPS_DX5 DDCaps; |
|
833 |
#endif |
|
834 |
HRESULT result; |
|
835 |
||
836 |
/* Fill in our hardware acceleration capabilities */ |
|
837 |
memset(&DDCaps, 0, sizeof(DDCaps)); |
|
838 |
DDCaps.dwSize = sizeof(DDCaps); |
|
839 |
result = IDirectDraw2_GetCaps(ddraw2, (DDCAPS *)&DDCaps, NULL); |
|
840 |
if ( result != DD_OK ) { |
|
841 |
SetDDerror("DirectDraw2::GetCaps", result); |
|
842 |
return(-1); |
|
843 |
} |
|
844 |
this->info.hw_available = 1; |
|
845 |
if ( (DDCaps.dwCaps & DDCAPS_BLT) == DDCAPS_BLT ) { |
|
846 |
this->info.blit_hw = 1; |
|
847 |
} |
|
848 |
if ( ((DDCaps.dwCaps & DDCAPS_COLORKEY) == DDCAPS_COLORKEY) && |
|
849 |
((DDCaps.dwCKeyCaps & DDCKEYCAPS_SRCBLT) == DDCKEYCAPS_SRCBLT) ) { |
|
850 |
this->info.blit_hw_CC = 1; |
|
851 |
} |
|
852 |
if ( (DDCaps.dwCaps & DDCAPS_ALPHA) == DDCAPS_ALPHA ) { |
|
853 |
/* This is only for alpha channel, and DirectX 6 |
|
854 |
doesn't support 2D alpha blits yet, so set it 0 |
|
855 |
*/ |
|
856 |
this->info.blit_hw_A = 0; |
|
857 |
} |
|
858 |
if ( (DDCaps.dwCaps & DDCAPS_CANBLTSYSMEM) == DDCAPS_CANBLTSYSMEM ) { |
|
859 |
this->info.blit_sw = 1; |
|
860 |
/* This isn't necessarily true, but the HEL will cover us */ |
|
861 |
this->info.blit_sw_CC = this->info.blit_hw_CC; |
|
862 |
this->info.blit_sw_A = this->info.blit_hw_A; |
|
863 |
} |
|
864 |
if ( (DDCaps.dwCaps & DDCAPS_BLTCOLORFILL) == DDCAPS_BLTCOLORFILL ) { |
|
865 |
this->info.blit_fill = 1; |
|
866 |
} |
|
867 |
||
868 |
/* Find out how much video memory is available */ |
|
869 |
{ DDSCAPS ddsCaps; |
|
870 |
DWORD total_mem; |
|
871 |
ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY; |
|
872 |
result = IDirectDraw2_GetAvailableVidMem(ddraw2, |
|
873 |
&ddsCaps, &total_mem, NULL); |
|
874 |
if ( result != DD_OK ) { |
|
875 |
total_mem = DDCaps.dwVidMemTotal; |
|
876 |
} |
|
877 |
this->info.video_mem = total_mem/1024; |
|
878 |
} |
|
879 |
return(0); |
|
880 |
} |
|
881 |
||
882 |
int DX5_VideoInit(_THIS, SDL_PixelFormat *vformat) |
|
883 |
{ |
|
884 |
HRESULT result; |
|
885 |
LPDIRECTDRAW ddraw; |
|
886 |
int i, j; |
|
887 |
HDC hdc; |
|
888 |
||
889 |
/* Intialize everything */ |
|
890 |
ddraw2 = NULL; |
|
891 |
SDL_primary = NULL; |
|
892 |
SDL_clipper = NULL; |
|
893 |
SDL_palette = NULL; |
|
894 |
for ( i=0; i<NUM_MODELISTS; ++i ) { |
|
895 |
SDL_nummodes[i] = 0; |
|
896 |
SDL_modelist[i] = NULL; |
|
897 |
SDL_modeindex[i] = 0; |
|
898 |
} |
|
899 |
colorchange_expected = 0; |
|
900 |
||
901 |
/* Create the window */ |
|
902 |
if ( DX5_CreateWindow(this) < 0 ) { |
|
903 |
return(-1); |
|
904 |
} |
|
169
8039a5b760b9
Allow building SDL on Windows without audio support
Sam Lantinga <slouken@libsdl.org>
parents:
1
diff
changeset
|
905 |
#ifndef DISABLE_AUDIO |
0 | 906 |
DX5_SoundFocus(SDL_Window); |
169
8039a5b760b9
Allow building SDL on Windows without audio support
Sam Lantinga <slouken@libsdl.org>
parents:
1
diff
changeset
|
907 |
#endif |
0 | 908 |
|
909 |
/* Create the DirectDraw object */ |
|
910 |
result = DDrawCreate(NULL, &ddraw, NULL); |
|
911 |
if ( result != DD_OK ) { |
|
912 |
SetDDerror("DirectDrawCreate", result); |
|
913 |
return(-1); |
|
914 |
} |
|
915 |
result = IDirectDraw_QueryInterface(ddraw, &IID_IDirectDraw2, |
|
916 |
(LPVOID *)&ddraw2); |
|
917 |
IDirectDraw_Release(ddraw); |
|
918 |
if ( result != DD_OK ) { |
|
919 |
SetDDerror("DirectDraw::QueryInterface", result); |
|
920 |
return(-1); |
|
921 |
} |
|
922 |
||
923 |
/* Determine the screen depth */ |
|
924 |
hdc = GetDC(SDL_Window); |
|
925 |
vformat->BitsPerPixel = GetDeviceCaps(hdc,PLANES) * |
|
926 |
GetDeviceCaps(hdc,BITSPIXEL); |
|
927 |
ReleaseDC(SDL_Window, hdc); |
|
928 |
||
929 |
/* Enumerate the available fullscreen modes */ |
|
930 |
for ( i=0; i<NUM_MODELISTS; ++i ) |
|
931 |
enumlists[i] = NULL; |
|
932 |
||
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
933 |
result = IDirectDraw2_EnumDisplayModes(ddraw2,DDEDM_REFRESHRATES,NULL,this,EnumModes2); |
0 | 934 |
if ( result != DD_OK ) { |
935 |
SetDDerror("DirectDraw2::EnumDisplayModes", result); |
|
936 |
return(-1); |
|
937 |
} |
|
938 |
for ( i=0; i<NUM_MODELISTS; ++i ) { |
|
939 |
struct DX5EnumRect *rect; |
|
940 |
SDL_modelist[i] = (SDL_Rect **) |
|
941 |
malloc((SDL_nummodes[i]+1)*sizeof(SDL_Rect *)); |
|
942 |
if ( SDL_modelist[i] == NULL ) { |
|
943 |
SDL_OutOfMemory(); |
|
944 |
return(-1); |
|
945 |
} |
|
946 |
for ( j = 0, rect = enumlists[i]; rect; ++j, rect = rect->next ) { |
|
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
947 |
SDL_modelist[i][j] = &rect->r; |
0 | 948 |
} |
949 |
SDL_modelist[i][j] = NULL; |
|
950 |
} |
|
951 |
||
952 |
/* Fill in some window manager capabilities */ |
|
953 |
this->info.wm_available = 1; |
|
954 |
||
955 |
/* Fill in the video hardware capabilities */ |
|
956 |
DX5_UpdateVideoInfo(this); |
|
957 |
||
958 |
return(0); |
|
959 |
} |
|
960 |
||
961 |
SDL_Rect **DX5_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags) |
|
962 |
{ |
|
963 |
int bpp; |
|
964 |
||
965 |
bpp = format->BitsPerPixel; |
|
966 |
if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { |
|
967 |
/* FIXME: No support for 1 bpp or 4 bpp formats */ |
|
968 |
switch (bpp) { /* Does windows support other BPP? */ |
|
969 |
case 8: |
|
970 |
case 16: |
|
971 |
case 24: |
|
972 |
case 32: |
|
973 |
bpp = (bpp/8)-1; |
|
974 |
if ( SDL_nummodes[bpp] > 0 ) |
|
975 |
return(SDL_modelist[bpp]); |
|
976 |
/* Fall through */ |
|
977 |
default: |
|
978 |
return((SDL_Rect **)0); |
|
979 |
} |
|
980 |
} else { |
|
981 |
if ( this->screen->format->BitsPerPixel == bpp ) { |
|
982 |
return((SDL_Rect **)-1); |
|
983 |
} else { |
|
984 |
return((SDL_Rect **)0); |
|
985 |
} |
|
986 |
} |
|
987 |
} |
|
988 |
||
989 |
/* Various screen update functions available */ |
|
990 |
static void DX5_WindowUpdate(_THIS, int numrects, SDL_Rect *rects); |
|
991 |
static void DX5_DirectUpdate(_THIS, int numrects, SDL_Rect *rects); |
|
992 |
||
993 |
SDL_Surface *DX5_SetVideoMode(_THIS, SDL_Surface *current, |
|
994 |
int width, int height, int bpp, Uint32 flags) |
|
995 |
{ |
|
996 |
SDL_Surface *video; |
|
997 |
HRESULT result; |
|
998 |
DWORD sharemode; |
|
999 |
DWORD style; |
|
1000 |
const DWORD directstyle = |
|
1001 |
(WS_POPUP); |
|
1002 |
const DWORD windowstyle = |
|
1003 |
(WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX); |
|
1004 |
const DWORD resizestyle = |
|
1005 |
(WS_THICKFRAME|WS_MAXIMIZEBOX); |
|
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1006 |
int windowX, windowY; |
0 | 1007 |
DDSURFACEDESC ddsd; |
1008 |
LPDIRECTDRAWSURFACE dd_surface1; |
|
1009 |
LPDIRECTDRAWSURFACE3 dd_surface3; |
|
1010 |
||
1011 |
#ifdef DDRAW_DEBUG |
|
1012 |
fprintf(stderr, "Setting %dx%dx%d video mode\n", width, height, bpp); |
|
1013 |
#endif |
|
1014 |
/* Clean up any previous DirectDraw surfaces */ |
|
1015 |
if ( current->hwdata ) { |
|
1016 |
this->FreeHWSurface(this, current); |
|
1017 |
current->hwdata = NULL; |
|
1018 |
} |
|
1019 |
if ( SDL_primary != NULL ) { |
|
1020 |
IDirectDrawSurface3_Release(SDL_primary); |
|
1021 |
SDL_primary = NULL; |
|
1022 |
} |
|
1023 |
||
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
1024 |
#ifndef NO_CHANGEDISPLAYSETTINGS |
0 | 1025 |
/* Unset any previous OpenGL fullscreen mode */ |
1026 |
if ( (current->flags & (SDL_OPENGL|SDL_FULLSCREEN)) == |
|
1027 |
(SDL_OPENGL|SDL_FULLSCREEN) ) { |
|
1028 |
ChangeDisplaySettings(NULL, 0); |
|
1029 |
} |
|
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
1030 |
#endif |
0 | 1031 |
|
1032 |
/* Clean up any GL context that may be hanging around */ |
|
1033 |
if ( current->flags & SDL_OPENGL ) { |
|
1034 |
WIN_GL_ShutDown(this); |
|
1035 |
} |
|
1036 |
||
1037 |
/* If we are setting a GL mode, use GDI, not DirectX (yuck) */ |
|
1038 |
if ( flags & SDL_OPENGL ) { |
|
1039 |
RECT bounds; |
|
1040 |
int x, y; |
|
1041 |
Uint32 Rmask, Gmask, Bmask; |
|
1042 |
||
1043 |
/* Recalculate the bitmasks if necessary */ |
|
1044 |
if ( bpp == current->format->BitsPerPixel ) { |
|
1045 |
video = current; |
|
1046 |
} else { |
|
1047 |
switch (bpp) { |
|
1048 |
case 15: |
|
1049 |
case 16: |
|
1050 |
if ( 0 /*DIB_SussScreenDepth() == 15*/ ) { |
|
1051 |
/* 5-5-5 */ |
|
1052 |
Rmask = 0x00007c00; |
|
1053 |
Gmask = 0x000003e0; |
|
1054 |
Bmask = 0x0000001f; |
|
1055 |
} else { |
|
1056 |
/* 5-6-5 */ |
|
1057 |
Rmask = 0x0000f800; |
|
1058 |
Gmask = 0x000007e0; |
|
1059 |
Bmask = 0x0000001f; |
|
1060 |
} |
|
1061 |
break; |
|
1062 |
case 24: |
|
1063 |
case 32: |
|
1064 |
/* GDI defined as 8-8-8 */ |
|
1065 |
Rmask = 0x00ff0000; |
|
1066 |
Gmask = 0x0000ff00; |
|
1067 |
Bmask = 0x000000ff; |
|
1068 |
break; |
|
1069 |
default: |
|
1070 |
Rmask = 0x00000000; |
|
1071 |
Gmask = 0x00000000; |
|
1072 |
Bmask = 0x00000000; |
|
1073 |
break; |
|
1074 |
} |
|
1075 |
video = SDL_CreateRGBSurface(SDL_SWSURFACE, 0, 0, bpp, |
|
1076 |
Rmask, Gmask, Bmask, 0); |
|
1077 |
if ( video == NULL ) { |
|
1078 |
SDL_OutOfMemory(); |
|
1079 |
return(NULL); |
|
1080 |
} |
|
1081 |
} |
|
1082 |
||
1083 |
/* Fill in part of the video surface */ |
|
1084 |
video->flags = 0; /* Clear flags */ |
|
1085 |
video->w = width; |
|
1086 |
video->h = height; |
|
1087 |
video->pitch = SDL_CalculatePitch(video); |
|
1088 |
||
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
1089 |
#ifndef NO_CHANGEDISPLAYSETTINGS |
0 | 1090 |
/* Set fullscreen mode if appropriate. |
1091 |
Ugh, since our list of valid video modes comes from |
|
1092 |
the DirectX driver, we may not actually be able to |
|
1093 |
change to the desired resolution here. |
|
1094 |
FIXME: Should we do a closest match? |
|
1095 |
*/ |
|
1096 |
if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { |
|
1097 |
DEVMODE settings; |
|
1098 |
||
1099 |
memset(&settings, 0, sizeof(DEVMODE)); |
|
1100 |
settings.dmSize = sizeof(DEVMODE); |
|
1101 |
settings.dmBitsPerPel = video->format->BitsPerPixel; |
|
1102 |
settings.dmPelsWidth = width; |
|
1103 |
settings.dmPelsHeight = height; |
|
1104 |
settings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL; |
|
1105 |
if ( ChangeDisplaySettings(&settings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL ) { |
|
1106 |
video->flags |= SDL_FULLSCREEN; |
|
304
ec53caed9fb2
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
1107 |
SDL_fullscreen_mode = settings; |
0 | 1108 |
} |
1109 |
} |
|
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
1110 |
#endif /* !NO_CHANGEDISPLAYSETTINGS */ |
0 | 1111 |
|
1112 |
style = GetWindowLong(SDL_Window, GWL_STYLE); |
|
1113 |
style &= ~(resizestyle|WS_MAXIMIZE); |
|
448
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
443
diff
changeset
|
1114 |
if ( video->flags & SDL_FULLSCREEN ) { |
0 | 1115 |
style &= ~windowstyle; |
1116 |
style |= directstyle; |
|
1117 |
} else { |
|
1118 |
if ( flags & SDL_NOFRAME ) { |
|
1119 |
style &= ~windowstyle; |
|
1120 |
style |= directstyle; |
|
1121 |
video->flags |= SDL_NOFRAME; |
|
1122 |
} else { |
|
1123 |
style &= ~directstyle; |
|
1124 |
style |= windowstyle; |
|
1125 |
if ( flags & SDL_RESIZABLE ) { |
|
1126 |
style |= resizestyle; |
|
1127 |
video->flags |= SDL_RESIZABLE; |
|
1128 |
} |
|
1129 |
} |
|
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
1130 |
#if WS_MAXIMIZE |
0 | 1131 |
if (IsZoomed(SDL_Window)) style |= WS_MAXIMIZE; |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
1132 |
#endif |
0 | 1133 |
} |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1134 |
|
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1135 |
/* DJM: Don't piss of anyone who has setup his own window */ |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1136 |
if ( SDL_windowid == NULL ) |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1137 |
SetWindowLong(SDL_Window, GWL_STYLE, style); |
0 | 1138 |
|
1139 |
/* Resize the window (copied from SDL WinDIB driver) */ |
|
1140 |
if ( SDL_windowid == NULL ) { |
|
448
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
443
diff
changeset
|
1141 |
HWND top; |
0 | 1142 |
UINT swp_flags; |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1143 |
const char *window = getenv("SDL_VIDEO_WINDOW_POS"); |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1144 |
const char *center = getenv("SDL_VIDEO_CENTERED"); |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1145 |
|
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1146 |
if ( !SDL_windowX && !SDL_windowY ) { |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1147 |
if ( window ) { |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1148 |
if ( sscanf(window, "%d,%d", &x, &y) == 2 ) { |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1149 |
SDL_windowX = x; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1150 |
SDL_windowY = y; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1151 |
} |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1152 |
if ( strcmp(window, "center") == 0 ) { |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1153 |
center = window; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1154 |
window = NULL; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1155 |
} |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1156 |
} |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1157 |
} |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1158 |
swp_flags = (SWP_NOCOPYBITS | SWP_SHOWWINDOW); |
0 | 1159 |
|
1160 |
SDL_resizing = 1; |
|
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1161 |
bounds.left = SDL_windowX; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1162 |
bounds.top = SDL_windowY; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1163 |
bounds.right = SDL_windowX+video->w; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1164 |
bounds.bottom = SDL_windowY+video->h; |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
1165 |
AdjustWindowRectEx(&bounds, GetWindowLong(SDL_Window, GWL_STYLE), FALSE, 0); |
0 | 1166 |
width = bounds.right-bounds.left; |
1167 |
height = bounds.bottom-bounds.top; |
|
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1168 |
if ( (flags & SDL_FULLSCREEN) ) { |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1169 |
x = (GetSystemMetrics(SM_CXSCREEN)-width)/2; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1170 |
y = (GetSystemMetrics(SM_CYSCREEN)-height)/2; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1171 |
} else if ( SDL_windowX || SDL_windowY || window ) { |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
|