Mercurial > sdl-ios-xcode
annotate src/video/windx5/SDL_dx5video.c @ 4085:51486c979189 SDL-1.2
> Hi Ryan,
> I checked the list you linked to, but did not see any reference to whether
> the Win32 window centering bug was fixed... Has that been addressed at all?
> I refer to the bug where, unless one has globally set the
> SDL_WINDOW_CENTERED variable in the OS, only the 1st window that is created
> will be centered. Subsequent calls to SetVideoMode will create a window tha
t
> shares the same upper-left corner location.
I'm working on that now, thanks for reporting it. What I'm doing is if the
width and height are the same, I'm leaving the window position alone, but if
they're different they will respect the positioning environment variables.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 20 Jul 2007 03:25:40 +0000 |
parents | c75679dce60c |
children | 7cd5a59480a4 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1295
diff
changeset
|
3 Copyright (C) 1997-2006 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1295
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1295
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 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 | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1295
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1295
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1295
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1295
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 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 */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
24 #include "directx.h" | |
25 | |
26 /* Not yet in the mingw32 cross-compile headers */ | |
27 #ifndef CDS_FULLSCREEN | |
28 #define CDS_FULLSCREEN 4 | |
29 #endif | |
30 | |
31 #include "SDL_timer.h" | |
32 #include "SDL_events.h" | |
33 #include "SDL_syswm.h" | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
34 #include "../SDL_sysvideo.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
35 #include "../SDL_blit.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
36 #include "../SDL_pixels_c.h" |
0 | 37 #include "SDL_dx5video.h" |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
38 #include "../wincommon/SDL_syswm_c.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
39 #include "../wincommon/SDL_sysmouse_c.h" |
0 | 40 #include "SDL_dx5events_c.h" |
41 #include "SDL_dx5yuv_c.h" | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
42 #include "../wincommon/SDL_wingl_c.h" |
0 | 43 |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
44 #ifdef _WIN32_WCE |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
45 #define NO_CHANGEDISPLAYSETTINGS |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
46 #endif |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
47 #ifndef WS_MAXIMIZE |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
48 #define WS_MAXIMIZE 0 |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
49 #endif |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
50 #ifndef SWP_NOCOPYBITS |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
51 #define SWP_NOCOPYBITS 0 |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
52 #endif |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
53 #ifndef PC_NOCOLLAPSE |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
54 #define PC_NOCOLLAPSE 0 |
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 |
0 | 57 |
58 /* DirectX function pointers for video and events */ | |
59 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
|
60 HRESULT (WINAPI *DInputCreate)(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUT *ppDI, LPUNKNOWN punkOuter); |
0 | 61 |
62 /* This is the rect EnumModes2 uses */ | |
63 struct DX5EnumRect { | |
64 SDL_Rect r; | |
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
65 int refreshRate; |
0 | 66 struct DX5EnumRect* next; |
67 }; | |
68 static struct DX5EnumRect *enumlists[NUM_MODELISTS]; | |
69 | |
70 /* | |
71 * Experimentally determined values for c_cfDI* constants used in DirectX 5.0 | |
72 */ | |
73 | |
74 /* Keyboard */ | |
75 | |
76 static DIOBJECTDATAFORMAT KBD_fmt[] = { | |
77 { &GUID_Key, 0, 0x8000000C, 0x00000000 }, | |
78 { &GUID_Key, 1, 0x8000010C, 0x00000000 }, | |
79 { &GUID_Key, 2, 0x8000020C, 0x00000000 }, | |
80 { &GUID_Key, 3, 0x8000030C, 0x00000000 }, | |
81 { &GUID_Key, 4, 0x8000040C, 0x00000000 }, | |
82 { &GUID_Key, 5, 0x8000050C, 0x00000000 }, | |
83 { &GUID_Key, 6, 0x8000060C, 0x00000000 }, | |
84 { &GUID_Key, 7, 0x8000070C, 0x00000000 }, | |
85 { &GUID_Key, 8, 0x8000080C, 0x00000000 }, | |
86 { &GUID_Key, 9, 0x8000090C, 0x00000000 }, | |
87 { &GUID_Key, 10, 0x80000A0C, 0x00000000 }, | |
88 { &GUID_Key, 11, 0x80000B0C, 0x00000000 }, | |
89 { &GUID_Key, 12, 0x80000C0C, 0x00000000 }, | |
90 { &GUID_Key, 13, 0x80000D0C, 0x00000000 }, | |
91 { &GUID_Key, 14, 0x80000E0C, 0x00000000 }, | |
92 { &GUID_Key, 15, 0x80000F0C, 0x00000000 }, | |
93 { &GUID_Key, 16, 0x8000100C, 0x00000000 }, | |
94 { &GUID_Key, 17, 0x8000110C, 0x00000000 }, | |
95 { &GUID_Key, 18, 0x8000120C, 0x00000000 }, | |
96 { &GUID_Key, 19, 0x8000130C, 0x00000000 }, | |
97 { &GUID_Key, 20, 0x8000140C, 0x00000000 }, | |
98 { &GUID_Key, 21, 0x8000150C, 0x00000000 }, | |
99 { &GUID_Key, 22, 0x8000160C, 0x00000000 }, | |
100 { &GUID_Key, 23, 0x8000170C, 0x00000000 }, | |
101 { &GUID_Key, 24, 0x8000180C, 0x00000000 }, | |
102 { &GUID_Key, 25, 0x8000190C, 0x00000000 }, | |
103 { &GUID_Key, 26, 0x80001A0C, 0x00000000 }, | |
104 { &GUID_Key, 27, 0x80001B0C, 0x00000000 }, | |
105 { &GUID_Key, 28, 0x80001C0C, 0x00000000 }, | |
106 { &GUID_Key, 29, 0x80001D0C, 0x00000000 }, | |
107 { &GUID_Key, 30, 0x80001E0C, 0x00000000 }, | |
108 { &GUID_Key, 31, 0x80001F0C, 0x00000000 }, | |
109 { &GUID_Key, 32, 0x8000200C, 0x00000000 }, | |
110 { &GUID_Key, 33, 0x8000210C, 0x00000000 }, | |
111 { &GUID_Key, 34, 0x8000220C, 0x00000000 }, | |
112 { &GUID_Key, 35, 0x8000230C, 0x00000000 }, | |
113 { &GUID_Key, 36, 0x8000240C, 0x00000000 }, | |
114 { &GUID_Key, 37, 0x8000250C, 0x00000000 }, | |
115 { &GUID_Key, 38, 0x8000260C, 0x00000000 }, | |
116 { &GUID_Key, 39, 0x8000270C, 0x00000000 }, | |
117 { &GUID_Key, 40, 0x8000280C, 0x00000000 }, | |
118 { &GUID_Key, 41, 0x8000290C, 0x00000000 }, | |
119 { &GUID_Key, 42, 0x80002A0C, 0x00000000 }, | |
120 { &GUID_Key, 43, 0x80002B0C, 0x00000000 }, | |
121 { &GUID_Key, 44, 0x80002C0C, 0x00000000 }, | |
122 { &GUID_Key, 45, 0x80002D0C, 0x00000000 }, | |
123 { &GUID_Key, 46, 0x80002E0C, 0x00000000 }, | |
124 { &GUID_Key, 47, 0x80002F0C, 0x00000000 }, | |
125 { &GUID_Key, 48, 0x8000300C, 0x00000000 }, | |
126 { &GUID_Key, 49, 0x8000310C, 0x00000000 }, | |
127 { &GUID_Key, 50, 0x8000320C, 0x00000000 }, | |
128 { &GUID_Key, 51, 0x8000330C, 0x00000000 }, | |
129 { &GUID_Key, 52, 0x8000340C, 0x00000000 }, | |
130 { &GUID_Key, 53, 0x8000350C, 0x00000000 }, | |
131 { &GUID_Key, 54, 0x8000360C, 0x00000000 }, | |
132 { &GUID_Key, 55, 0x8000370C, 0x00000000 }, | |
133 { &GUID_Key, 56, 0x8000380C, 0x00000000 }, | |
134 { &GUID_Key, 57, 0x8000390C, 0x00000000 }, | |
135 { &GUID_Key, 58, 0x80003A0C, 0x00000000 }, | |
136 { &GUID_Key, 59, 0x80003B0C, 0x00000000 }, | |
137 { &GUID_Key, 60, 0x80003C0C, 0x00000000 }, | |
138 { &GUID_Key, 61, 0x80003D0C, 0x00000000 }, | |
139 { &GUID_Key, 62, 0x80003E0C, 0x00000000 }, | |
140 { &GUID_Key, 63, 0x80003F0C, 0x00000000 }, | |
141 { &GUID_Key, 64, 0x8000400C, 0x00000000 }, | |
142 { &GUID_Key, 65, 0x8000410C, 0x00000000 }, | |
143 { &GUID_Key, 66, 0x8000420C, 0x00000000 }, | |
144 { &GUID_Key, 67, 0x8000430C, 0x00000000 }, | |
145 { &GUID_Key, 68, 0x8000440C, 0x00000000 }, | |
146 { &GUID_Key, 69, 0x8000450C, 0x00000000 }, | |
147 { &GUID_Key, 70, 0x8000460C, 0x00000000 }, | |
148 { &GUID_Key, 71, 0x8000470C, 0x00000000 }, | |
149 { &GUID_Key, 72, 0x8000480C, 0x00000000 }, | |
150 { &GUID_Key, 73, 0x8000490C, 0x00000000 }, | |
151 { &GUID_Key, 74, 0x80004A0C, 0x00000000 }, | |
152 { &GUID_Key, 75, 0x80004B0C, 0x00000000 }, | |
153 { &GUID_Key, 76, 0x80004C0C, 0x00000000 }, | |
154 { &GUID_Key, 77, 0x80004D0C, 0x00000000 }, | |
155 { &GUID_Key, 78, 0x80004E0C, 0x00000000 }, | |
156 { &GUID_Key, 79, 0x80004F0C, 0x00000000 }, | |
157 { &GUID_Key, 80, 0x8000500C, 0x00000000 }, | |
158 { &GUID_Key, 81, 0x8000510C, 0x00000000 }, | |
159 { &GUID_Key, 82, 0x8000520C, 0x00000000 }, | |
160 { &GUID_Key, 83, 0x8000530C, 0x00000000 }, | |
161 { &GUID_Key, 84, 0x8000540C, 0x00000000 }, | |
162 { &GUID_Key, 85, 0x8000550C, 0x00000000 }, | |
163 { &GUID_Key, 86, 0x8000560C, 0x00000000 }, | |
164 { &GUID_Key, 87, 0x8000570C, 0x00000000 }, | |
165 { &GUID_Key, 88, 0x8000580C, 0x00000000 }, | |
166 { &GUID_Key, 89, 0x8000590C, 0x00000000 }, | |
167 { &GUID_Key, 90, 0x80005A0C, 0x00000000 }, | |
168 { &GUID_Key, 91, 0x80005B0C, 0x00000000 }, | |
169 { &GUID_Key, 92, 0x80005C0C, 0x00000000 }, | |
170 { &GUID_Key, 93, 0x80005D0C, 0x00000000 }, | |
171 { &GUID_Key, 94, 0x80005E0C, 0x00000000 }, | |
172 { &GUID_Key, 95, 0x80005F0C, 0x00000000 }, | |
173 { &GUID_Key, 96, 0x8000600C, 0x00000000 }, | |
174 { &GUID_Key, 97, 0x8000610C, 0x00000000 }, | |
175 { &GUID_Key, 98, 0x8000620C, 0x00000000 }, | |
176 { &GUID_Key, 99, 0x8000630C, 0x00000000 }, | |
177 { &GUID_Key, 100, 0x8000640C, 0x00000000 }, | |
178 { &GUID_Key, 101, 0x8000650C, 0x00000000 }, | |
179 { &GUID_Key, 102, 0x8000660C, 0x00000000 }, | |
180 { &GUID_Key, 103, 0x8000670C, 0x00000000 }, | |
181 { &GUID_Key, 104, 0x8000680C, 0x00000000 }, | |
182 { &GUID_Key, 105, 0x8000690C, 0x00000000 }, | |
183 { &GUID_Key, 106, 0x80006A0C, 0x00000000 }, | |
184 { &GUID_Key, 107, 0x80006B0C, 0x00000000 }, | |
185 { &GUID_Key, 108, 0x80006C0C, 0x00000000 }, | |
186 { &GUID_Key, 109, 0x80006D0C, 0x00000000 }, | |
187 { &GUID_Key, 110, 0x80006E0C, 0x00000000 }, | |
188 { &GUID_Key, 111, 0x80006F0C, 0x00000000 }, | |
189 { &GUID_Key, 112, 0x8000700C, 0x00000000 }, | |
190 { &GUID_Key, 113, 0x8000710C, 0x00000000 }, | |
191 { &GUID_Key, 114, 0x8000720C, 0x00000000 }, | |
192 { &GUID_Key, 115, 0x8000730C, 0x00000000 }, | |
193 { &GUID_Key, 116, 0x8000740C, 0x00000000 }, | |
194 { &GUID_Key, 117, 0x8000750C, 0x00000000 }, | |
195 { &GUID_Key, 118, 0x8000760C, 0x00000000 }, | |
196 { &GUID_Key, 119, 0x8000770C, 0x00000000 }, | |
197 { &GUID_Key, 120, 0x8000780C, 0x00000000 }, | |
198 { &GUID_Key, 121, 0x8000790C, 0x00000000 }, | |
199 { &GUID_Key, 122, 0x80007A0C, 0x00000000 }, | |
200 { &GUID_Key, 123, 0x80007B0C, 0x00000000 }, | |
201 { &GUID_Key, 124, 0x80007C0C, 0x00000000 }, | |
202 { &GUID_Key, 125, 0x80007D0C, 0x00000000 }, | |
203 { &GUID_Key, 126, 0x80007E0C, 0x00000000 }, | |
204 { &GUID_Key, 127, 0x80007F0C, 0x00000000 }, | |
205 { &GUID_Key, 128, 0x8000800C, 0x00000000 }, | |
206 { &GUID_Key, 129, 0x8000810C, 0x00000000 }, | |
207 { &GUID_Key, 130, 0x8000820C, 0x00000000 }, | |
208 { &GUID_Key, 131, 0x8000830C, 0x00000000 }, | |
209 { &GUID_Key, 132, 0x8000840C, 0x00000000 }, | |
210 { &GUID_Key, 133, 0x8000850C, 0x00000000 }, | |
211 { &GUID_Key, 134, 0x8000860C, 0x00000000 }, | |
212 { &GUID_Key, 135, 0x8000870C, 0x00000000 }, | |
213 { &GUID_Key, 136, 0x8000880C, 0x00000000 }, | |
214 { &GUID_Key, 137, 0x8000890C, 0x00000000 }, | |
215 { &GUID_Key, 138, 0x80008A0C, 0x00000000 }, | |
216 { &GUID_Key, 139, 0x80008B0C, 0x00000000 }, | |
217 { &GUID_Key, 140, 0x80008C0C, 0x00000000 }, | |
218 { &GUID_Key, 141, 0x80008D0C, 0x00000000 }, | |
219 { &GUID_Key, 142, 0x80008E0C, 0x00000000 }, | |
220 { &GUID_Key, 143, 0x80008F0C, 0x00000000 }, | |
221 { &GUID_Key, 144, 0x8000900C, 0x00000000 }, | |
222 { &GUID_Key, 145, 0x8000910C, 0x00000000 }, | |
223 { &GUID_Key, 146, 0x8000920C, 0x00000000 }, | |
224 { &GUID_Key, 147, 0x8000930C, 0x00000000 }, | |
225 { &GUID_Key, 148, 0x8000940C, 0x00000000 }, | |
226 { &GUID_Key, 149, 0x8000950C, 0x00000000 }, | |
227 { &GUID_Key, 150, 0x8000960C, 0x00000000 }, | |
228 { &GUID_Key, 151, 0x8000970C, 0x00000000 }, | |
229 { &GUID_Key, 152, 0x8000980C, 0x00000000 }, | |
230 { &GUID_Key, 153, 0x8000990C, 0x00000000 }, | |
231 { &GUID_Key, 154, 0x80009A0C, 0x00000000 }, | |
232 { &GUID_Key, 155, 0x80009B0C, 0x00000000 }, | |
233 { &GUID_Key, 156, 0x80009C0C, 0x00000000 }, | |
234 { &GUID_Key, 157, 0x80009D0C, 0x00000000 }, | |
235 { &GUID_Key, 158, 0x80009E0C, 0x00000000 }, | |
236 { &GUID_Key, 159, 0x80009F0C, 0x00000000 }, | |
237 { &GUID_Key, 160, 0x8000A00C, 0x00000000 }, | |
238 { &GUID_Key, 161, 0x8000A10C, 0x00000000 }, | |
239 { &GUID_Key, 162, 0x8000A20C, 0x00000000 }, | |
240 { &GUID_Key, 163, 0x8000A30C, 0x00000000 }, | |
241 { &GUID_Key, 164, 0x8000A40C, 0x00000000 }, | |
242 { &GUID_Key, 165, 0x8000A50C, 0x00000000 }, | |
243 { &GUID_Key, 166, 0x8000A60C, 0x00000000 }, | |
244 { &GUID_Key, 167, 0x8000A70C, 0x00000000 }, | |
245 { &GUID_Key, 168, 0x8000A80C, 0x00000000 }, | |
246 { &GUID_Key, 169, 0x8000A90C, 0x00000000 }, | |
247 { &GUID_Key, 170, 0x8000AA0C, 0x00000000 }, | |
248 { &GUID_Key, 171, 0x8000AB0C, 0x00000000 }, | |
249 { &GUID_Key, 172, 0x8000AC0C, 0x00000000 }, | |
250 { &GUID_Key, 173, 0x8000AD0C, 0x00000000 }, | |
251 { &GUID_Key, 174, 0x8000AE0C, 0x00000000 }, | |
252 { &GUID_Key, 175, 0x8000AF0C, 0x00000000 }, | |
253 { &GUID_Key, 176, 0x8000B00C, 0x00000000 }, | |
254 { &GUID_Key, 177, 0x8000B10C, 0x00000000 }, | |
255 { &GUID_Key, 178, 0x8000B20C, 0x00000000 }, | |
256 { &GUID_Key, 179, 0x8000B30C, 0x00000000 }, | |
257 { &GUID_Key, 180, 0x8000B40C, 0x00000000 }, | |
258 { &GUID_Key, 181, 0x8000B50C, 0x00000000 }, | |
259 { &GUID_Key, 182, 0x8000B60C, 0x00000000 }, | |
260 { &GUID_Key, 183, 0x8000B70C, 0x00000000 }, | |
261 { &GUID_Key, 184, 0x8000B80C, 0x00000000 }, | |
262 { &GUID_Key, 185, 0x8000B90C, 0x00000000 }, | |
263 { &GUID_Key, 186, 0x8000BA0C, 0x00000000 }, | |
264 { &GUID_Key, 187, 0x8000BB0C, 0x00000000 }, | |
265 { &GUID_Key, 188, 0x8000BC0C, 0x00000000 }, | |
266 { &GUID_Key, 189, 0x8000BD0C, 0x00000000 }, | |
267 { &GUID_Key, 190, 0x8000BE0C, 0x00000000 }, | |
268 { &GUID_Key, 191, 0x8000BF0C, 0x00000000 }, | |
269 { &GUID_Key, 192, 0x8000C00C, 0x00000000 }, | |
270 { &GUID_Key, 193, 0x8000C10C, 0x00000000 }, | |
271 { &GUID_Key, 194, 0x8000C20C, 0x00000000 }, | |
272 { &GUID_Key, 195, 0x8000C30C, 0x00000000 }, | |
273 { &GUID_Key, 196, 0x8000C40C, 0x00000000 }, | |
274 { &GUID_Key, 197, 0x8000C50C, 0x00000000 }, | |
275 { &GUID_Key, 198, 0x8000C60C, 0x00000000 }, | |
276 { &GUID_Key, 199, 0x8000C70C, 0x00000000 }, | |
277 { &GUID_Key, 200, 0x8000C80C, 0x00000000 }, | |
278 { &GUID_Key, 201, 0x8000C90C, 0x00000000 }, | |
279 { &GUID_Key, 202, 0x8000CA0C, 0x00000000 }, | |
280 { &GUID_Key, 203, 0x8000CB0C, 0x00000000 }, | |
281 { &GUID_Key, 204, 0x8000CC0C, 0x00000000 }, | |
282 { &GUID_Key, 205, 0x8000CD0C, 0x00000000 }, | |
283 { &GUID_Key, 206, 0x8000CE0C, 0x00000000 }, | |
284 { &GUID_Key, 207, 0x8000CF0C, 0x00000000 }, | |
285 { &GUID_Key, 208, 0x8000D00C, 0x00000000 }, | |
286 { &GUID_Key, 209, 0x8000D10C, 0x00000000 }, | |
287 { &GUID_Key, 210, 0x8000D20C, 0x00000000 }, | |
288 { &GUID_Key, 211, 0x8000D30C, 0x00000000 }, | |
289 { &GUID_Key, 212, 0x8000D40C, 0x00000000 }, | |
290 { &GUID_Key, 213, 0x8000D50C, 0x00000000 }, | |
291 { &GUID_Key, 214, 0x8000D60C, 0x00000000 }, | |
292 { &GUID_Key, 215, 0x8000D70C, 0x00000000 }, | |
293 { &GUID_Key, 216, 0x8000D80C, 0x00000000 }, | |
294 { &GUID_Key, 217, 0x8000D90C, 0x00000000 }, | |
295 { &GUID_Key, 218, 0x8000DA0C, 0x00000000 }, | |
296 { &GUID_Key, 219, 0x8000DB0C, 0x00000000 }, | |
297 { &GUID_Key, 220, 0x8000DC0C, 0x00000000 }, | |
298 { &GUID_Key, 221, 0x8000DD0C, 0x00000000 }, | |
299 { &GUID_Key, 222, 0x8000DE0C, 0x00000000 }, | |
300 { &GUID_Key, 223, 0x8000DF0C, 0x00000000 }, | |
301 { &GUID_Key, 224, 0x8000E00C, 0x00000000 }, | |
302 { &GUID_Key, 225, 0x8000E10C, 0x00000000 }, | |
303 { &GUID_Key, 226, 0x8000E20C, 0x00000000 }, | |
304 { &GUID_Key, 227, 0x8000E30C, 0x00000000 }, | |
305 { &GUID_Key, 228, 0x8000E40C, 0x00000000 }, | |
306 { &GUID_Key, 229, 0x8000E50C, 0x00000000 }, | |
307 { &GUID_Key, 230, 0x8000E60C, 0x00000000 }, | |
308 { &GUID_Key, 231, 0x8000E70C, 0x00000000 }, | |
309 { &GUID_Key, 232, 0x8000E80C, 0x00000000 }, | |
310 { &GUID_Key, 233, 0x8000E90C, 0x00000000 }, | |
311 { &GUID_Key, 234, 0x8000EA0C, 0x00000000 }, | |
312 { &GUID_Key, 235, 0x8000EB0C, 0x00000000 }, | |
313 { &GUID_Key, 236, 0x8000EC0C, 0x00000000 }, | |
314 { &GUID_Key, 237, 0x8000ED0C, 0x00000000 }, | |
315 { &GUID_Key, 238, 0x8000EE0C, 0x00000000 }, | |
316 { &GUID_Key, 239, 0x8000EF0C, 0x00000000 }, | |
317 { &GUID_Key, 240, 0x8000F00C, 0x00000000 }, | |
318 { &GUID_Key, 241, 0x8000F10C, 0x00000000 }, | |
319 { &GUID_Key, 242, 0x8000F20C, 0x00000000 }, | |
320 { &GUID_Key, 243, 0x8000F30C, 0x00000000 }, | |
321 { &GUID_Key, 244, 0x8000F40C, 0x00000000 }, | |
322 { &GUID_Key, 245, 0x8000F50C, 0x00000000 }, | |
323 { &GUID_Key, 246, 0x8000F60C, 0x00000000 }, | |
324 { &GUID_Key, 247, 0x8000F70C, 0x00000000 }, | |
325 { &GUID_Key, 248, 0x8000F80C, 0x00000000 }, | |
326 { &GUID_Key, 249, 0x8000F90C, 0x00000000 }, | |
327 { &GUID_Key, 250, 0x8000FA0C, 0x00000000 }, | |
328 { &GUID_Key, 251, 0x8000FB0C, 0x00000000 }, | |
329 { &GUID_Key, 252, 0x8000FC0C, 0x00000000 }, | |
330 { &GUID_Key, 253, 0x8000FD0C, 0x00000000 }, | |
331 { &GUID_Key, 254, 0x8000FE0C, 0x00000000 }, | |
332 { &GUID_Key, 255, 0x8000FF0C, 0x00000000 }, | |
333 }; | |
334 | |
335 const DIDATAFORMAT c_dfDIKeyboard = { 24, 16, 0x00000002, 256, 256, KBD_fmt }; | |
336 | |
337 | |
338 /* Mouse */ | |
339 | |
340 static DIOBJECTDATAFORMAT PTR_fmt[] = { | |
341 { &GUID_XAxis, 0, 0x00FFFF03, 0x00000000 }, | |
342 { &GUID_YAxis, 4, 0x00FFFF03, 0x00000000 }, | |
343 { &GUID_ZAxis, 8, 0x80FFFF03, 0x00000000 }, | |
344 { NULL, 12, 0x00FFFF0C, 0x00000000 }, | |
345 { NULL, 13, 0x00FFFF0C, 0x00000000 }, | |
346 { NULL, 14, 0x80FFFF0C, 0x00000000 }, | |
347 { NULL, 15, 0x80FFFF0C, 0x00000000 }, | |
348 }; | |
349 | |
350 const DIDATAFORMAT c_dfDIMouse = { 24, 16, 0x00000002, 16, 7, PTR_fmt }; | |
351 | |
352 | |
353 /* Joystick */ | |
354 | |
355 static DIOBJECTDATAFORMAT JOY_fmt[] = { | |
356 { &GUID_XAxis, 0, 0x80FFFF03, 0x00000100 }, | |
357 { &GUID_YAxis, 4, 0x80FFFF03, 0x00000100 }, | |
358 { &GUID_ZAxis, 8, 0x80FFFF03, 0x00000100 }, | |
359 { &GUID_RxAxis, 12, 0x80FFFF03, 0x00000100 }, | |
360 { &GUID_RyAxis, 16, 0x80FFFF03, 0x00000100 }, | |
361 { &GUID_RzAxis, 20, 0x80FFFF03, 0x00000100 }, | |
362 { &GUID_Slider, 24, 0x80FFFF03, 0x00000100 }, | |
363 { &GUID_Slider, 28, 0x80FFFF03, 0x00000100 }, | |
364 { &GUID_POV, 32, 0x80FFFF10, 0x00000000 }, | |
365 { &GUID_POV, 36, 0x80FFFF10, 0x00000000 }, | |
366 { &GUID_POV, 40, 0x80FFFF10, 0x00000000 }, | |
367 { &GUID_POV, 44, 0x80FFFF10, 0x00000000 }, | |
368 { NULL, 48, 0x80FFFF0C, 0x00000000 }, | |
369 { NULL, 49, 0x80FFFF0C, 0x00000000 }, | |
370 { NULL, 50, 0x80FFFF0C, 0x00000000 }, | |
371 { NULL, 51, 0x80FFFF0C, 0x00000000 }, | |
372 { NULL, 52, 0x80FFFF0C, 0x00000000 }, | |
373 { NULL, 53, 0x80FFFF0C, 0x00000000 }, | |
374 { NULL, 54, 0x80FFFF0C, 0x00000000 }, | |
375 { NULL, 55, 0x80FFFF0C, 0x00000000 }, | |
376 { NULL, 56, 0x80FFFF0C, 0x00000000 }, | |
377 { NULL, 57, 0x80FFFF0C, 0x00000000 }, | |
378 { NULL, 58, 0x80FFFF0C, 0x00000000 }, | |
379 { NULL, 59, 0x80FFFF0C, 0x00000000 }, | |
380 { NULL, 60, 0x80FFFF0C, 0x00000000 }, | |
381 { NULL, 61, 0x80FFFF0C, 0x00000000 }, | |
382 { NULL, 62, 0x80FFFF0C, 0x00000000 }, | |
383 { NULL, 63, 0x80FFFF0C, 0x00000000 }, | |
384 { NULL, 64, 0x80FFFF0C, 0x00000000 }, | |
385 { NULL, 65, 0x80FFFF0C, 0x00000000 }, | |
386 { NULL, 66, 0x80FFFF0C, 0x00000000 }, | |
387 { NULL, 67, 0x80FFFF0C, 0x00000000 }, | |
388 { NULL, 68, 0x80FFFF0C, 0x00000000 }, | |
389 { NULL, 69, 0x80FFFF0C, 0x00000000 }, | |
390 { NULL, 70, 0x80FFFF0C, 0x00000000 }, | |
391 { NULL, 71, 0x80FFFF0C, 0x00000000 }, | |
392 { NULL, 72, 0x80FFFF0C, 0x00000000 }, | |
393 { NULL, 73, 0x80FFFF0C, 0x00000000 }, | |
394 { NULL, 74, 0x80FFFF0C, 0x00000000 }, | |
395 { NULL, 75, 0x80FFFF0C, 0x00000000 }, | |
396 { NULL, 76, 0x80FFFF0C, 0x00000000 }, | |
397 { NULL, 77, 0x80FFFF0C, 0x00000000 }, | |
398 { NULL, 78, 0x80FFFF0C, 0x00000000 }, | |
399 { NULL, 79, 0x80FFFF0C, 0x00000000 }, | |
400 }; | |
401 | |
402 const DIDATAFORMAT c_dfDIJoystick = { 24, 16, 0x00000001, 80, 44, JOY_fmt }; | |
403 | |
404 | |
405 /* Initialization/Query functions */ | |
406 static int DX5_VideoInit(_THIS, SDL_PixelFormat *vformat); | |
407 static SDL_Rect **DX5_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags); | |
408 static SDL_Surface *DX5_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags); | |
409 static int DX5_SetColors(_THIS, int firstcolor, int ncolors, | |
410 SDL_Color *colors); | |
411 static int DX5_SetGammaRamp(_THIS, Uint16 *ramp); | |
412 static int DX5_GetGammaRamp(_THIS, Uint16 *ramp); | |
413 static void DX5_VideoQuit(_THIS); | |
414 | |
415 /* Hardware surface functions */ | |
416 static int DX5_AllocHWSurface(_THIS, SDL_Surface *surface); | |
417 static int DX5_CheckHWBlit(_THIS, SDL_Surface *src, SDL_Surface *dst); | |
418 static int DX5_FillHWRect(_THIS, SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); | |
419 static int DX5_SetHWColorKey(_THIS, SDL_Surface *surface, Uint32 key); | |
420 static int DX5_SetHWAlpha(_THIS, SDL_Surface *surface, Uint8 alpha); | |
421 static int DX5_LockHWSurface(_THIS, SDL_Surface *surface); | |
422 static void DX5_UnlockHWSurface(_THIS, SDL_Surface *surface); | |
423 static int DX5_FlipHWSurface(_THIS, SDL_Surface *surface); | |
424 static void DX5_FreeHWSurface(_THIS, SDL_Surface *surface); | |
425 | |
426 static int DX5_AllocDDSurface(_THIS, SDL_Surface *surface, | |
427 LPDIRECTDRAWSURFACE3 requested, Uint32 flag); | |
428 | |
429 /* Windows message handling functions */ | |
3992 | 430 static void DX5_Activate(_THIS, BOOL active, BOOL minimized); |
0 | 431 static void DX5_RealizePalette(_THIS); |
432 static void DX5_PaletteChanged(_THIS, HWND window); | |
433 static void DX5_WinPAINT(_THIS, HDC hdc); | |
434 | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
435 /* 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
|
436 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
|
437 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
|
438 extern void DIB_QuitGamma(_THIS); |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
439 |
0 | 440 /* DX5 driver bootstrap functions */ |
441 | |
442 static int DX5_Available(void) | |
443 { | |
1855
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
444 HINSTANCE DInputDLL; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
445 HINSTANCE DDrawDLL; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
446 int dinput_ok; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
447 int ddraw_ok; |
0 | 448 |
449 /* Version check DINPUT.DLL and DDRAW.DLL (Is DirectX okay?) */ | |
1855
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
450 dinput_ok = 0; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
451 DInputDLL = LoadLibrary(TEXT("DINPUT.DLL")); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
452 if ( DInputDLL != NULL ) { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
453 dinput_ok = 1; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
454 FreeLibrary(DInputDLL); |
0 | 455 } |
1855
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
456 ddraw_ok = 0; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
457 DDrawDLL = LoadLibrary(TEXT("DDRAW.DLL")); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
458 if ( DDrawDLL != NULL ) { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
459 HRESULT (WINAPI *DDrawCreate)(GUID *,LPDIRECTDRAW *,IUnknown *); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
460 LPDIRECTDRAW DDraw; |
0 | 461 |
1855
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
462 /* Try to create a valid DirectDraw object */ |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
463 DDrawCreate = (void *)GetProcAddress(DDrawDLL, TEXT("DirectDrawCreate")); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
464 if ( (DDrawCreate != NULL) |
0 | 465 && !FAILED(DDrawCreate(NULL, &DDraw, NULL)) ) { |
1855
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
466 if ( !FAILED(IDirectDraw_SetCooperativeLevel(DDraw, |
0 | 467 NULL, DDSCL_NORMAL)) ) { |
1855
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
468 DDSURFACEDESC desc; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
469 LPDIRECTDRAWSURFACE DDrawSurf; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
470 LPDIRECTDRAWSURFACE3 DDrawSurf3; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
471 |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
472 /* Try to create a DirectDrawSurface3 object */ |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
473 SDL_memset(&desc, 0, sizeof(desc)); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
474 desc.dwSize = sizeof(desc); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
475 desc.dwFlags = DDSD_CAPS; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
476 desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_VIDEOMEMORY; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
477 if ( !FAILED(IDirectDraw_CreateSurface(DDraw, &desc, |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
478 &DDrawSurf, NULL)) ) { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
479 if ( !FAILED(IDirectDrawSurface_QueryInterface(DDrawSurf, |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
480 &IID_IDirectDrawSurface3, (LPVOID *)&DDrawSurf3)) ) { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
481 /* Yay! */ |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
482 ddraw_ok = 1; |
0 | 483 |
1855
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
484 /* Clean up.. */ |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
485 IDirectDrawSurface3_Release(DDrawSurf3); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
486 } |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
487 IDirectDrawSurface_Release(DDrawSurf); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
488 } |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
489 } |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
490 IDirectDraw_Release(DDraw); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
491 } |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
492 FreeLibrary(DDrawDLL); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
493 } |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
494 return(dinput_ok && ddraw_ok); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
495 } |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
496 |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
497 /* Functions for loading the DirectX functions dynamically */ |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
498 static HINSTANCE DDrawDLL = NULL; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
499 static HINSTANCE DInputDLL = NULL; |
0 | 500 |
1855
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
501 static void DX5_Unload(void) |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
502 { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
503 if ( DDrawDLL != NULL ) { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
504 FreeLibrary(DDrawDLL); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
505 DDrawCreate = NULL; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
506 DDrawDLL = NULL; |
0 | 507 } |
1855
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
508 if ( DInputDLL != NULL ) { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
509 FreeLibrary(DInputDLL); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
510 DInputCreate = NULL; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
511 DInputDLL = NULL; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
512 } |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
513 } |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
514 static int DX5_Load(void) |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
515 { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
516 int status; |
0 | 517 |
518 DX5_Unload(); | |
1855
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
519 DDrawDLL = LoadLibrary(TEXT("DDRAW.DLL")); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
520 if ( DDrawDLL != NULL ) { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
521 DDrawCreate = (void *)GetProcAddress(DDrawDLL, |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
522 TEXT("DirectDrawCreate")); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
523 } |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
524 DInputDLL = LoadLibrary(TEXT("DINPUT.DLL")); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
525 if ( DInputDLL != NULL ) { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
526 DInputCreate = (void *)GetProcAddress(DInputDLL, |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
527 TEXT("DirectInputCreateA")); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
528 } |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
529 if ( DDrawDLL && DDrawCreate && DInputDLL && DInputCreate ) { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
530 status = 0; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
531 } else { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
532 DX5_Unload(); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
533 status = -1; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
534 } |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
535 return status; |
0 | 536 } |
537 | |
538 static void DX5_DeleteDevice(SDL_VideoDevice *this) | |
539 { | |
540 /* Free DirectDraw object */ | |
541 if ( ddraw2 != NULL ) { | |
542 IDirectDraw2_Release(ddraw2); | |
543 } | |
544 DX5_Unload(); | |
545 if ( this ) { | |
546 if ( this->hidden ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
547 SDL_free(this->hidden); |
0 | 548 } |
549 if ( this->gl_data ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
550 SDL_free(this->gl_data); |
0 | 551 } |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
552 SDL_free(this); |
0 | 553 } |
554 } | |
555 | |
556 static SDL_VideoDevice *DX5_CreateDevice(int devindex) | |
557 { | |
558 SDL_VideoDevice *device; | |
559 | |
560 /* Load DirectX */ | |
561 if ( DX5_Load() < 0 ) { | |
562 return(NULL); | |
563 } | |
564 | |
565 /* Initialize all variables that we clean on shutdown */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
566 device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice)); |
0 | 567 if ( device ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
568 SDL_memset(device, 0, (sizeof *device)); |
0 | 569 device->hidden = (struct SDL_PrivateVideoData *) |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
570 SDL_malloc((sizeof *device->hidden)); |
0 | 571 device->gl_data = (struct SDL_PrivateGLData *) |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
572 SDL_malloc((sizeof *device->gl_data)); |
0 | 573 } |
574 if ( (device == NULL) || (device->hidden == NULL) || | |
575 (device->gl_data == NULL) ) { | |
576 SDL_OutOfMemory(); | |
577 DX5_DeleteDevice(device); | |
578 return(NULL); | |
579 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
580 SDL_memset(device->hidden, 0, (sizeof *device->hidden)); |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
581 SDL_memset(device->gl_data, 0, (sizeof *device->gl_data)); |
0 | 582 |
583 /* Set the function pointers */ | |
584 device->VideoInit = DX5_VideoInit; | |
585 device->ListModes = DX5_ListModes; | |
586 device->SetVideoMode = DX5_SetVideoMode; | |
587 device->UpdateMouse = WIN_UpdateMouse; | |
588 device->CreateYUVOverlay = DX5_CreateYUVOverlay; | |
589 device->SetColors = DX5_SetColors; | |
590 device->UpdateRects = NULL; | |
591 device->VideoQuit = DX5_VideoQuit; | |
592 device->AllocHWSurface = DX5_AllocHWSurface; | |
593 device->CheckHWBlit = DX5_CheckHWBlit; | |
594 device->FillHWRect = DX5_FillHWRect; | |
595 device->SetHWColorKey = DX5_SetHWColorKey; | |
596 device->SetHWAlpha = DX5_SetHWAlpha; | |
597 device->LockHWSurface = DX5_LockHWSurface; | |
598 device->UnlockHWSurface = DX5_UnlockHWSurface; | |
599 device->FlipHWSurface = DX5_FlipHWSurface; | |
600 device->FreeHWSurface = DX5_FreeHWSurface; | |
601 device->SetGammaRamp = DX5_SetGammaRamp; | |
602 device->GetGammaRamp = DX5_GetGammaRamp; | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
603 #if SDL_VIDEO_OPENGL |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
604 device->GL_LoadLibrary = WIN_GL_LoadLibrary; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
605 device->GL_GetProcAddress = WIN_GL_GetProcAddress; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
606 device->GL_GetAttribute = WIN_GL_GetAttribute; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
607 device->GL_MakeCurrent = WIN_GL_MakeCurrent; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
608 device->GL_SwapBuffers = WIN_GL_SwapBuffers; |
0 | 609 #endif |
610 device->SetCaption = WIN_SetWMCaption; | |
611 device->SetIcon = WIN_SetWMIcon; | |
612 device->IconifyWindow = WIN_IconifyWindow; | |
613 device->GrabInput = WIN_GrabInput; | |
614 device->GetWMInfo = WIN_GetWMInfo; | |
615 device->FreeWMCursor = WIN_FreeWMCursor; | |
616 device->CreateWMCursor = WIN_CreateWMCursor; | |
617 device->ShowWMCursor = WIN_ShowWMCursor; | |
618 device->WarpWMCursor = WIN_WarpWMCursor; | |
619 device->CheckMouseMode = WIN_CheckMouseMode; | |
620 device->InitOSKeymap = DX5_InitOSKeymap; | |
621 device->PumpEvents = DX5_PumpEvents; | |
622 | |
623 /* Set up the windows message handling functions */ | |
3992 | 624 WIN_Activate = DX5_Activate; |
0 | 625 WIN_RealizePalette = DX5_RealizePalette; |
626 WIN_PaletteChanged = DX5_PaletteChanged; | |
627 WIN_WinPAINT = DX5_WinPAINT; | |
628 HandleMessage = DX5_HandleMessage; | |
629 | |
630 device->free = DX5_DeleteDevice; | |
631 | |
632 /* We're finally ready */ | |
633 return device; | |
634 } | |
635 | |
636 VideoBootStrap DIRECTX_bootstrap = { | |
637 "directx", "Win95/98/2000 DirectX", | |
638 DX5_Available, DX5_CreateDevice | |
639 }; | |
640 | |
1771 | 641 static int cmpmodes(const void *va, const void *vb) |
642 { | |
643 SDL_Rect *a = *(SDL_Rect **)va; | |
644 SDL_Rect *b = *(SDL_Rect **)vb; | |
645 if ( a->w == b->w ) | |
646 return b->h - a->h; | |
647 else | |
648 return b->w - a->w; | |
649 } | |
650 | |
0 | 651 static HRESULT WINAPI EnumModes2(DDSURFACEDESC *desc, VOID *udata) |
652 { | |
653 SDL_VideoDevice *this = (SDL_VideoDevice *)udata; | |
654 struct DX5EnumRect *enumrect; | |
655 #if defined(NONAMELESSUNION) | |
656 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
|
657 int refreshRate = desc->u2.dwRefreshRate; |
0 | 658 #else |
659 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
|
660 int refreshRate = desc->dwRefreshRate; |
0 | 661 #endif |
1295
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
662 int maxRefreshRate; |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
663 |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
664 if ( desc->dwWidth <= SDL_desktop_mode.dmPelsWidth && |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
665 desc->dwHeight <= SDL_desktop_mode.dmPelsHeight ) { |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
666 maxRefreshRate = SDL_desktop_mode.dmDisplayFrequency; |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
667 } else { |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
668 maxRefreshRate = 85; /* safe value? */ |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
669 } |
0 | 670 |
671 switch (bpp) { | |
672 case 8: | |
673 case 16: | |
674 case 24: | |
675 case 32: | |
676 bpp /= 8; --bpp; | |
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
677 if ( enumlists[bpp] && |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
678 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
|
679 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
|
680 if ( refreshRate > enumlists[bpp]->refreshRate && |
1295
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
681 refreshRate <= maxRefreshRate ) { |
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
682 enumlists[bpp]->refreshRate = refreshRate; |
815
6176f9a0d61a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
809
diff
changeset
|
683 #ifdef DDRAW_DEBUG |
6176f9a0d61a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
809
diff
changeset
|
684 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
|
685 #endif |
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
686 } |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
687 break; |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
688 } |
0 | 689 ++SDL_nummodes[bpp]; |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
690 enumrect = (struct DX5EnumRect*)SDL_malloc(sizeof(struct DX5EnumRect)); |
0 | 691 if ( !enumrect ) { |
692 SDL_OutOfMemory(); | |
693 return(DDENUMRET_CANCEL); | |
694 } | |
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
695 enumrect->refreshRate = refreshRate; |
0 | 696 enumrect->r.x = 0; |
697 enumrect->r.y = 0; | |
698 enumrect->r.w = (Uint16)desc->dwWidth; | |
699 enumrect->r.h = (Uint16)desc->dwHeight; | |
700 enumrect->next = enumlists[bpp]; | |
701 enumlists[bpp] = enumrect; | |
815
6176f9a0d61a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
809
diff
changeset
|
702 #ifdef DDRAW_DEBUG |
6176f9a0d61a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
809
diff
changeset
|
703 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
|
704 #endif |
0 | 705 break; |
706 } | |
707 | |
708 return(DDENUMRET_OK); | |
709 } | |
710 | |
711 void SetDDerror(const char *function, int code) | |
712 { | |
713 static char *error; | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
714 static char errbuf[1024]; |
0 | 715 |
716 errbuf[0] = 0; | |
717 switch (code) { | |
718 case DDERR_GENERIC: | |
719 error = "Undefined error!"; | |
720 break; | |
721 case DDERR_EXCEPTION: | |
722 error = "Exception encountered"; | |
723 break; | |
724 case DDERR_INVALIDOBJECT: | |
725 error = "Invalid object"; | |
726 break; | |
727 case DDERR_INVALIDPARAMS: | |
728 error = "Invalid parameters"; | |
729 break; | |
730 case DDERR_NOTFOUND: | |
731 error = "Object not found"; | |
732 break; | |
733 case DDERR_INVALIDRECT: | |
734 error = "Invalid rectangle"; | |
735 break; | |
736 case DDERR_INVALIDCAPS: | |
737 error = "Invalid caps member"; | |
738 break; | |
739 case DDERR_INVALIDPIXELFORMAT: | |
740 error = "Invalid pixel format"; | |
741 break; | |
742 case DDERR_OUTOFMEMORY: | |
743 error = "Out of memory"; | |
744 break; | |
745 case DDERR_OUTOFVIDEOMEMORY: | |
746 error = "Out of video memory"; | |
747 break; | |
748 case DDERR_SURFACEBUSY: | |
749 error = "Surface busy"; | |
750 break; | |
751 case DDERR_SURFACELOST: | |
752 error = "Surface was lost"; | |
753 break; | |
754 case DDERR_WASSTILLDRAWING: | |
755 error = "DirectDraw is still drawing"; | |
756 break; | |
757 case DDERR_INVALIDSURFACETYPE: | |
758 error = "Invalid surface type"; | |
759 break; | |
760 case DDERR_NOEXCLUSIVEMODE: | |
761 error = "Not in exclusive access mode"; | |
762 break; | |
763 case DDERR_NOPALETTEATTACHED: | |
764 error = "No palette attached"; | |
765 break; | |
766 case DDERR_NOPALETTEHW: | |
767 error = "No palette hardware"; | |
768 break; | |
769 case DDERR_NOT8BITCOLOR: | |
770 error = "Not 8-bit color"; | |
771 break; | |
772 case DDERR_EXCLUSIVEMODEALREADYSET: | |
773 error = "Exclusive mode was already set"; | |
774 break; | |
775 case DDERR_HWNDALREADYSET: | |
776 error = "Window handle already set"; | |
777 break; | |
778 case DDERR_HWNDSUBCLASSED: | |
779 error = "Window handle is subclassed"; | |
780 break; | |
781 case DDERR_NOBLTHW: | |
782 error = "No blit hardware"; | |
783 break; | |
784 case DDERR_IMPLICITLYCREATED: | |
785 error = "Surface was implicitly created"; | |
786 break; | |
787 case DDERR_INCOMPATIBLEPRIMARY: | |
788 error = "Incompatible primary surface"; | |
789 break; | |
790 case DDERR_NOCOOPERATIVELEVELSET: | |
791 error = "No cooperative level set"; | |
792 break; | |
793 case DDERR_NODIRECTDRAWHW: | |
794 error = "No DirectDraw hardware"; | |
795 break; | |
796 case DDERR_NOEMULATION: | |
797 error = "No emulation available"; | |
798 break; | |
799 case DDERR_NOFLIPHW: | |
800 error = "No flip hardware"; | |
801 break; | |
802 case DDERR_NOTFLIPPABLE: | |
803 error = "Surface not flippable"; | |
804 break; | |
805 case DDERR_PRIMARYSURFACEALREADYEXISTS: | |
806 error = "Primary surface already exists"; | |
807 break; | |
808 case DDERR_UNSUPPORTEDMODE: | |
809 error = "Unsupported mode"; | |
810 break; | |
811 case DDERR_WRONGMODE: | |
812 error = "Surface created in different mode"; | |
813 break; | |
814 case DDERR_UNSUPPORTED: | |
815 error = "Operation not supported"; | |
816 break; | |
817 case E_NOINTERFACE: | |
818 error = "Interface not present"; | |
819 break; | |
820 default: | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
821 SDL_snprintf(errbuf, SDL_arraysize(errbuf), |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
822 "%s: Unknown DirectDraw error: 0x%x", |
0 | 823 function, code); |
824 break; | |
825 } | |
826 if ( ! errbuf[0] ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
827 SDL_snprintf(errbuf, SDL_arraysize(errbuf), "%s: %s", function, error); |
0 | 828 } |
829 SDL_SetError("%s", errbuf); | |
830 return; | |
831 } | |
832 | |
833 | |
834 static int DX5_UpdateVideoInfo(_THIS) | |
835 { | |
836 /* This needs to be DDCAPS_DX5 for the DirectDraw2 interface */ | |
837 #if DIRECTDRAW_VERSION <= 0x300 | |
838 #error Your version of DirectX must be greater than or equal to 5.0 | |
839 #endif | |
334
f65715bd8ad8
Fixed DirectX fullscreen gamma control (thanks John!)
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
840 #ifndef IDirectDrawGammaControl_SetGammaRamp |
0 | 841 /*if gamma is undefined then we really have directx <= 0x500*/ |
842 DDCAPS DDCaps; | |
843 #else | |
844 DDCAPS_DX5 DDCaps; | |
845 #endif | |
846 HRESULT result; | |
847 | |
848 /* Fill in our hardware acceleration capabilities */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
849 SDL_memset(&DDCaps, 0, sizeof(DDCaps)); |
0 | 850 DDCaps.dwSize = sizeof(DDCaps); |
851 result = IDirectDraw2_GetCaps(ddraw2, (DDCAPS *)&DDCaps, NULL); | |
852 if ( result != DD_OK ) { | |
853 SetDDerror("DirectDraw2::GetCaps", result); | |
854 return(-1); | |
855 } | |
856 this->info.hw_available = 1; | |
857 if ( (DDCaps.dwCaps & DDCAPS_BLT) == DDCAPS_BLT ) { | |
858 this->info.blit_hw = 1; | |
859 } | |
860 if ( ((DDCaps.dwCaps & DDCAPS_COLORKEY) == DDCAPS_COLORKEY) && | |
861 ((DDCaps.dwCKeyCaps & DDCKEYCAPS_SRCBLT) == DDCKEYCAPS_SRCBLT) ) { | |
862 this->info.blit_hw_CC = 1; | |
863 } | |
864 if ( (DDCaps.dwCaps & DDCAPS_ALPHA) == DDCAPS_ALPHA ) { | |
865 /* This is only for alpha channel, and DirectX 6 | |
866 doesn't support 2D alpha blits yet, so set it 0 | |
867 */ | |
868 this->info.blit_hw_A = 0; | |
869 } | |
870 if ( (DDCaps.dwCaps & DDCAPS_CANBLTSYSMEM) == DDCAPS_CANBLTSYSMEM ) { | |
871 this->info.blit_sw = 1; | |
872 /* This isn't necessarily true, but the HEL will cover us */ | |
873 this->info.blit_sw_CC = this->info.blit_hw_CC; | |
874 this->info.blit_sw_A = this->info.blit_hw_A; | |
875 } | |
876 if ( (DDCaps.dwCaps & DDCAPS_BLTCOLORFILL) == DDCAPS_BLTCOLORFILL ) { | |
877 this->info.blit_fill = 1; | |
878 } | |
879 | |
880 /* Find out how much video memory is available */ | |
881 { DDSCAPS ddsCaps; | |
882 DWORD total_mem; | |
883 ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY; | |
884 result = IDirectDraw2_GetAvailableVidMem(ddraw2, | |
885 &ddsCaps, &total_mem, NULL); | |
886 if ( result != DD_OK ) { | |
887 total_mem = DDCaps.dwVidMemTotal; | |
888 } | |
889 this->info.video_mem = total_mem/1024; | |
890 } | |
891 return(0); | |
892 } | |
893 | |
894 int DX5_VideoInit(_THIS, SDL_PixelFormat *vformat) | |
895 { | |
896 HRESULT result; | |
897 LPDIRECTDRAW ddraw; | |
898 int i, j; | |
899 HDC hdc; | |
900 | |
901 /* Intialize everything */ | |
902 ddraw2 = NULL; | |
903 SDL_primary = NULL; | |
904 SDL_clipper = NULL; | |
905 SDL_palette = NULL; | |
906 for ( i=0; i<NUM_MODELISTS; ++i ) { | |
907 SDL_nummodes[i] = 0; | |
908 SDL_modelist[i] = NULL; | |
909 SDL_modeindex[i] = 0; | |
910 } | |
911 colorchange_expected = 0; | |
912 | |
913 /* Create the window */ | |
914 if ( DX5_CreateWindow(this) < 0 ) { | |
915 return(-1); | |
916 } | |
1523 | 917 |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
918 #if !SDL_AUDIO_DISABLED |
0 | 919 DX5_SoundFocus(SDL_Window); |
169
8039a5b760b9
Allow building SDL on Windows without audio support
Sam Lantinga <slouken@libsdl.org>
parents:
1
diff
changeset
|
920 #endif |
0 | 921 |
922 /* Create the DirectDraw object */ | |
923 result = DDrawCreate(NULL, &ddraw, NULL); | |
924 if ( result != DD_OK ) { | |
925 SetDDerror("DirectDrawCreate", result); | |
926 return(-1); | |
927 } | |
928 result = IDirectDraw_QueryInterface(ddraw, &IID_IDirectDraw2, | |
929 (LPVOID *)&ddraw2); | |
930 IDirectDraw_Release(ddraw); | |
931 if ( result != DD_OK ) { | |
932 SetDDerror("DirectDraw::QueryInterface", result); | |
933 return(-1); | |
934 } | |
935 | |
936 /* Determine the screen depth */ | |
937 hdc = GetDC(SDL_Window); | |
938 vformat->BitsPerPixel = GetDeviceCaps(hdc,PLANES) * | |
939 GetDeviceCaps(hdc,BITSPIXEL); | |
940 ReleaseDC(SDL_Window, hdc); | |
941 | |
1295
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
942 #ifndef NO_CHANGEDISPLAYSETTINGS |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
943 /* Query for the desktop resolution */ |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
944 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &SDL_desktop_mode); |
1545
8d9bb0cf2c2a
Added current_w and current_h to the SDL_VideoInfo structure, which is set to the desktop resolution during video intialization, and then set to the current resolution when a video mode is set.
Sam Lantinga <slouken@libsdl.org>
parents:
1523
diff
changeset
|
945 this->info.current_w = SDL_desktop_mode.dmPelsWidth; |
8d9bb0cf2c2a
Added current_w and current_h to the SDL_VideoInfo structure, which is set to the desktop resolution during video intialization, and then set to the current resolution when a video mode is set.
Sam Lantinga <slouken@libsdl.org>
parents:
1523
diff
changeset
|
946 this->info.current_h = SDL_desktop_mode.dmPelsHeight; |
1295
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
947 #endif |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
948 |
0 | 949 /* Enumerate the available fullscreen modes */ |
950 for ( i=0; i<NUM_MODELISTS; ++i ) | |
951 enumlists[i] = NULL; | |
952 | |
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
953 result = IDirectDraw2_EnumDisplayModes(ddraw2,DDEDM_REFRESHRATES,NULL,this,EnumModes2); |
0 | 954 if ( result != DD_OK ) { |
955 SetDDerror("DirectDraw2::EnumDisplayModes", result); | |
956 return(-1); | |
957 } | |
958 for ( i=0; i<NUM_MODELISTS; ++i ) { | |
959 struct DX5EnumRect *rect; | |
960 SDL_modelist[i] = (SDL_Rect **) | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
961 SDL_malloc((SDL_nummodes[i]+1)*sizeof(SDL_Rect *)); |
0 | 962 if ( SDL_modelist[i] == NULL ) { |
963 SDL_OutOfMemory(); | |
964 return(-1); | |
965 } | |
966 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
|
967 SDL_modelist[i][j] = &rect->r; |
0 | 968 } |
969 SDL_modelist[i][j] = NULL; | |
1771 | 970 |
971 if ( SDL_nummodes[i] > 0 ) { | |
972 SDL_qsort(SDL_modelist[i], SDL_nummodes[i], sizeof *SDL_modelist[i], cmpmodes); | |
973 } | |
0 | 974 } |
975 | |
976 /* Fill in some window manager capabilities */ | |
977 this->info.wm_available = 1; | |
978 | |
979 /* Fill in the video hardware capabilities */ | |
980 DX5_UpdateVideoInfo(this); | |
981 | |
982 return(0); | |
983 } | |
984 | |
985 SDL_Rect **DX5_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags) | |
986 { | |
987 int bpp; | |
988 | |
989 bpp = format->BitsPerPixel; | |
990 if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { | |
991 /* FIXME: No support for 1 bpp or 4 bpp formats */ | |
992 switch (bpp) { /* Does windows support other BPP? */ | |
993 case 8: | |
994 case 16: | |
995 case 24: | |
996 case 32: | |
997 bpp = (bpp/8)-1; | |
998 if ( SDL_nummodes[bpp] > 0 ) | |
999 return(SDL_modelist[bpp]); | |
1000 /* Fall through */ | |
1001 default: | |
1002 return((SDL_Rect **)0); | |
1003 } | |
1004 } else { | |
1005 if ( this->screen->format->BitsPerPixel == bpp ) { | |
1006 return((SDL_Rect **)-1); | |
1007 } else { | |
1008 return((SDL_Rect **)0); | |
1009 } | |
1010 } | |
1011 } | |
1012 | |
1013 /* Various screen update functions available */ | |
1014 static void DX5_WindowUpdate(_THIS, int numrects, SDL_Rect *rects); | |
1015 static void DX5_DirectUpdate(_THIS, int numrects, SDL_Rect *rects); | |
1016 | |
1017 SDL_Surface *DX5_SetVideoMode(_THIS, SDL_Surface *current, | |
1018 int width, int height, int bpp, Uint32 flags) | |
1019 { | |
1020 SDL_Surface *video; | |
1021 HRESULT result; | |
1022 DWORD sharemode; | |
1023 DWORD style; | |
1024 const DWORD directstyle = | |
1025 (WS_POPUP); | |
1026 const DWORD windowstyle = | |
1027 (WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX); | |
1028 const DWORD resizestyle = | |
1029 (WS_THICKFRAME|WS_MAXIMIZEBOX); | |
1030 DDSURFACEDESC ddsd; | |
1031 LPDIRECTDRAWSURFACE dd_surface1; | |
1032 LPDIRECTDRAWSURFACE3 dd_surface3; | |
1033 | |
1291
31331c444ea2
Only save the window position if we're in windowed mode
Sam Lantinga <slouken@libsdl.org>
parents:
1290
diff
changeset
|
1034 SDL_resizing = 1; |
0 | 1035 #ifdef DDRAW_DEBUG |
1036 fprintf(stderr, "Setting %dx%dx%d video mode\n", width, height, bpp); | |
1037 #endif | |
1038 /* Clean up any previous DirectDraw surfaces */ | |
1039 if ( current->hwdata ) { | |
1040 this->FreeHWSurface(this, current); | |
1041 current->hwdata = NULL; | |
1042 } | |
1043 if ( SDL_primary != NULL ) { | |
1044 IDirectDrawSurface3_Release(SDL_primary); | |
1045 SDL_primary = NULL; | |
1046 } | |
1047 | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
1048 #ifndef NO_CHANGEDISPLAYSETTINGS |
0 | 1049 /* Unset any previous OpenGL fullscreen mode */ |
1050 if ( (current->flags & (SDL_OPENGL|SDL_FULLSCREEN)) == | |
1051 (SDL_OPENGL|SDL_FULLSCREEN) ) { | |
1052 ChangeDisplaySettings(NULL, 0); | |
1053 } | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
1054 #endif |
0 | 1055 |
1056 /* Clean up any GL context that may be hanging around */ | |
1057 if ( current->flags & SDL_OPENGL ) { | |
1058 WIN_GL_ShutDown(this); | |
1059 } | |
1060 | |
1061 /* If we are setting a GL mode, use GDI, not DirectX (yuck) */ | |
1062 if ( flags & SDL_OPENGL ) { | |
1063 Uint32 Rmask, Gmask, Bmask; | |
1064 | |
1065 /* Recalculate the bitmasks if necessary */ | |
1066 if ( bpp == current->format->BitsPerPixel ) { | |
1067 video = current; | |
1068 } else { | |
1069 switch (bpp) { | |
1070 case 15: | |
1071 case 16: | |
1072 if ( 0 /*DIB_SussScreenDepth() == 15*/ ) { | |
1073 /* 5-5-5 */ | |
1074 Rmask = 0x00007c00; | |
1075 Gmask = 0x000003e0; | |
1076 Bmask = 0x0000001f; | |
1077 } else { | |
1078 /* 5-6-5 */ | |
1079 Rmask = 0x0000f800; | |
1080 Gmask = 0x000007e0; | |
1081 Bmask = 0x0000001f; | |
1082 } | |
1083 break; | |
1084 case 24: | |
1085 case 32: | |
1086 /* GDI defined as 8-8-8 */ | |
1087 Rmask = 0x00ff0000; | |
1088 Gmask = 0x0000ff00; | |
1089 Bmask = 0x000000ff; | |
1090 break; | |
1091 default: | |
1092 Rmask = 0x00000000; | |
1093 Gmask = 0x00000000; | |
1094 Bmask = 0x00000000; | |
1095 break; | |
1096 } | |
1097 video = SDL_CreateRGBSurface(SDL_SWSURFACE, 0, 0, bpp, | |
1098 Rmask, Gmask, Bmask, 0); | |
1099 if ( video == NULL ) { | |
1100 SDL_OutOfMemory(); | |
1101 return(NULL); | |
1102 } | |
1103 } | |
1104 | |
1105 /* Fill in part of the video surface */ | |
1106 video->flags = 0; /* Clear flags */ | |
1107 video->w = width; | |
1108 video->h = height; | |
1109 video->pitch = SDL_CalculatePitch(video); | |
1110 | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
1111 #ifndef NO_CHANGEDISPLAYSETTINGS |
0 | 1112 /* Set fullscreen mode if appropriate. |
1113 Ugh, since our list of valid video modes comes from | |
1114 the DirectX driver, we may not actually be able to | |
1115 change to the desired resolution here. | |
1116 FIXME: Should we do a closest match? | |
1117 */ | |
1118 if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { | |
1119 DEVMODE settings; | |
1295
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
1120 BOOL changed; |
0 | 1121 |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1122 SDL_memset(&settings, 0, sizeof(DEVMODE)); |
0 | 1123 settings.dmSize = sizeof(DEVMODE); |
1124 settings.dmBitsPerPel = video->format->BitsPerPixel; | |
1125 settings.dmPelsWidth = width; | |
1126 settings.dmPelsHeight = height; | |
1127 settings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL; | |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
1128 if ( width <= (int)SDL_desktop_mode.dmPelsWidth && |
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
1129 height <= (int)SDL_desktop_mode.dmPelsHeight ) { |
1295
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
1130 settings.dmDisplayFrequency = SDL_desktop_mode.dmDisplayFrequency; |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
1131 settings.dmFields |= DM_DISPLAYFREQUENCY; |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
1132 } |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
1133 changed = (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL); |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
1134 if ( ! changed && (settings.dmFields & DM_DISPLAYFREQUENCY) ) { |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
1135 settings.dmFields &= ~DM_DISPLAYFREQUENCY; |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
1136 changed = (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL); |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
1137 } |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
1138 if ( changed ) { |
0 | 1139 video->flags |= SDL_FULLSCREEN; |
304
ec53caed9fb2
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
1140 SDL_fullscreen_mode = settings; |
0 | 1141 } |
1142 } | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
1143 #endif /* !NO_CHANGEDISPLAYSETTINGS */ |
0 | 1144 |
1480 | 1145 style = GetWindowLong(SDL_Window, GWL_STYLE); |
0 | 1146 style &= ~(resizestyle|WS_MAXIMIZE); |
448
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
443
diff
changeset
|
1147 if ( video->flags & SDL_FULLSCREEN ) { |
0 | 1148 style &= ~windowstyle; |
1149 style |= directstyle; | |
1150 } else { | |
1151 if ( flags & SDL_NOFRAME ) { | |
1152 style &= ~windowstyle; | |
1153 style |= directstyle; | |
1154 video->flags |= SDL_NOFRAME; | |
1155 } else { | |
1156 style &= ~directstyle; | |
1157 style |= windowstyle; | |
1158 if ( flags & SDL_RESIZABLE ) { | |
1159 style |= resizestyle; | |
1160 video->flags |= SDL_RESIZABLE; | |
1161 } | |
1162 } | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
1163 #if WS_MAXIMIZE |
0 | 1164 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
|
1165 #endif |
0 | 1166 } |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1167 |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1168 /* DJM: Don't piss of anyone who has setup his own window */ |
1280
f61f045343d3
Re-query the SDL_WINDOWID each time we initialize the video
Sam Lantinga <slouken@libsdl.org>
parents:
1145
diff
changeset
|
1169 if ( !SDL_windowid ) |
1480 | 1170 SetWindowLong(SDL_Window, GWL_STYLE, style); |
0 | 1171 |
1172 /* Resize the window (copied from SDL WinDIB driver) */ | |
1290
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1173 if ( !SDL_windowid && !IsZoomed(SDL_Window) ) { |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1174 RECT bounds; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1175 int x, y; |
448
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
443
diff
changeset
|
1176 HWND top; |
0 | 1177 UINT swp_flags; |
1290
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1178 const char *window = NULL; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1179 const char *center = NULL; |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1180 |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1181 if ( !SDL_windowX && !SDL_windowY ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1182 window = SDL_getenv("SDL_VIDEO_WINDOW_POS"); |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1183 center = SDL_getenv("SDL_VIDEO_CENTERED"); |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1184 if ( window ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1185 if ( SDL_sscanf(window, "%d,%d", &x, &y) == 2 ) { |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1186 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
|
1187 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
|
1188 } |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1189 if ( SDL_strcmp(window, "center") == 0 ) { |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1190 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
|
1191 } |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1192 } |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1193 } |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1194 swp_flags = (SWP_NOCOPYBITS | SWP_SHOWWINDOW); |
0 | 1195 |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1196 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
|
1197 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
|
1198 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
|
1199 bounds.bottom = SDL_windowY+video->h; |
1882 | 1200 AdjustWindowRectEx(&bounds, GetWindowLong(SDL_Window, GWL_STYLE), (GetMenu(SDL_Window) != NULL), 0); |
0 | 1201 width = bounds.right-bounds.left; |
1202 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
|
1203 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
|
1204 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
|
1205 y = (GetSystemMetrics(SM_CYSCREEN)-height)/2; |
971
96671ebc50a4
Date: Mon, 25 Oct 2004 17:30:06 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
901
diff
changeset
|
1206 } else if ( center ) { |
96671ebc50a4
Date: Mon, 25 Oct 2004 17:30:06 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
901
diff
changeset
|
1207 x = (GetSystemMetrics(SM_CXSCREEN)-width)/2; |
96671ebc50a4
Date: Mon, 25 Oct 2004 17:30:06 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
901
diff
changeset
|
1208 y = (GetSystemMetrics(SM_CYSCREEN)-height)/2; |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1209 } else if ( SDL_windowX || SDL_windowY || window ) { |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1210 x = bounds.left; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1211 y = bounds.top; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1212 } else { |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1213 x = y = -1; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1214 swp_flags |= SWP_NOMOVE; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1215 } |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1216 if ( flags & SDL_FULLSCREEN ) { |
448
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
443
diff
changeset
|
1217 top = HWND_TOPMOST; |
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
443
diff
changeset
|
1218 } else { |
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
443
diff
changeset
|
1219 top = HWND_NOTOPMOST; |
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
443
diff
changeset
|
1220 } |
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
443
diff
changeset
|
1221 SetWindowPos(SDL_Window, top, x, y, width, height, swp_flags); |
1291
31331c444ea2
Only save the window position if we're in windowed mode
Sam Lantinga <slouken@libsdl.org>
parents:
1290
diff
changeset
|
1222 if ( !(flags & SDL_FULLSCREEN) ) { |
31331c444ea2
Only save the window position if we're in windowed mode
Sam Lantinga <slouken@libsdl.org>
parents:
1290
diff
changeset
|
1223 SDL_windowX = SDL_bounds.left; |
31331c444ea2
Only save the window position if we're in windowed mode
Sam Lantinga <slouken@libsdl.org>
parents:
1290
diff
changeset
|
1224 SDL_windowY = SDL_bounds.top; |
31331c444ea2
Only save the window position if we're in windowed mode
Sam Lantinga <slouken@libsdl.org>
parents:
1290
diff
changeset
|
1225 } |
0 | 1226 SetForegroundWindow(SDL_Window); |
1227 } | |
1291
31331c444ea2
Only save the window position if we're in windowed mode
Sam Lantinga <slouken@libsdl.org>
parents:
1290
diff
changeset
|
1228 SDL_resizing = 0; |
0 | 1229 |
1230 /* Set up for OpenGL */ | |
1231 if ( WIN_GL_SetupWindow(this) < 0 ) { | |
1232 return(NULL); | |
1233 } | |
1234 video->flags |= SDL_OPENGL; | |
1235 return(video); | |
1236 } | |
1237 | |
1238 /* Set the appropriate window style */ | |
1480 | 1239 style = GetWindowLong(SDL_Window, GWL_STYLE); |
0 | 1240 style &= ~(resizestyle|WS_MAXIMIZE); |
1241 if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { | |
1242 style &= ~windowstyle; | |
1243 style |= directstyle; | |
1244 } else { | |
1245 if ( flags & SDL_NOFRAME ) { | |
1246 style &= ~windowstyle; | |
1247 style |= directstyle; | |
1248 } else { | |
1249 style &= ~directstyle; | |
1250 style |= windowstyle; | |
1251 if ( flags & SDL_RESIZABLE ) { | |
1252 style |= resizestyle; | |
1253 } | |
1254 } | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
1255 #if WS_MAXIMIZE |
0 | 1256 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
|
1257 #endif |
0 | 1258 } |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1259 /* DJM: Don't piss of anyone who has setup his own window */ |
1280
f61f045343d3
Re-query the SDL_WINDOWID each time we initialize the video
Sam Lantinga <slouken@libsdl.org>
parents:
1145
diff
changeset
|
1260 if ( !SDL_windowid ) |
1480 | 1261 SetWindowLong(SDL_Window, GWL_STYLE, style); |
0 | 1262 |
1263 /* Set DirectDraw sharing mode.. exclusive when fullscreen */ | |
1264 if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { | |
1265 sharemode = DDSCL_FULLSCREEN|DDSCL_EXCLUSIVE|DDSCL_ALLOWREBOOT; | |
1266 } else { | |
1267 sharemode = DDSCL_NORMAL; | |
1268 } | |
1269 result = IDirectDraw2_SetCooperativeLevel(ddraw2,SDL_Window,sharemode); | |
1270 if ( result != DD_OK ) { | |
1271 SetDDerror("DirectDraw2::SetCooperativeLevel", result); | |
1272 return(NULL); | |
1273 } | |
1274 | |
1275 /* Set the display mode, if we are in fullscreen mode */ | |
1276 if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { | |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1277 RECT bounds; |
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1278 struct DX5EnumRect *rect; |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1279 int maxRefreshRate; |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1280 |
0 | 1281 /* Cover up desktop during mode change */ |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1282 bounds.left = 0; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1283 bounds.top = 0; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1284 bounds.right = GetSystemMetrics(SM_CXSCREEN); |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1285 bounds.bottom = GetSystemMetrics(SM_CYSCREEN); |
1882 | 1286 AdjustWindowRectEx(&bounds, GetWindowLong(SDL_Window, GWL_STYLE), (GetMenu(SDL_Window) != NULL), 0); |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1287 SetWindowPos(SDL_Window, HWND_TOPMOST, |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1288 bounds.left, bounds.top, |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1289 bounds.right - bounds.left, |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1290 bounds.bottom - bounds.top, SWP_NOCOPYBITS); |
0 | 1291 ShowWindow(SDL_Window, SW_SHOW); |
1292 while ( GetForegroundWindow() != SDL_Window ) { | |
1293 SetForegroundWindow(SDL_Window); | |
1294 SDL_Delay(100); | |
1295 } | |
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1296 |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1297 /* find maximum monitor refresh rate for this resolution */ |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1298 /* Dmitry Yakimov ftech@tula.net */ |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1299 maxRefreshRate = 0; /* system default */ |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1300 for ( rect = enumlists[bpp / 8 - 1]; rect; rect = rect->next ) { |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1301 if ( (width == rect->r.w) && (height == rect->r.h) ) { |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1302 maxRefreshRate = rect->refreshRate; |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1303 break; |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1304 } |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1305 } |
830
58b074c1bc59
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
815
diff
changeset
|
1306 #ifdef DDRAW_DEBUG |
58b074c1bc59
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
815
diff
changeset
|
1307 fprintf(stderr, "refresh rate = %d Hz\n", maxRefreshRate); |
58b074c1bc59
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
815
diff
changeset
|
1308 #endif |
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1309 |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1310 result = IDirectDraw2_SetDisplayMode(ddraw2, width, height, bpp, maxRefreshRate, 0); |
0 | 1311 if ( result != DD_OK ) { |
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1312 result = IDirectDraw2_SetDisplayMode(ddraw2, width, height, bpp, 0, 0); |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1313 if ( result != DD_OK ) { |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1314 /* We couldn't set fullscreen mode, try window */ |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1315 return(DX5_SetVideoMode(this, current, width, height, bpp, flags & ~SDL_FULLSCREEN)); |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
1316 } |
0 | 1317 } |
1318 DX5_DInputReset(this, 1); | |
1319 } else { | |
1320 DX5_DInputReset(this, 0); | |
1321 } | |
1322 DX5_UpdateVideoInfo(this); | |
1323 | |
1324 /* Create a primary DirectDraw surface */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1325 SDL_memset(&ddsd, 0, sizeof(ddsd)); |
0 | 1326 ddsd.dwSize = sizeof(ddsd); |
1327 ddsd.dwFlags = DDSD_CAPS; | |
1328 ddsd.ddsCaps.dwCaps = (DDSCAPS_PRIMARYSURFACE|DDSCAPS_VIDEOMEMORY); | |
1329 if ( (flags & SDL_FULLSCREEN) != SDL_FULLSCREEN ) { | |
1330 /* There's no windowed double-buffering */ | |
1331 flags &= ~SDL_DOUBLEBUF; | |
1332 } | |
1333 if ( (flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF ) { | |
1334 ddsd.dwFlags |= DDSD_BACKBUFFERCOUNT; | |
1335 ddsd.ddsCaps.dwCaps |= (DDSCAPS_COMPLEX|DDSCAPS_FLIP); | |
1336 ddsd.dwBackBufferCount = 1; | |
1337 } | |
1338 result = IDirectDraw2_CreateSurface(ddraw2, &ddsd, &dd_surface1, NULL); | |
1339 if ( (result != DD_OK) && ((flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF) ) { | |
1340 ddsd.dwFlags &= ~DDSD_BACKBUFFERCOUNT; | |
1341 ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_COMPLEX|DDSCAPS_FLIP); | |
1342 ddsd.dwBackBufferCount = 0; | |
1343 result = IDirectDraw2_CreateSurface(ddraw2, | |
1344 &ddsd, &dd_surface1, NULL); | |
1345 } | |
1346 if ( result != DD_OK ) { | |
1347 SetDDerror("DirectDraw2::CreateSurface(PRIMARY)", result); | |
1348 return(NULL); | |
1349 } | |
1350 result = IDirectDrawSurface_QueryInterface(dd_surface1, | |
1351 &IID_IDirectDrawSurface3, (LPVOID *)&SDL_primary); | |
1352 if ( result != DD_OK ) { | |
1353 SetDDerror("DirectDrawSurface::QueryInterface", result); | |
1354 return(NULL); | |
1355 } | |
901
fd4a6847ddc0
Date: Thu, 24 Jun 2004 15:13:40 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
1356 IDirectDrawSurface_Release(dd_surface1); |
0 | 1357 |
1358 /* Get the format of the primary DirectDraw surface */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1359 SDL_memset(&ddsd, 0, sizeof(ddsd)); |
0 | 1360 ddsd.dwSize = sizeof(ddsd); |
1361 ddsd.dwFlags = DDSD_PIXELFORMAT|DDSD_CAPS; | |
1362 result = IDirectDrawSurface3_GetSurfaceDesc(SDL_primary, &ddsd); | |
1363 if ( result != DD_OK ) { | |
901
fd4a6847ddc0
Date: Thu, 24 Jun 2004 15:13:40 +0300 (EEST)
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
1364 SetDDerror("DirectDrawSurface::GetSurfaceDesc", result); |
0 | 1365 return(NULL); |
1366 } | |
1367 if ( ! (ddsd.ddpfPixelFormat.dwFlags&DDPF_RGB) ) { | |
1368 SDL_SetError("Primary DDRAW surface is not RGB format"); | |
1369 return(NULL); | |
1370 } | |
1371 | |
1372 /* Free old palette and create a new one if we're in 8-bit mode */ | |
1373 if ( SDL_palette != NULL ) { | |
1374 IDirectDrawPalette_Release(SDL_palette); | |
1375 SDL_palette = NULL; | |
1376 } | |
1377 #if defined(NONAMELESSUNION) | |
1378 if ( ddsd.ddpfPixelFormat.u1.dwRGBBitCount == 8 ) { | |
1379 #else | |
1380 if ( ddsd.ddpfPixelFormat.dwRGBBitCount == 8 ) { | |
1381 #endif | |
1382 int i; | |
1383 | |
1384 if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { | |
1385 /* We have access to the entire palette */ | |
1386 for ( i=0; i<256; ++i ) { | |
1387 SDL_colors[i].peFlags = | |
1388 (PC_NOCOLLAPSE|PC_RESERVED); | |
1389 SDL_colors[i].peRed = 0; | |
1390 SDL_colors[i].peGreen = 0; | |
1391 SDL_colors[i].peBlue = 0; | |
1392 } | |
1393 } else { | |
1394 /* First 10 colors are reserved by Windows */ | |
1395 for ( i=0; i<10; ++i ) { | |
1396 SDL_colors[i].peFlags = PC_EXPLICIT; | |
1397 SDL_colors[i].peRed = i; | |
1398 SDL_colors[i].peGreen = 0; | |
1399 SDL_colors[i].peBlue = 0; | |
1400 } | |
1401 for ( i=10; i<(10+236); ++i ) { | |
1402 SDL_colors[i].peFlags = PC_NOCOLLAPSE; | |
1403 SDL_colors[i].peRed = 0; | |
1404 SDL_colors[i].peGreen = 0; | |
1405 SDL_colors[i].peBlue = 0; | |
1406 } | |
1407 /* Last 10 colors are reserved by Windows */ | |
1408 for ( i=246; i<256; ++i ) { | |
1409 SDL_colors[i].peFlags = PC_EXPLICIT; | |
1410 SDL_colors[i].peRed = i; | |
1411 SDL_colors[i].peGreen = 0; | |
1412 SDL_colors[i].peBlue = 0; | |
1413 } | |
1414 } | |
1415 result = IDirectDraw2_CreatePalette(ddraw2, | |
1416 (DDPCAPS_8BIT|DDPCAPS_ALLOW256), | |
1417 SDL_colors, &SDL_palette, NULL); | |
1418 if ( result != DD_OK ) { | |
1419 SetDDerror("DirectDraw2::CreatePalette", result); | |
1420 return(NULL); | |
1421 } | |
1422 result = IDirectDrawSurface3_SetPalette(SDL_primary, | |
1423 SDL_palette); | |
1424 if ( result != DD_OK ) { | |
1425 SetDDerror("DirectDrawSurface3::SetPalette", result); | |
1426 return(NULL); | |
1427 } | |
1428 } | |
1429 | |
1430 /* Create our video surface using the same pixel format */ | |
1431 video = current; | |
1432 if ( (width != video->w) || (height != video->h) | |
1433 || (video->format->BitsPerPixel != | |
1434 #if defined(NONAMELESSUNION) | |
1435 ddsd.ddpfPixelFormat.u1.dwRGBBitCount) ) { | |
1436 #else | |
1437 ddsd.ddpfPixelFormat.dwRGBBitCount) ) { | |
1438 #endif | |
1439 SDL_FreeSurface(video); | |
1440 video = SDL_CreateRGBSurface(SDL_SWSURFACE, 0, 0, | |
1441 #if defined(NONAMELESSUNION) | |
1442 ddsd.ddpfPixelFormat.u1.dwRGBBitCount, | |
1443 ddsd.ddpfPixelFormat.u2.dwRBitMask, | |
1444 ddsd.ddpfPixelFormat.u3.dwGBitMask, | |
1445 ddsd.ddpfPixelFormat.u4.dwBBitMask, | |
1446 #else | |
1447 ddsd.ddpfPixelFormat.dwRGBBitCount, | |
1448 ddsd.ddpfPixelFormat.dwRBitMask, | |
1449 ddsd.ddpfPixelFormat.dwGBitMask, | |
1450 ddsd.ddpfPixelFormat.dwBBitMask, | |
1451 #endif | |
1452 0); | |
1453 if ( video == NULL ) { | |
1454 SDL_OutOfMemory(); | |
1455 return(NULL); | |
1456 } | |
1457 video->w = width; | |
1458 video->h = height; | |
1459 video->pitch = 0; | |
1460 } | |
1461 video->flags = 0; /* Clear flags */ | |
1462 | |
1463 /* If not fullscreen, locking is possible, but it doesn't do what | |
1464 the caller really expects -- if the locked surface is written to, | |
1465 the appropriate portion of the entire screen is modified, not | |
1466 the application window, as we would like. | |
1467 Note that it is still possible to write directly to display | |
1468 memory, but the application must respect the clip list of | |
1469 the surface. There might be some odd timing interactions | |
1470 involving clip list updates and background refreshing as | |
1471 Windows moves other windows across our window. | |
1472 We currently don't support this, even though it might be a | |
1473 good idea since BeOS has an implementation of BDirectWindow | |
1474 that does the same thing. This would be most useful for | |
1475 applications that do complete screen updates every frame. | |
1476 -- Fixme? | |
1477 */ | |
1478 if ( (flags & SDL_FULLSCREEN) != SDL_FULLSCREEN ) { | |
1479 /* Necessary if we're going from fullscreen to window */ | |
1480 if ( video->pixels == NULL ) { | |
1481 video->pitch = (width*video->format->BytesPerPixel); | |
1482 /* Pitch needs to be QWORD (8-byte) aligned */ | |
1483 video->pitch = (video->pitch + 7) & ~7; | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1484 video->pixels = (void *)SDL_malloc(video->h*video->pitch); |
0 | 1485 if ( video->pixels == NULL ) { |
1486 if ( video != current ) { | |
1487 SDL_FreeSurface(video); | |
1488 } | |
1489 SDL_OutOfMemory(); | |
1490 return(NULL); | |
1491 } | |
1492 } | |
1493 dd_surface3 = NULL; | |
443
778b970cec12
Added temporarily disabled code for hardware acceleration in windowed mode.
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
1494 #if 0 /* FIXME: enable this when SDL consistently reports lost surfaces */ |
778b970cec12
Added temporarily disabled code for hardware acceleration in windowed mode.
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
1495 if ( (flags & SDL_HWSURFACE) == SDL_HWSURFACE ) { |
778b970cec12
Added temporarily disabled code for hardware acceleration in windowed mode.
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
1496 video->flags |= SDL_HWSURFACE; |
778b970cec12
Added temporarily disabled code for hardware acceleration in windowed mode.
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
1497 } else { |
778b970cec12
Added temporarily disabled code for hardware acceleration in windowed mode.
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
1498 video->flags |= SDL_SWSURFACE; |
778b970cec12
Added temporarily disabled code for hardware acceleration in windowed mode.
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
1499 } |
778b970cec12
Added temporarily disabled code for hardware acceleration in windowed mode.
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
1500 #else |
0 | 1501 video->flags |= SDL_SWSURFACE; |
443
778b970cec12
Added temporarily disabled code for hardware acceleration in windowed mode.
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
1502 #endif |
0 | 1503 if ( (flags & SDL_RESIZABLE) && !(flags & SDL_NOFRAME) ) { |
1504 video->flags |= SDL_RESIZABLE; | |
1505 } | |
1506 if ( flags & SDL_NOFRAME ) { | |
1507 video->flags |= SDL_NOFRAME; | |
1508 } | |
1509 } else { | |
1510 /* Necessary if we're going from window to fullscreen */ | |
1511 if ( video->pixels != NULL ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1512 SDL_free(video->pixels); |
0 | 1513 video->pixels = NULL; |
1514 } | |
1515 dd_surface3 = SDL_primary; | |
1516 video->flags |= SDL_HWSURFACE; | |
1517 } | |
1518 | |
1519 /* See if the primary surface has double-buffering enabled */ | |
1520 if ( (ddsd.ddsCaps.dwCaps & DDSCAPS_FLIP) == DDSCAPS_FLIP ) { | |
1521 video->flags |= SDL_DOUBLEBUF; | |
1522 } | |
1523 | |
1524 /* Allocate the SDL surface associated with the primary surface */ | |
1525 if ( DX5_AllocDDSurface(this, video, dd_surface3, | |
1526 video->flags&SDL_HWSURFACE) < 0 ) { | |
1527 if ( video != current ) { | |
1528 SDL_FreeSurface(video); | |
1529 } | |
1530 return(NULL); | |
1531 } | |
1532 | |
1533 /* Use the appropriate blitting function */ | |
1534 if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { | |
1535 video->flags |= SDL_FULLSCREEN; | |
1536 if ( video->format->palette != NULL ) { | |
1537 video->flags |= SDL_HWPALETTE; | |
1538 } | |
1539 this->UpdateRects = DX5_DirectUpdate; | |
1540 } else { | |
1541 this->UpdateRects = DX5_WindowUpdate; | |
1542 } | |
1543 | |
1544 /* Make our window the proper size, set the clipper, then show it */ | |
1545 if ( (flags & SDL_FULLSCREEN) != SDL_FULLSCREEN ) { | |
1546 /* Create and set a clipper on our primary surface */ | |
1547 if ( SDL_clipper == NULL ) { | |
1548 result = IDirectDraw2_CreateClipper(ddraw2, | |
1549 0, &SDL_clipper, NULL); | |
1550 if ( result != DD_OK ) { | |
1551 if ( video != current ) { | |
1552 SDL_FreeSurface(video); | |
1553 } | |
1554 SetDDerror("DirectDraw2::CreateClipper",result); | |
1555 return(NULL); | |
1556 } | |
1557 } | |
1558 result = IDirectDrawClipper_SetHWnd(SDL_clipper, 0, SDL_Window); | |
1559 if ( result != DD_OK ) { | |
1560 if ( video != current ) { | |
1561 SDL_FreeSurface(video); | |
1562 } | |
1563 SetDDerror("DirectDrawClipper::SetHWnd", result); | |
1564 return(NULL); | |
1565 } | |
1566 result = IDirectDrawSurface3_SetClipper(SDL_primary, | |
1567 SDL_clipper); | |
1568 if ( result != DD_OK ) { | |
1569 if ( video != current ) { | |
1570 SDL_FreeSurface(video); | |
1571 } | |
1572 SetDDerror("DirectDrawSurface3::SetClipper", result); | |
1573 return(NULL); | |
1574 } | |
1575 | |
1290
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1576 /* Resize the window (copied from SDL WinDIB driver) */ |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1577 if ( !SDL_windowid && !IsZoomed(SDL_Window) ) { |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1578 RECT bounds; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1579 int x, y; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1580 UINT swp_flags; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1581 const char *window = NULL; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1582 const char *center = NULL; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1583 |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1584 if ( !SDL_windowX && !SDL_windowY ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1585 window = SDL_getenv("SDL_VIDEO_WINDOW_POS"); |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1586 center = SDL_getenv("SDL_VIDEO_CENTERED"); |
1290
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1587 if ( window ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1588 if ( SDL_sscanf(window, "%d,%d", &x, &y) == 2 ) { |
1290
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1589 SDL_windowX = x; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1590 SDL_windowY = y; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1591 } |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1592 if ( SDL_strcmp(window, "center") == 0 ) { |
1290
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1593 center = window; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1594 } |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1595 } |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1596 } |
1290
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1597 swp_flags = SWP_NOCOPYBITS; |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1598 |
1290
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1599 bounds.left = SDL_windowX; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1600 bounds.top = SDL_windowY; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1601 bounds.right = SDL_windowX+video->w; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1602 bounds.bottom = SDL_windowY+video->h; |
1882 | 1603 AdjustWindowRectEx(&bounds, GetWindowLong(SDL_Window, GWL_STYLE), (GetMenu(SDL_Window) != NULL), 0); |
1290
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1604 width = bounds.right-bounds.left; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1605 height = bounds.bottom-bounds.top; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1606 if ( center ) { |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1607 x = (GetSystemMetrics(SM_CXSCREEN)-width)/2; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1608 y = (GetSystemMetrics(SM_CYSCREEN)-height)/2; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1609 } else if ( SDL_windowX || SDL_windowY || window ) { |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1610 x = bounds.left; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1611 y = bounds.top; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1612 } else { |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1613 x = y = -1; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1614 swp_flags |= SWP_NOMOVE; |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1615 } |
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
1616 SetWindowPos(SDL_Window, HWND_NOTOPMOST, x, y, width, height, swp_flags); |
1291
31331c444ea2
Only save the window position if we're in windowed mode
Sam Lantinga <slouken@libsdl.org>
parents:
1290
diff
changeset
|
1617 SDL_windowX = SDL_bounds.left; |
31331c444ea2
Only save the window position if we're in windowed mode
Sam Lantinga <slouken@libsdl.org>
parents:
1290
diff
changeset
|
1618 SDL_windowY = SDL_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
|
1619 } |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
830
diff
changeset
|
1620 |
0 | 1621 } |
1622 ShowWindow(SDL_Window, SW_SHOW); | |
1623 SetForegroundWindow(SDL_Window); | |
1291
31331c444ea2
Only save the window position if we're in windowed mode
Sam Lantinga <slouken@libsdl.org>
parents:
1290
diff
changeset
|
1624 SDL_resizing = 0; |
0 | 1625 |
1523 | 1626 /* JC 14 Mar 2006 |
1627 Flush the message loop or this can cause big problems later | |
1628 Especially if the user decides to use dialog boxes or assert()! | |
1629 */ | |
1630 WIN_FlushMessageQueue(); | |
1631 | |
0 | 1632 /* We're live! */ |
1633 return(video); | |
1634 } | |
1635 | |
1636 struct private_hwdata { | |
1637 LPDIRECTDRAWSURFACE3 dd_surface; | |
1638 LPDIRECTDRAWSURFACE3 dd_writebuf; | |
1639 }; | |
1640 | |
1641 static int DX5_AllocDDSurface(_THIS, SDL_Surface *surface, | |
1642 LPDIRECTDRAWSURFACE3 requested, Uint32 flag) | |
1643 { | |
1644 LPDIRECTDRAWSURFACE dd_surface1; | |
1645 LPDIRECTDRAWSURFACE3 dd_surface3; | |
1646 DDSURFACEDESC ddsd; | |
1647 HRESULT result; | |
1648 | |
1649 /* Clear the hardware flag, in case we fail */ | |
1650 surface->flags &= ~flag; | |
1651 | |
1652 /* Allocate the hardware acceleration data */ | |
1653 surface->hwdata = (struct private_hwdata *) | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1654 SDL_malloc(sizeof(*surface->hwdata)); |
0 | 1655 if ( surface->hwdata == NULL ) { |
1656 SDL_OutOfMemory(); | |
1657 return(-1); | |
1658 } | |
1659 dd_surface3 = NULL; | |
1660 | |
1661 /* Set up the surface description */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1662 SDL_memset(&ddsd, 0, sizeof(ddsd)); |
0 | 1663 ddsd.dwSize = sizeof(ddsd); |
1664 ddsd.dwFlags = (DDSD_WIDTH|DDSD_HEIGHT|DDSD_CAPS| | |
1665 DDSD_PITCH|DDSD_PIXELFORMAT); | |
1666 ddsd.dwWidth = surface->w; | |
1667 ddsd.dwHeight= surface->h; | |
1668 #if defined(NONAMELESSUNION) | |
1669 ddsd.u1.lPitch = surface->pitch; | |
1670 #else | |
1671 ddsd.lPitch = surface->pitch; | |
1672 #endif | |
1673 if ( (flag & SDL_HWSURFACE) == SDL_HWSURFACE ) { | |
1674 ddsd.ddsCaps.dwCaps = | |
1675 (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY); | |
1676 } else { | |
1677 ddsd.ddsCaps.dwCaps = | |
1678 (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); | |
1679 } | |
1680 ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); | |
1681 ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; | |
1682 if ( surface->format->palette ) { | |
1683 ddsd.ddpfPixelFormat.dwFlags |= DDPF_PALETTEINDEXED8; | |
1684 } | |
1685 #if defined(NONAMELESSUNION) | |
1686 ddsd.ddpfPixelFormat.u1.dwRGBBitCount = surface->format->BitsPerPixel; | |
1687 ddsd.ddpfPixelFormat.u2.dwRBitMask = surface->format->Rmask; | |
1688 ddsd.ddpfPixelFormat.u3.dwGBitMask = surface->format->Gmask; | |
1689 ddsd.ddpfPixelFormat.u4.dwBBitMask = surface->format->Bmask; | |
1690 #else | |
1691 ddsd.ddpfPixelFormat.dwRGBBitCount = surface->format->BitsPerPixel; | |
1692 ddsd.ddpfPixelFormat.dwRBitMask = surface->format->Rmask; | |
1693 ddsd.ddpfPixelFormat.dwGBitMask = surface->format->Gmask; | |
1694 ddsd.ddpfPixelFormat.dwBBitMask = surface->format->Bmask; | |
1695 #endif | |
1696 | |
1697 /* Create the DirectDraw video surface */ | |
1698 if ( requested != NULL ) { | |
1699 dd_surface3 = requested; | |
1700 } else { | |
1701 result = IDirectDraw2_CreateSurface(ddraw2, | |
1702 &ddsd, &dd_surface1, NULL); | |
1703 if ( result != DD_OK ) { | |
1704 SetDDerror("DirectDraw2::CreateSurface", result); | |
1705 goto error_end; | |
1706 } | |
1707 result = IDirectDrawSurface_QueryInterface(dd_surface1, | |
1708 &IID_IDirectDrawSurface3, (LPVOID *)&dd_surface3); | |
1709 IDirectDrawSurface_Release(dd_surface1); | |
1710 if ( result != DD_OK ) { | |
1711 SetDDerror("DirectDrawSurface::QueryInterface", result); | |
1712 goto error_end; | |
1713 } | |
1714 } | |
1715 | |
1716 if ( (flag & SDL_HWSURFACE) == SDL_HWSURFACE ) { | |
1717 /* Check to see whether the surface actually ended up | |
1718 in video memory, and fail if not. We expect the | |
1719 surfaces we create here to actually be in hardware! | |
1720 */ | |
1721 result = IDirectDrawSurface3_GetCaps(dd_surface3,&ddsd.ddsCaps); | |
1722 if ( result != DD_OK ) { | |
1723 SetDDerror("DirectDrawSurface3::GetCaps", result); | |
1724 goto error_end; | |
1725 } | |
1726 if ( (ddsd.ddsCaps.dwCaps&DDSCAPS_VIDEOMEMORY) != | |
1727 DDSCAPS_VIDEOMEMORY ) { | |
1728 SDL_SetError("No room in video memory"); | |
1729 goto error_end; | |
1730 } | |
1731 } else { | |
1732 /* Try to hook our surface memory */ | |
1733 ddsd.dwFlags = DDSD_LPSURFACE; | |
1734 ddsd.lpSurface = surface->pixels; | |
1735 result = IDirectDrawSurface3_SetSurfaceDesc(dd_surface3, | |
1736 &ddsd, 0); | |
1737 if ( result != DD_OK ) { | |
1738 SetDDerror("DirectDraw2::SetSurfaceDesc", result); | |
1739 goto error_end; | |
1740 } | |
1741 | |
1742 } | |
1743 | |
1744 /* Make sure the surface format was set properly */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1745 SDL_memset(&ddsd, 0, sizeof(ddsd)); |
0 | 1746 ddsd.dwSize = sizeof(ddsd); |
1747 result = IDirectDrawSurface3_Lock(dd_surface3, NULL, | |
443
778b970cec12
Added temporarily disabled code for hardware acceleration in windowed mode.
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
1748 &ddsd, (DDLOCK_NOSYSLOCK|DDLOCK_WAIT), NULL); |
0 | 1749 if ( result != DD_OK ) { |
1750 SetDDerror("DirectDrawSurface3::Lock", result); | |
1751 goto error_end; | |
1752 } | |
1753 IDirectDrawSurface3_Unlock(dd_surface3, NULL); | |
1754 | |
1755 if ( (flag & SDL_HWSURFACE) == SDL_SWSURFACE ) { | |
1756 if ( ddsd.lpSurface != surface->pixels ) { | |
1757 SDL_SetError("DDraw didn't use SDL surface memory"); | |
1758 goto error_end; | |
1759 } | |
1760 if ( | |
1761 #if defined(NONAMELESSUNION) | |
1762 ddsd.u1.lPitch | |
1763 #else | |
1764 ddsd.lPitch | |
1765 #endif | |
1766 != (LONG)surface->pitch ) { | |
1767 SDL_SetError("DDraw created surface with wrong pitch"); | |
1768 goto error_end; | |
1769 } | |
1770 } else { | |
1771 #if defined(NONAMELESSUNION) | |
1772 surface->pitch = (Uint16)ddsd.u1.lPitch; | |
1773 #else | |
1774 surface->pitch = (Uint16)ddsd.lPitch; | |
1775 #endif | |
1776 } | |
1777 #if defined(NONAMELESSUNION) | |
1778 if ( (ddsd.ddpfPixelFormat.u1.dwRGBBitCount != | |
1779 surface->format->BitsPerPixel) || | |
1780 (ddsd.ddpfPixelFormat.u2.dwRBitMask != surface->format->Rmask) || | |
1781 (ddsd.ddpfPixelFormat.u3.dwGBitMask != surface->format->Gmask) || | |
1782 (ddsd.ddpfPixelFormat.u4.dwBBitMask != surface->format->Bmask) ){ | |
1783 #else | |
1784 if ( (ddsd.ddpfPixelFormat.dwRGBBitCount != | |
1785 surface->format->BitsPerPixel) || | |
1786 (ddsd.ddpfPixelFormat.dwRBitMask != surface->format->Rmask) || | |
1787 (ddsd.ddpfPixelFormat.dwGBitMask != surface->format->Gmask) || | |
1788 (ddsd.ddpfPixelFormat.dwBBitMask != surface->format->Bmask) ){ | |
1789 #endif | |
1790 SDL_SetError("DDraw didn't use SDL surface description"); | |
1791 goto error_end; | |
1792 } | |
1793 if ( (ddsd.dwWidth != (DWORD)surface->w) || | |
1794 (ddsd.dwHeight != (DWORD)surface->h) ) { | |
1795 SDL_SetError("DDraw created surface with wrong size"); | |
1796 goto error_end; | |
1797 } | |
1798 | |
1799 /* Set the surface private data */ | |
1800 surface->flags |= flag; | |
1801 surface->hwdata->dd_surface = dd_surface3; | |
1802 if ( (surface->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF ) { | |
1803 LPDIRECTDRAWSURFACE3 dd_writebuf; | |
1804 | |
1805 ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; | |
1806 result = IDirectDrawSurface3_GetAttachedSurface(dd_surface3, | |
1807 &ddsd.ddsCaps, &dd_writebuf); | |
1808 if ( result != DD_OK ) { | |
1809 SetDDerror("DirectDrawSurface3::GetAttachedSurface", | |
1810 result); | |
1811 } else { | |
1812 dd_surface3 = dd_writebuf; | |
1813 } | |
1814 } | |
1815 surface->hwdata->dd_writebuf = dd_surface3; | |
1816 | |
1817 /* We're ready to go! */ | |
1818 return(0); | |
1819 | |
1820 /* Okay, so goto's are cheesy, but there are so many possible | |
1821 errors in this function, and the cleanup is the same in | |
1822 every single case. Is there a better way, other than deeply | |
1823 nesting the code? | |
1824 */ | |
1825 error_end: | |
1826 if ( (dd_surface3 != NULL) && (dd_surface3 != requested) ) { | |
1827 IDirectDrawSurface_Release(dd_surface3); | |
1828 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1829 SDL_free(surface->hwdata); |
0 | 1830 surface->hwdata = NULL; |
1831 return(-1); | |
1832 } | |
1833 | |
1834 static int DX5_AllocHWSurface(_THIS, SDL_Surface *surface) | |
1835 { | |
1836 /* DDraw limitation -- you need to set cooperative level first */ | |
1837 if ( SDL_primary == NULL ) { | |
1838 SDL_SetError("You must set a non-GL video mode first"); | |
1839 return(-1); | |
1840 } | |
1841 return(DX5_AllocDDSurface(this, surface, NULL, SDL_HWSURFACE)); | |
1842 } | |
1843 | |
1
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
1844 #ifdef DDRAW_DEBUG |
0 | 1845 void PrintSurface(char *title, LPDIRECTDRAWSURFACE3 surface, Uint32 flags) |
1846 { | |
1847 DDSURFACEDESC ddsd; | |
1848 | |
1849 /* Lock and load! */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1850 SDL_memset(&ddsd, 0, sizeof(ddsd)); |
0 | 1851 ddsd.dwSize = sizeof(ddsd); |
1852 if ( IDirectDrawSurface3_Lock(surface, NULL, &ddsd, | |
1853 (DDLOCK_NOSYSLOCK|DDLOCK_WAIT), NULL) != DD_OK ) { | |
1854 return; | |
1855 } | |
1856 IDirectDrawSurface3_Unlock(surface, NULL); | |
1857 | |
1858 fprintf(stderr, "%s:\n", title); | |
1859 fprintf(stderr, "\tSize: %dx%d in %s at %ld bpp (pitch = %ld)\n", | |
1860 ddsd.dwWidth, ddsd.dwHeight, | |
1861 (flags & SDL_HWSURFACE) ? "hardware" : "software", | |
1862 #if defined(NONAMELESSUNION) | |
1863 ddsd.ddpfPixelFormat.u1.dwRGBBitCount, ddsd.u1.lPitch); | |
1864 #else | |
1865 ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.lPitch); | |
1866 #endif | |
1867 fprintf(stderr, "\tR = 0x%X, G = 0x%X, B = 0x%X\n", | |
1868 #if defined(NONAMELESSUNION) | |
1869 ddsd.ddpfPixelFormat.u2.dwRBitMask, | |
1870 ddsd.ddpfPixelFormat.u3.dwGBitMask, | |
1871 ddsd.ddpfPixelFormat.u4.dwBBitMask); | |
1872 #else | |
1873 ddsd.ddpfPixelFormat.dwRBitMask, | |
1874 ddsd.ddpfPixelFormat.dwGBitMask, | |
1875 ddsd.ddpfPixelFormat.dwBBitMask); | |
1876 #endif | |
1877 } | |
1
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
1878 #endif /* DDRAW_DEBUG */ |
0 | 1879 |
1880 static int DX5_HWAccelBlit(SDL_Surface *src, SDL_Rect *srcrect, | |
1881 SDL_Surface *dst, SDL_Rect *dstrect) | |
1882 { | |
1883 LPDIRECTDRAWSURFACE3 src_surface; | |
1884 LPDIRECTDRAWSURFACE3 dst_surface; | |
1885 DWORD flags; | |
1886 RECT rect; | |
1887 HRESULT result; | |
1888 | |
1889 /* Set it up.. the desination must have a DDRAW surface */ | |
1890 src_surface = src->hwdata->dd_writebuf; | |
1891 dst_surface = dst->hwdata->dd_writebuf; | |
468
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
1892 rect.top = (LONG)srcrect->y; |
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
1893 rect.bottom = (LONG)srcrect->y+srcrect->h; |
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
1894 rect.left = (LONG)srcrect->x; |
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
1895 rect.right = (LONG)srcrect->x+srcrect->w; |
0 | 1896 if ( (src->flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY ) |
1897 flags = DDBLTFAST_SRCCOLORKEY; | |
1898 else | |
1899 flags = DDBLTFAST_NOCOLORKEY; | |
1900 /* FIXME: We can remove this flag for _really_ fast blit queuing, | |
1901 but it will affect the return values of locks and flips. | |
1902 */ | |
1903 flags |= DDBLTFAST_WAIT; | |
1904 | |
1905 /* Do the blit! */ | |
1906 result = IDirectDrawSurface3_BltFast(dst_surface, | |
1907 dstrect->x, dstrect->y, src_surface, &rect, flags); | |
1908 if ( result != DD_OK ) { | |
1909 if ( result == DDERR_SURFACELOST ) { | |
1910 result = IDirectDrawSurface3_Restore(src_surface); | |
1911 result = IDirectDrawSurface3_Restore(dst_surface); | |
1912 /* The surfaces need to be reloaded with artwork */ | |
1913 SDL_SetError("Blit surfaces were lost, reload them"); | |
1914 return(-2); | |
1915 } | |
1916 SetDDerror("IDirectDrawSurface3::BltFast", result); | |
1917 #ifdef DDRAW_DEBUG | |
1918 fprintf(stderr, "Original dest rect: %dx%d at %d,%d\n", dstrect->w, dstrect->h, dstrect->x, dstrect->y); | |
1919 fprintf(stderr, "HW accelerated %sblit to from 0x%p to 0x%p at (%d,%d)\n", | |
1920 (src->flags & SDL_SRCCOLORKEY) ? "colorkey " : "", src, dst, | |
1921 dstrect->x, dstrect->y); | |
1922 PrintSurface("SRC", src_surface, src->flags); | |
1923 PrintSurface("DST", dst_surface, dst->flags); | |
1924 fprintf(stderr, "Source rectangle: (%d,%d) - (%d,%d)\n", | |
1925 rect.left, rect.top, rect.right, rect.bottom); | |
1926 #endif | |
1927 /* Unexpected error, fall back to software blit */ | |
1928 return(src->map->sw_blit(src, srcrect, dst, dstrect)); | |
1929 } | |
1930 return(0); | |
1931 } | |
1932 | |
1933 static int DX5_CheckHWBlit(_THIS, SDL_Surface *src, SDL_Surface *dst) | |
1934 { | |
1935 int accelerated; | |
1936 | |
1937 /* We need to have a DDraw surface for HW blits */ | |
1938 if ( (src->flags & SDL_HWSURFACE) == SDL_SWSURFACE ) { | |
1939 /* Allocate a DDraw surface for the blit */ | |
1940 if ( src->hwdata == NULL ) { | |
1941 DX5_AllocDDSurface(this, src, NULL, SDL_SWSURFACE); | |
1942 } | |
1943 } | |
1944 if ( src->hwdata == NULL ) { | |
1945 return(0); | |
1946 } | |
1947 | |
1948 /* Set initial acceleration on */ | |
1949 src->flags |= SDL_HWACCEL; | |
1950 | |
1951 /* Set the surface attributes */ | |
1952 if ( (src->flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY ) { | |
1953 if ( DX5_SetHWColorKey(this, src, src->format->colorkey) < 0 ) { | |
1954 src->flags &= ~SDL_HWACCEL; | |
1955 } | |
1956 } | |
1957 if ( (src->flags & SDL_SRCALPHA) == SDL_SRCALPHA ) { | |
1958 if ( DX5_SetHWAlpha(this, src, src->format->alpha) < 0 ) { | |
1959 src->flags &= ~SDL_HWACCEL; | |
1960 } | |
1961 } | |
1962 | |
1963 /* Check to see if final surface blit is accelerated */ | |
1964 accelerated = !!(src->flags & SDL_HWACCEL); | |
1965 if ( accelerated ) { | |
1966 #ifdef DDRAW_DEBUG | |
1967 fprintf(stderr, "Setting accelerated blit on 0x%p\n", src); | |
1968 #endif | |
1969 src->map->hw_blit = DX5_HWAccelBlit; | |
1970 } | |
1971 return(accelerated); | |
1972 } | |
1973 | |
1974 static int DX5_FillHWRect(_THIS, SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color) | |
1975 { | |
1976 LPDIRECTDRAWSURFACE3 dst_surface; | |
1977 RECT area; | |
1978 DDBLTFX bltfx; | |
1979 HRESULT result; | |
1980 | |
1981 #ifdef DDRAW_DEBUG | |
1982 fprintf(stderr, "HW accelerated fill at (%d,%d)\n", dstrect->x, dstrect->y); | |
1983 #endif | |
1984 dst_surface = dst->hwdata->dd_writebuf; | |
468
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
1985 area.top = (LONG)dstrect->y; |
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
1986 area.bottom = (LONG)dstrect->y+dstrect->h; |
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
1987 area.left = (LONG)dstrect->x; |
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
1988 area.right = (LONG)dstrect->x+dstrect->w; |
0 | 1989 bltfx.dwSize = sizeof(bltfx); |
1990 #if defined(NONAMELESSUNION) | |
1991 bltfx.u5.dwFillColor = color; | |
1992 #else | |
1993 bltfx.dwFillColor = color; | |
1994 #endif | |
1995 result = IDirectDrawSurface3_Blt(dst_surface, | |
1996 &area, NULL, NULL, DDBLT_COLORFILL|DDBLT_WAIT, &bltfx); | |
1997 if ( result == DDERR_SURFACELOST ) { | |
1998 IDirectDrawSurface3_Restore(dst_surface); | |
1999 result = IDirectDrawSurface3_Blt(dst_surface, | |
2000 &area, NULL, NULL, DDBLT_COLORFILL|DDBLT_WAIT, &bltfx); | |
2001 } | |
2002 if ( result != DD_OK ) { | |
2003 SetDDerror("IDirectDrawSurface3::Blt", result); | |
2004 return(-1); | |
2005 } | |
2006 return(0); | |
2007 } | |
2008 | |
2009 static int DX5_SetHWColorKey(_THIS, SDL_Surface *surface, Uint32 key) | |
2010 { | |
2011 DDCOLORKEY colorkey; | |
2012 HRESULT result; | |
2013 | |
2014 /* Set the surface colorkey */ | |
2015 colorkey.dwColorSpaceLowValue = key; | |
2016 colorkey.dwColorSpaceHighValue = key; | |
2017 result = IDirectDrawSurface3_SetColorKey( | |
2018 surface->hwdata->dd_surface, DDCKEY_SRCBLT, &colorkey); | |
2019 if ( result != DD_OK ) { | |
2020 SetDDerror("IDirectDrawSurface3::SetColorKey", result); | |
2021 return(-1); | |
2022 } | |
2023 return(0); | |
2024 } | |
2025 static int DX5_SetHWAlpha(_THIS, SDL_Surface *surface, Uint8 alpha) | |
2026 { | |
2027 return(-1); | |
2028 } | |
2029 | |
2030 static int DX5_LockHWSurface(_THIS, SDL_Surface *surface) | |
2031 { | |
2032 HRESULT result; | |
2033 LPDIRECTDRAWSURFACE3 dd_surface; | |
2034 DDSURFACEDESC ddsd; | |
2035 | |
2036 /* Lock and load! */ | |
2037 dd_surface = surface->hwdata->dd_writebuf; | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
2038 SDL_memset(&ddsd, 0, sizeof(ddsd)); |
0 | 2039 ddsd.dwSize = sizeof(ddsd); |
2040 result = IDirectDrawSurface3_Lock(dd_surface, NULL, &ddsd, | |
2041 (DDLOCK_NOSYSLOCK|DDLOCK_WAIT), NULL); | |
2042 if ( result == DDERR_SURFACELOST ) { | |
2043 result = IDirectDrawSurface3_Restore( | |
2044 surface->hwdata->dd_surface); | |
2045 result = IDirectDrawSurface3_Lock(dd_surface, NULL, &ddsd, | |
2046 (DDLOCK_NOSYSLOCK|DDLOCK_WAIT), NULL); | |
2047 } | |
2048 if ( result != DD_OK ) { | |
2049 SetDDerror("DirectDrawSurface3::Lock", result); | |
2050 return(-1); | |
2051 } | |
2052 /* Pitch might have changed -- recalculate pitch and offset */ | |
2053 #if defined(NONAMELESSUNION) | |
2054 if ( surface->pitch != ddsd.u1.lPitch ) { | |
2055 surface->pitch = ddsd.u1.lPitch; | |
2056 #else | |
2057 if ( surface->pitch != ddsd.lPitch ) { | |
2058 surface->pitch = (Uint16)ddsd.lPitch; | |
2059 #endif | |
2060 surface->offset = | |
2061 ((ddsd.dwHeight-surface->h)/2)*surface->pitch + | |
2062 ((ddsd.dwWidth-surface->w)/2)* | |
2063 surface->format->BytesPerPixel; | |
2064 } | |
2065 surface->pixels = ddsd.lpSurface; | |
2066 return(0); | |
2067 } | |
2068 | |
2069 static void DX5_UnlockHWSurface(_THIS, SDL_Surface *surface) | |
2070 { | |
2071 IDirectDrawSurface3_Unlock(surface->hwdata->dd_writebuf, NULL); | |
2072 surface->pixels = NULL; | |
2073 } | |
2074 | |
2075 static int DX5_FlipHWSurface(_THIS, SDL_Surface *surface) | |
2076 { | |
2077 HRESULT result; | |
2078 LPDIRECTDRAWSURFACE3 dd_surface; | |
2079 | |
2080 dd_surface = surface->hwdata->dd_surface; | |
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
2081 |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
2082 /* to prevent big slowdown on fast computers, wait here instead of driver ring 0 code */ |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
2083 /* Dmitry Yakimov (ftech@tula.net) */ |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
2084 while(IDirectDrawSurface3_GetFlipStatus(dd_surface, DDGBS_ISBLTDONE) == DDERR_WASSTILLDRAWING); |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
2085 |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
2086 result = IDirectDrawSurface3_Flip(dd_surface, NULL, DDFLIP_WAIT); |
0 | 2087 if ( result == DDERR_SURFACELOST ) { |
2088 result = IDirectDrawSurface3_Restore( | |
2089 surface->hwdata->dd_surface); | |
809
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
2090 while(IDirectDrawSurface3_GetFlipStatus(dd_surface, DDGBS_ISBLTDONE) == DDERR_WASSTILLDRAWING); |
dba98fb391e7
Date: Tue, 13 Jan 2004 19:25:37 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
2091 result = IDirectDrawSurface3_Flip(dd_surface, NULL, DDFLIP_WAIT); |
0 | 2092 } |
2093 if ( result != DD_OK ) { | |
2094 SetDDerror("DirectDrawSurface3::Flip", result); | |
2095 return(-1); | |
2096 } | |
2097 return(0); | |
2098 } | |
2099 | |
2100 static void DX5_FreeHWSurface(_THIS, SDL_Surface *surface) | |
2101 { | |
2102 if ( surface->hwdata ) { | |
2103 if ( surface->hwdata->dd_surface != SDL_primary ) { | |
2104 IDirectDrawSurface3_Release(surface->hwdata->dd_surface); | |
2105 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
2106 SDL_free(surface->hwdata); |
0 | 2107 surface->hwdata = NULL; |
2108 } | |
2109 } | |
2110 | |
2111 void DX5_WindowUpdate(_THIS, int numrects, SDL_Rect *rects) | |
2112 { | |
2113 HRESULT result; | |
2114 int i; | |
2115 RECT src, dst; | |
2116 | |
2117 for ( i=0; i<numrects; ++i ) { | |
468
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
2118 src.top = (LONG)rects[i].y; |
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
2119 src.bottom = (LONG)rects[i].y+rects[i].h; |
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
2120 src.left = (LONG)rects[i].x; |
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
2121 src.right = (LONG)rects[i].x+rects[i].w; |
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
2122 dst.top = SDL_bounds.top+src.top; |
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
2123 dst.left = SDL_bounds.left+src.left; |
0 | 2124 dst.bottom = SDL_bounds.top+src.bottom; |
468
0b0c2e63eb27
Fixed 2048 pixel limitation in DirectX blit code
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
2125 dst.right = SDL_bounds.left+src.right; |
0 | 2126 result = IDirectDrawSurface3_Blt(SDL_primary, &dst, |
2127 this->screen->hwdata->dd_surface, &src, | |
2128 DDBLT_WAIT, NULL); | |
2129 /* Doh! Check for lost surface and restore it */ | |
2130 if ( result == DDERR_SURFACELOST ) { | |
2131 IDirectDrawSurface3_Restore(SDL_primary); | |
2132 IDirectDrawSurface3_Blt(SDL_primary, &dst, | |
2133 this->screen->hwdata->dd_surface, &src, | |
2134 DDBLT_WAIT, NULL); | |
2135 } | |
2136 } | |
2137 } | |
2138 | |
2139 void DX5_DirectUpdate(_THIS, int numrects, SDL_Rect *rects) | |
2140 { | |
2141 } | |
2142 | |
2143 /* Compress a full palette into the limited number of colors given to us | |
2144 by windows. | |
2145 | |
2146 The "best" way to do this is to sort the colors by diversity and place | |
2147 the most diverse colors into the limited palette. Unfortunately this | |
2148 results in widely varying colors being displayed in the interval during | |
2149 which the windows palette has been set, and the mapping of the shadow | |
2150 surface to the new palette. This is especially noticeable during fades. | |
2151 | |
2152 To deal with this problem, we can copy a predetermined portion of the | |
2153 full palette, and use that as the limited palette. This allows colors | |
2154 to fade smoothly as the remapping is very similar on each palette change. | |
2155 Unfortunately, this breaks applications which partition the palette into | |
2156 distinct and widely varying areas, expecting all colors to be available. | |
2157 | |
2158 I'm making them both available, chosen at compile time. | |
2159 If you want the chunk-o-palette algorithm, define SIMPLE_COMPRESSION, | |
2160 otherwise the sort-by-diversity algorithm will be used. | |
2161 */ | |
2162 #define SIMPLE_COMPRESSION | |
2163 #define CS_CS_DIST(A, B) ({ \ | |
2164 int r = (A.r - B.r); \ | |
2165 int g = (A.g - B.g); \ | |
2166 int b = (A.b - B.b); \ | |
2167 (r*r + g*g + b*b); \ | |
2168 }) | |
2169 static void DX5_CompressPalette(_THIS, SDL_Color *colors, int ncolors, int maxcolors) | |
2170 { | |
2171 #ifdef SIMPLE_COMPRESSION | |
2172 int i, j; | |
2173 #else | |
2174 static SDL_Color zero = { 0, 0, 0, 0 }; | |
2175 int i, j; | |
2176 int max, dist; | |
2177 int prev, next; | |
2178 int *pool; | |
2179 int *seen, *order; | |
2180 #endif | |
2181 | |
2182 /* Does this happen? */ | |
2183 if ( maxcolors > ncolors ) { | |
2184 maxcolors = ncolors; | |
2185 } | |
2186 | |
2187 #ifdef SIMPLE_COMPRESSION | |
2188 /* Just copy the first "maxcolors" colors */ | |
2189 for ( j=10, i=0; i<maxcolors; ++i, ++j ) { | |
2190 SDL_colors[j].peRed = colors[i].r; | |
2191 SDL_colors[j].peGreen = colors[i].g; | |
2192 SDL_colors[j].peBlue = colors[i].b; | |
2193 } | |
2194 #else | |
2195 /* Allocate memory for the arrays we use */ | |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
2196 pool = SDL_stack_alloc(int, 2*ncolors); |
0 | 2197 if ( pool == NULL ) { |
2198 /* No worries, just return */; | |
2199 return; | |
2200 } | |
2201 seen = pool; | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
2202 SDL_memset(seen, 0, ncolors*sizeof(int)); |
0 | 2203 order = pool+ncolors; |
2204 | |
2205 /* Start with the brightest color */ | |
2206 max = 0; | |
2207 for ( i=0; i<ncolors; ++i ) { | |
2208 dist = CS_CS_DIST(zero, colors[i]); | |
2209 if ( dist >= max ) { | |
2210 max = dist; | |
2211 next = i; | |
2212 } | |
2213 } | |
2214 j = 0; | |
2215 order[j++] = next; | |
2216 seen[next] = 1; | |
2217 prev = next; | |
2218 | |
2219 /* Keep going through all the colors */ | |
2220 while ( j < maxcolors ) { | |
2221 max = 0; | |
2222 for ( i=0; i<ncolors; ++i ) { | |
2223 if ( seen[i] ) { | |
2224 continue; | |
2225 } | |
2226 dist = CS_CS_DIST(colors[i], colors[prev]); | |
2227 if ( dist >= max ) { | |
2228 max = dist; | |
2229 next = i; | |
2230 } | |
2231 } | |
2232 order[j++] = next; | |
2233 seen[next] = 1; | |
2234 prev = next; | |
2235 } | |
2236 | |
2237 /* Compress the colors to the palette */ | |
2238 for ( j=10, i=0; i<maxcolors; ++i, ++j ) { | |
2239 SDL_colors[j].peRed = colors[order[i]].r; | |
2240 SDL_colors[j].peGreen = colors[order[i]].g; | |
2241 SDL_colors[j].peBlue = colors[order[i]].b; | |
2242 } | |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
2243 SDL_stack_free(pool); |
0 | 2244 #endif /* SIMPLE_COMPRESSION */ |
2245 } | |
2246 | |
2247 /* Set the system colormap in both fullscreen and windowed modes */ | |
2248 int DX5_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) | |
2249 { | |
2250 int i; | |
2251 int alloct_all; | |
2252 | |
2253 /* Copy palette colors into display palette */ | |
2254 alloct_all = 0; | |
2255 if ( SDL_palette != NULL ) { | |
2256 if ( (this->screen->flags&SDL_FULLSCREEN) == SDL_FULLSCREEN ) { | |
2257 /* We can set all entries explicitly */ | |
2258 for ( i=0; i< ncolors; ++i ) { | |
2259 int j = firstcolor + i; | |
2260 SDL_colors[j].peRed = colors[i].r; | |
2261 SDL_colors[j].peGreen = colors[i].g; | |
2262 SDL_colors[j].peBlue = colors[i].b; | |
2263 } | |
2264 IDirectDrawPalette_SetEntries(SDL_palette, 0, | |
2265 firstcolor, ncolors, &SDL_colors[firstcolor]); | |
2266 alloct_all = 1; | |
2267 } else { | |
2268 /* Grab the 236 most diverse colors in the palette */ | |
2269 DX5_CompressPalette(this, colors, ncolors, 236); | |
2270 /* This sends an WM_PALETTECHANGED message to us */ | |
2271 colorchange_expected = 1; | |
2272 IDirectDrawPalette_SetEntries(SDL_palette, 0, | |
2273 0, 256, SDL_colors); | |
2274 } | |
2275 } | |
2276 return(alloct_all); | |
2277 } | |
2278 | |
2279 /* Gamma code is only available on DirectX 7 and newer */ | |
2280 static int DX5_SetGammaRamp(_THIS, Uint16 *ramp) | |
2281 { | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2282 #ifdef IDirectDrawGammaControl_SetGammaRamp |
0 | 2283 LPDIRECTDRAWGAMMACONTROL gamma; |
2284 DDGAMMARAMP gamma_ramp; | |
2285 HRESULT result; | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2286 #endif |
0 | 2287 |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2288 /* In windowed or OpenGL mode, use windib gamma code */ |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2289 if ( ! DDRAW_FULLSCREEN() ) { |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2290 return DIB_SetGammaRamp(this, ramp); |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2291 } |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2292 |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2293 #ifndef IDirectDrawGammaControl_SetGammaRamp |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2294 SDL_SetError("SDL compiled without DirectX gamma ramp support"); |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2295 return -1; |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2296 #else |
0 | 2297 /* Check for a video mode! */ |
2298 if ( ! SDL_primary ) { | |
2299 SDL_SetError("A video mode must be set for gamma correction"); | |
2300 return(-1); | |
2301 } | |
2302 | |
2303 /* Get the gamma control object */ | |
2304 result = IDirectDrawSurface3_QueryInterface(SDL_primary, | |
2305 &IID_IDirectDrawGammaControl, (LPVOID *)&gamma); | |
2306 if ( result != DD_OK ) { | |
2307 SetDDerror("DirectDrawSurface3::QueryInterface(GAMMA)", result); | |
2308 return(-1); | |
2309 } | |
2310 | |
2311 /* Set up the gamma ramp */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
2312 SDL_memcpy(gamma_ramp.red, &ramp[0*256], 256*sizeof(*ramp)); |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
2313 SDL_memcpy(gamma_ramp.green, &ramp[1*256], 256*sizeof(*ramp)); |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
2314 SDL_memcpy(gamma_ramp.blue, &ramp[2*256], 256*sizeof(*ramp)); |
0 | 2315 result = IDirectDrawGammaControl_SetGammaRamp(gamma, 0, &gamma_ramp); |
2316 if ( result != DD_OK ) { | |
2317 SetDDerror("DirectDrawGammaControl::SetGammaRamp()", result); | |
2318 } | |
2319 | |
2320 /* Release the interface and return */ | |
2321 IDirectDrawGammaControl_Release(gamma); | |
2322 return (result == DD_OK) ? 0 : -1; | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2323 #endif /* !IDirectDrawGammaControl_SetGammaRamp */ |
0 | 2324 } |
2325 | |
2326 static int DX5_GetGammaRamp(_THIS, Uint16 *ramp) | |
2327 { | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2328 #ifdef IDirectDrawGammaControl_SetGammaRamp |
0 | 2329 LPDIRECTDRAWGAMMACONTROL gamma; |
2330 DDGAMMARAMP gamma_ramp; | |
2331 HRESULT result; | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2332 #endif |
0 | 2333 |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2334 /* In windowed or OpenGL mode, use windib gamma code */ |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2335 if ( ! DDRAW_FULLSCREEN() ) { |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2336 return DIB_GetGammaRamp(this, ramp); |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2337 } |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2338 |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2339 #ifndef IDirectDrawGammaControl_SetGammaRamp |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2340 SDL_SetError("SDL compiled without DirectX gamma ramp support"); |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2341 return -1; |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2342 #else |
0 | 2343 /* Check for a video mode! */ |
2344 if ( ! SDL_primary ) { | |
2345 SDL_SetError("A video mode must be set for gamma correction"); | |
2346 return(-1); | |
2347 } | |
2348 | |
2349 /* Get the gamma control object */ | |
2350 result = IDirectDrawSurface3_QueryInterface(SDL_primary, | |
2351 &IID_IDirectDrawGammaControl, (LPVOID *)&gamma); | |
2352 if ( result != DD_OK ) { | |
2353 SetDDerror("DirectDrawSurface3::QueryInterface(GAMMA)", result); | |
2354 return(-1); | |
2355 } | |
2356 | |
2357 /* Set up the gamma ramp */ | |
2358 result = IDirectDrawGammaControl_GetGammaRamp(gamma, 0, &gamma_ramp); | |
2359 if ( result == DD_OK ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
2360 SDL_memcpy(&ramp[0*256], gamma_ramp.red, 256*sizeof(*ramp)); |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
2361 SDL_memcpy(&ramp[1*256], gamma_ramp.green, 256*sizeof(*ramp)); |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
2362 SDL_memcpy(&ramp[2*256], gamma_ramp.blue, 256*sizeof(*ramp)); |
0 | 2363 } else { |
2364 SetDDerror("DirectDrawGammaControl::GetGammaRamp()", result); | |
2365 } | |
2366 | |
2367 /* Release the interface and return */ | |
2368 IDirectDrawGammaControl_Release(gamma); | |
2369 return (result == DD_OK) ? 0 : -1; | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2370 #endif /* !IDirectDrawGammaControl_SetGammaRamp */ |
0 | 2371 } |
2372 | |
2373 void DX5_VideoQuit(_THIS) | |
2374 { | |
2375 int i, j; | |
2376 | |
2377 /* If we're fullscreen GL, we need to reset the display */ | |
2378 if ( this->screen != NULL ) { | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
2379 #ifndef NO_CHANGEDISPLAYSETTINGS |
0 | 2380 if ( (this->screen->flags & (SDL_OPENGL|SDL_FULLSCREEN)) == |
2381 (SDL_OPENGL|SDL_FULLSCREEN) ) { | |
2382 ChangeDisplaySettings(NULL, 0); | |
376
a5f60a847a89
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
374
diff
changeset
|
2383 ShowWindow(SDL_Window, SW_HIDE); |
0 | 2384 } |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
2385 #endif |
0 | 2386 if ( this->screen->flags & SDL_OPENGL ) { |
2387 WIN_GL_ShutDown(this); | |
2388 } | |
2389 } | |
2390 | |
2391 /* Free any palettes we used */ | |
2392 if ( SDL_palette != NULL ) { | |
2393 IDirectDrawPalette_Release(SDL_palette); | |
2394 SDL_palette = NULL; | |
2395 } | |
2396 | |
2397 /* Allow the primary surface to be freed */ | |
2398 if ( SDL_primary != NULL ) { | |
2399 SDL_primary = NULL; | |
2400 } | |
2401 | |
2402 /* Free video mode lists */ | |
2403 for ( i=0; i<NUM_MODELISTS; ++i ) { | |
2404 if ( SDL_modelist[i] != NULL ) { | |
2405 for ( j=0; SDL_modelist[i][j]; ++j ) | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
2406 SDL_free(SDL_modelist[i][j]); |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
2407 SDL_free(SDL_modelist[i]); |
0 | 2408 SDL_modelist[i] = NULL; |
2409 } | |
2410 } | |
2411 | |
2412 /* Free the window */ | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
334
diff
changeset
|
2413 DIB_QuitGamma(this); |
0 | 2414 if ( SDL_Window ) { |
2415 DX5_DestroyWindow(this); | |
2416 } | |
2417 | |
2418 /* Free our window icon */ | |
2419 if ( screen_icn ) { | |
2420 DestroyIcon(screen_icn); | |
2421 screen_icn = NULL; | |
2422 } | |
2423 } | |
2424 | |
2425 /* Exported for the windows message loop only */ | |
3992 | 2426 void DX5_Activate(_THIS, BOOL active, BOOL minimized) |
2427 { | |
2428 } | |
0 | 2429 void DX5_RealizePalette(_THIS) |
2430 { | |
2431 if ( SDL_palette ) { | |
2432 IDirectDrawSurface3_SetPalette(SDL_primary, SDL_palette); | |
2433 } | |
2434 } | |
2435 static void DX5_Recolor8Bit(_THIS, SDL_Surface *surface, Uint8 *mapping) | |
2436 { | |
2437 int row, col; | |
2438 Uint8 *pixels; | |
2439 | |
2440 if ( surface->w && surface->h ) { | |
2441 if ( (surface->flags & SDL_HWSURFACE) == SDL_HWSURFACE ) { | |
2442 if ( this->LockHWSurface(this, surface) < 0 ) { | |
2443 return; | |
2444 } | |
2445 } | |
2446 for ( row=0; row<surface->h; ++row ) { | |
2447 pixels = (Uint8 *)surface->pixels+row*surface->pitch; | |
2448 for ( col=0; col<surface->w; ++col, ++pixels ) { | |
2449 *pixels = mapping[*pixels]; | |
2450 } | |
2451 } | |
2452 if ( (surface->flags & SDL_HWSURFACE) == SDL_HWSURFACE ) { | |
2453 this->UnlockHWSurface(this, surface); | |
2454 } | |
2455 SDL_UpdateRect(surface, 0, 0, 0, 0); | |
2456 } | |
2457 } | |
2458 void DX5_PaletteChanged(_THIS, HWND window) | |
2459 { | |
2460 SDL_Palette *palette; | |
2461 SDL_Color *saved = NULL; | |
2462 HDC hdc; | |
2463 int i; | |
2464 PALETTEENTRY *entries; | |
2465 | |
2466 /* This is true when the window is closing */ | |
2467 if ( (SDL_primary == NULL) || (SDL_VideoSurface == NULL) ) | |
2468 return; | |
2469 | |
2470 /* We need to get the colors as they were set */ | |
2471 palette = this->physpal; | |
2472 if(!palette) | |
2473 palette = SDL_VideoSurface->format->palette; | |
2474 if ( palette == NULL ) { /* Sometimes we don't have a palette */ | |
2475 return; | |
2476 } | |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
2477 entries = SDL_stack_alloc(PALETTEENTRY, palette->ncolors); |
0 | 2478 hdc = GetDC(window); |
2479 GetSystemPaletteEntries(hdc, 0, palette->ncolors, entries); | |
2480 ReleaseDC(window, hdc); | |
2481 if ( ! colorchange_expected ) { | |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
2482 saved = SDL_stack_alloc(SDL_Color, palette->ncolors); |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
2483 SDL_memcpy(saved, palette->colors, |
0 | 2484 palette->ncolors*sizeof(SDL_Color)); |
2485 } | |
2486 for ( i=0; i<palette->ncolors; ++i ) { | |
2487 palette->colors[i].r = entries[i].peRed; | |
2488 palette->colors[i].g = entries[i].peGreen; | |
2489 palette->colors[i].b = entries[i].peBlue; | |
2490 } | |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
2491 SDL_stack_free(entries); |
0 | 2492 if ( ! colorchange_expected ) { |
2493 Uint8 mapping[256]; | |
2494 | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
2495 SDL_memset(mapping, 0, sizeof(mapping)); |
0 | 2496 for ( i=0; i<palette->ncolors; ++i ) { |
2497 mapping[i] = SDL_FindColor(palette, | |
2498 saved[i].r, saved[i].g, saved[i].b); | |
2499 } | |
2500 DX5_Recolor8Bit(this, SDL_VideoSurface, mapping); | |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
2501 SDL_stack_free(saved); |
0 | 2502 } |
2503 colorchange_expected = 0; | |
2504 | |
2505 /* Notify all mapped surfaces of the change */ | |
2506 SDL_FormatChanged(SDL_VideoSurface); | |
2507 } | |
2508 | |
2509 /* Exported for the windows message loop only */ | |
2510 void DX5_WinPAINT(_THIS, HDC hdc) | |
2511 { | |
2512 SDL_UpdateRect(SDL_PublicSurface, 0, 0, 0, 0); | |
2513 } |