Mercurial > sdl-ios-xcode
annotate src/video/windib/SDL_dibvideo.c @ 4099:822f9624f984 SDL-1.2
Brian Fisher fixed bug #513
If an app requests a 24-bit opengl mode on a machine with a 32-bit desktop with
the windib video backend, then when exiting fullscreen the desktop resolution
is not restored
The reason this is, is because the windib backend restores the desktop
resolution when exiting fullscreen in DIB_SetVideoMode when it finds that the
last request was for fullscreen by checking the original flags on the video
surface. However, if the bits per pixel requested is different than current
surface, the video surface is recreated and the original video flags are lost.
So the check to see if we were exiting fullscreen fails.
below is a patch to SDL_dibvideo.c that solves the problem by using the
original flags in all cases.
thanks!
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 28 Dec 2007 08:00:30 +0000 |
parents | 1859647893b8 |
children | 31c7c57af8a4 |
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 |
1433
bb6839704ed6
SDL_windows.h is no longer necessary
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
24 #define WIN32_LEAN_AND_MEAN |
bb6839704ed6
SDL_windows.h is no longer necessary
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
25 #include <windows.h> |
1152
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
26 |
0 | 27 /* Not yet in the mingw32 cross-compile headers */ |
28 #ifndef CDS_FULLSCREEN | |
29 #define CDS_FULLSCREEN 4 | |
30 #endif | |
31 | |
32 #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
|
33 #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
|
34 #include "../SDL_pixels_c.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 "../../events/SDL_sysevents.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 "../../events/SDL_events_c.h" |
0 | 37 #include "SDL_dibvideo.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_dibevents_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
|
41 #include "../wincommon/SDL_wingl_c.h" |
0 | 42 |
43 #ifdef _WIN32_WCE | |
44 #define NO_GETDIBITS | |
45 #define NO_GAMMA_SUPPORT | |
1465
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
46 #if _WIN32_WCE < 420 |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
47 #define NO_CHANGEDISPLAYSETTINGS |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
48 #else |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
49 #define ChangeDisplaySettings(lpDevMode, dwFlags) ChangeDisplaySettingsEx(NULL, (lpDevMode), 0, (dwFlags), 0) |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
50 #endif |
0 | 51 #endif |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
52 #ifndef WS_MAXIMIZE |
766
ed57c876700d
Date: Wed, 26 Nov 2003 01:52:02 +0800
Sam Lantinga <slouken@libsdl.org>
parents:
515
diff
changeset
|
53 #define WS_MAXIMIZE 0 |
ed57c876700d
Date: Wed, 26 Nov 2003 01:52:02 +0800
Sam Lantinga <slouken@libsdl.org>
parents:
515
diff
changeset
|
54 #endif |
ed57c876700d
Date: Wed, 26 Nov 2003 01:52:02 +0800
Sam Lantinga <slouken@libsdl.org>
parents:
515
diff
changeset
|
55 #ifndef WS_THICKFRAME |
ed57c876700d
Date: Wed, 26 Nov 2003 01:52:02 +0800
Sam Lantinga <slouken@libsdl.org>
parents:
515
diff
changeset
|
56 #define WS_THICKFRAME 0 |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
57 #endif |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
58 #ifndef SWP_NOCOPYBITS |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
59 #define SWP_NOCOPYBITS 0 |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
60 #endif |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
61 #ifndef PC_NOCOLLAPSE |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
62 #define PC_NOCOLLAPSE 0 |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
63 #endif |
0 | 64 |
1465
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
65 #ifdef _WIN32_WCE |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
66 // defined and used in SDL_sysevents.c |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
67 extern HINSTANCE aygshell; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
68 #endif |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
69 |
0 | 70 /* Initialization/Query functions */ |
71 static int DIB_VideoInit(_THIS, SDL_PixelFormat *vformat); | |
72 static SDL_Rect **DIB_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags); | |
73 SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags); | |
74 static int DIB_SetColors(_THIS, int firstcolor, int ncolors, | |
75 SDL_Color *colors); | |
76 static void DIB_CheckGamma(_THIS); | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
77 void DIB_SwapGamma(_THIS); |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
78 void DIB_QuitGamma(_THIS); |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
79 int DIB_SetGammaRamp(_THIS, Uint16 *ramp); |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
80 int DIB_GetGammaRamp(_THIS, Uint16 *ramp); |
0 | 81 static void DIB_VideoQuit(_THIS); |
82 | |
83 /* Hardware surface functions */ | |
84 static int DIB_AllocHWSurface(_THIS, SDL_Surface *surface); | |
85 static int DIB_LockHWSurface(_THIS, SDL_Surface *surface); | |
86 static void DIB_UnlockHWSurface(_THIS, SDL_Surface *surface); | |
87 static void DIB_FreeHWSurface(_THIS, SDL_Surface *surface); | |
88 | |
89 /* Windows message handling functions */ | |
3992 | 90 static void DIB_GrabStaticColors(HWND window); |
91 static void DIB_ReleaseStaticColors(HWND window); | |
92 static void DIB_Activate(_THIS, BOOL active, BOOL minimized); | |
0 | 93 static void DIB_RealizePalette(_THIS); |
94 static void DIB_PaletteChanged(_THIS, HWND window); | |
95 static void DIB_WinPAINT(_THIS, HDC hdc); | |
96 | |
97 /* helper fn */ | |
98 static int DIB_SussScreenDepth(); | |
99 | |
100 /* DIB driver bootstrap functions */ | |
101 | |
102 static int DIB_Available(void) | |
103 { | |
104 return(1); | |
105 } | |
106 | |
107 static void DIB_DeleteDevice(SDL_VideoDevice *device) | |
108 { | |
109 if ( device ) { | |
110 if ( device->hidden ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
111 SDL_free(device->hidden); |
0 | 112 } |
113 if ( device->gl_data ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
114 SDL_free(device->gl_data); |
0 | 115 } |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
116 SDL_free(device); |
0 | 117 } |
118 } | |
119 | |
120 static SDL_VideoDevice *DIB_CreateDevice(int devindex) | |
121 { | |
122 SDL_VideoDevice *device; | |
123 | |
124 /* 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
|
125 device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice)); |
0 | 126 if ( device ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
127 SDL_memset(device, 0, (sizeof *device)); |
0 | 128 device->hidden = (struct SDL_PrivateVideoData *) |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
129 SDL_malloc((sizeof *device->hidden)); |
0 | 130 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
|
131 SDL_malloc((sizeof *device->gl_data)); |
0 | 132 } |
133 if ( (device == NULL) || (device->hidden == NULL) || | |
134 (device->gl_data == NULL) ) { | |
135 SDL_OutOfMemory(); | |
136 DIB_DeleteDevice(device); | |
137 return(NULL); | |
138 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
139 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
|
140 SDL_memset(device->gl_data, 0, (sizeof *device->gl_data)); |
0 | 141 |
142 /* Set the function pointers */ | |
143 device->VideoInit = DIB_VideoInit; | |
144 device->ListModes = DIB_ListModes; | |
145 device->SetVideoMode = DIB_SetVideoMode; | |
146 device->UpdateMouse = WIN_UpdateMouse; | |
147 device->SetColors = DIB_SetColors; | |
148 device->UpdateRects = NULL; | |
149 device->VideoQuit = DIB_VideoQuit; | |
150 device->AllocHWSurface = DIB_AllocHWSurface; | |
151 device->CheckHWBlit = NULL; | |
152 device->FillHWRect = NULL; | |
153 device->SetHWColorKey = NULL; | |
154 device->SetHWAlpha = NULL; | |
155 device->LockHWSurface = DIB_LockHWSurface; | |
156 device->UnlockHWSurface = DIB_UnlockHWSurface; | |
157 device->FlipHWSurface = NULL; | |
158 device->FreeHWSurface = DIB_FreeHWSurface; | |
159 device->SetGammaRamp = DIB_SetGammaRamp; | |
160 device->GetGammaRamp = DIB_GetGammaRamp; | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
161 #if SDL_VIDEO_OPENGL |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
162 device->GL_LoadLibrary = WIN_GL_LoadLibrary; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
163 device->GL_GetProcAddress = WIN_GL_GetProcAddress; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
164 device->GL_GetAttribute = WIN_GL_GetAttribute; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
165 device->GL_MakeCurrent = WIN_GL_MakeCurrent; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
166 device->GL_SwapBuffers = WIN_GL_SwapBuffers; |
0 | 167 #endif |
168 device->SetCaption = WIN_SetWMCaption; | |
169 device->SetIcon = WIN_SetWMIcon; | |
170 device->IconifyWindow = WIN_IconifyWindow; | |
171 device->GrabInput = WIN_GrabInput; | |
172 device->GetWMInfo = WIN_GetWMInfo; | |
173 device->FreeWMCursor = WIN_FreeWMCursor; | |
174 device->CreateWMCursor = WIN_CreateWMCursor; | |
175 device->ShowWMCursor = WIN_ShowWMCursor; | |
176 device->WarpWMCursor = WIN_WarpWMCursor; | |
177 device->CheckMouseMode = WIN_CheckMouseMode; | |
178 device->InitOSKeymap = DIB_InitOSKeymap; | |
179 device->PumpEvents = DIB_PumpEvents; | |
180 | |
181 /* Set up the windows message handling functions */ | |
3992 | 182 WIN_Activate = DIB_Activate; |
0 | 183 WIN_RealizePalette = DIB_RealizePalette; |
184 WIN_PaletteChanged = DIB_PaletteChanged; | |
185 WIN_WinPAINT = DIB_WinPAINT; | |
186 HandleMessage = DIB_HandleMessage; | |
187 | |
188 device->free = DIB_DeleteDevice; | |
189 | |
190 /* We're finally ready */ | |
191 return device; | |
192 } | |
193 | |
194 VideoBootStrap WINDIB_bootstrap = { | |
1152
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
195 "windib", "Win95/98/NT/2000/CE GDI", |
0 | 196 DIB_Available, DIB_CreateDevice |
197 }; | |
198 | |
199 static int cmpmodes(const void *va, const void *vb) | |
200 { | |
201 SDL_Rect *a = *(SDL_Rect **)va; | |
202 SDL_Rect *b = *(SDL_Rect **)vb; | |
966
f72cc0c7305f
Video modes are sorted width first, then height
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
203 if ( a->w == b->w ) |
f72cc0c7305f
Video modes are sorted width first, then height
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
204 return b->h - a->h; |
f72cc0c7305f
Video modes are sorted width first, then height
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
205 else |
f72cc0c7305f
Video modes are sorted width first, then height
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
206 return b->w - a->w; |
0 | 207 } |
208 | |
209 static int DIB_AddMode(_THIS, int bpp, int w, int h) | |
210 { | |
211 SDL_Rect *mode; | |
212 int i, index; | |
213 int next_mode; | |
214 | |
215 /* Check to see if we already have this mode */ | |
4096
1859647893b8
Fixed crash when given video modes > 32 bpp
Sam Lantinga <slouken@libsdl.org>
parents:
4085
diff
changeset
|
216 if ( bpp < 8 || bpp > 32 ) { /* Not supported */ |
0 | 217 return(0); |
218 } | |
219 index = ((bpp+7)/8)-1; | |
220 for ( i=0; i<SDL_nummodes[index]; ++i ) { | |
221 mode = SDL_modelist[index][i]; | |
222 if ( (mode->w == w) && (mode->h == h) ) { | |
223 return(0); | |
224 } | |
225 } | |
226 | |
227 /* Set up the new video mode rectangle */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
228 mode = (SDL_Rect *)SDL_malloc(sizeof *mode); |
0 | 229 if ( mode == NULL ) { |
230 SDL_OutOfMemory(); | |
231 return(-1); | |
232 } | |
233 mode->x = 0; | |
234 mode->y = 0; | |
235 mode->w = w; | |
236 mode->h = h; | |
237 | |
238 /* Allocate the new list of modes, and fill in the new mode */ | |
239 next_mode = SDL_nummodes[index]; | |
240 SDL_modelist[index] = (SDL_Rect **) | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
241 SDL_realloc(SDL_modelist[index], (1+next_mode+1)*sizeof(SDL_Rect *)); |
0 | 242 if ( SDL_modelist[index] == NULL ) { |
243 SDL_OutOfMemory(); | |
244 SDL_nummodes[index] = 0; | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
245 SDL_free(mode); |
0 | 246 return(-1); |
247 } | |
248 SDL_modelist[index][next_mode] = mode; | |
249 SDL_modelist[index][next_mode+1] = NULL; | |
250 SDL_nummodes[index]++; | |
251 | |
252 return(0); | |
253 } | |
254 | |
3992 | 255 static void DIB_CreatePalette(_THIS, int bpp) |
0 | 256 { |
257 /* RJR: March 28, 2000 | |
258 moved palette creation here from "DIB_VideoInit" */ | |
259 | |
3992 | 260 LOGPALETTE *palette; |
261 HDC hdc; | |
262 int ncolors; | |
0 | 263 |
3992 | 264 ncolors = (1 << bpp); |
265 palette = (LOGPALETTE *)SDL_malloc(sizeof(*palette)+ | |
266 ncolors*sizeof(PALETTEENTRY)); | |
267 palette->palVersion = 0x300; | |
268 palette->palNumEntries = ncolors; | |
269 hdc = GetDC(SDL_Window); | |
270 GetSystemPaletteEntries(hdc, 0, ncolors, palette->palPalEntry); | |
271 ReleaseDC(SDL_Window, hdc); | |
272 screen_pal = CreatePalette(palette); | |
273 screen_logpal = palette; | |
0 | 274 } |
275 | |
276 int DIB_VideoInit(_THIS, SDL_PixelFormat *vformat) | |
277 { | |
3981
b0d021cf41b6
windib target can now control screensaver with SDL_VIDEO_ALLOW_SCREENSAVER.
Ryan C. Gordon <icculus@icculus.org>
parents:
3976
diff
changeset
|
278 const char *env = NULL; |
0 | 279 #ifndef NO_CHANGEDISPLAYSETTINGS |
280 int i; | |
281 DEVMODE settings; | |
282 #endif | |
283 | |
284 /* Create the window */ | |
285 if ( DIB_CreateWindow(this) < 0 ) { | |
286 return(-1); | |
287 } | |
1523 | 288 |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
289 #if !SDL_AUDIO_DISABLED |
0 | 290 DX5_SoundFocus(SDL_Window); |
169
8039a5b760b9
Allow building SDL on Windows without audio support
Sam Lantinga <slouken@libsdl.org>
parents:
145
diff
changeset
|
291 #endif |
0 | 292 |
293 /* Determine the screen depth */ | |
294 vformat->BitsPerPixel = DIB_SussScreenDepth(); | |
295 switch (vformat->BitsPerPixel) { | |
296 case 15: | |
297 vformat->Rmask = 0x00007c00; | |
298 vformat->Gmask = 0x000003e0; | |
299 vformat->Bmask = 0x0000001f; | |
300 vformat->BitsPerPixel = 16; | |
301 break; | |
302 case 16: | |
303 vformat->Rmask = 0x0000f800; | |
304 vformat->Gmask = 0x000007e0; | |
305 vformat->Bmask = 0x0000001f; | |
306 break; | |
307 case 24: | |
308 case 32: | |
309 /* GDI defined as 8-8-8 */ | |
310 vformat->Rmask = 0x00ff0000; | |
311 vformat->Gmask = 0x0000ff00; | |
312 vformat->Bmask = 0x000000ff; | |
313 break; | |
314 default: | |
315 break; | |
316 } | |
317 | |
318 /* See if gamma is supported on this screen */ | |
319 DIB_CheckGamma(this); | |
320 | |
321 #ifndef NO_CHANGEDISPLAYSETTINGS | |
1465
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
322 |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
323 settings.dmSize = sizeof(DEVMODE); |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
324 settings.dmDriverExtra = 0; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
325 #ifdef _WIN32_WCE |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
326 settings.dmFields = DM_DISPLAYQUERYORIENTATION; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
327 this->hidden->supportRotation = ChangeDisplaySettingsEx(NULL, &settings, NULL, CDS_TEST, NULL) == DISP_CHANGE_SUCCESSFUL; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
328 #endif |
1295
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1292
diff
changeset
|
329 /* Query for the desktop resolution */ |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1292
diff
changeset
|
330 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
|
331 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
|
332 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:
1292
diff
changeset
|
333 |
0 | 334 /* Query for the list of available video modes */ |
335 for ( i=0; EnumDisplaySettings(NULL, i, &settings); ++i ) { | |
336 DIB_AddMode(this, settings.dmBitsPerPel, | |
337 settings.dmPelsWidth, settings.dmPelsHeight); | |
1465
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
338 #ifdef _WIN32_WCE |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
339 if( this->hidden->supportRotation ) |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
340 DIB_AddMode(this, settings.dmBitsPerPel, |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
341 settings.dmPelsHeight, settings.dmPelsWidth); |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
342 #endif |
0 | 343 } |
344 /* Sort the mode lists */ | |
345 for ( i=0; i<NUM_MODELISTS; ++i ) { | |
346 if ( SDL_nummodes[i] > 0 ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
347 SDL_qsort(SDL_modelist[i], SDL_nummodes[i], sizeof *SDL_modelist[i], cmpmodes); |
0 | 348 } |
349 } | |
1465
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
350 #else |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
351 // WinCE and fullscreen mode: |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
352 // We use only vformat->BitsPerPixel that allow SDL to |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
353 // emulate other bpp (8, 32) and use triple buffer, |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
354 // because SDL surface conversion is much faster than the WinCE one. |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
355 // Although it should be tested on devices with graphics accelerator. |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
356 |
1771 | 357 DIB_AddMode(this, vformat->BitsPerPixel, |
1465
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
358 GetDeviceCaps(GetDC(NULL), HORZRES), |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
359 GetDeviceCaps(GetDC(NULL), VERTRES)); |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
360 |
0 | 361 #endif /* !NO_CHANGEDISPLAYSETTINGS */ |
362 | |
363 /* Grab an identity palette if we are in a palettized mode */ | |
364 if ( vformat->BitsPerPixel <= 8 ) { | |
365 /* RJR: March 28, 2000 | |
366 moved palette creation to "DIB_CreatePalette" */ | |
3992 | 367 DIB_CreatePalette(this, vformat->BitsPerPixel); |
0 | 368 } |
369 | |
370 /* Fill in some window manager capabilities */ | |
371 this->info.wm_available = 1; | |
372 | |
1465
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
373 #ifdef _WIN32_WCE |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
374 this->hidden->origRotation = -1; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
375 #endif |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
376 |
3981
b0d021cf41b6
windib target can now control screensaver with SDL_VIDEO_ALLOW_SCREENSAVER.
Ryan C. Gordon <icculus@icculus.org>
parents:
3976
diff
changeset
|
377 /* Allow environment override of screensaver disable. */ |
b0d021cf41b6
windib target can now control screensaver with SDL_VIDEO_ALLOW_SCREENSAVER.
Ryan C. Gordon <icculus@icculus.org>
parents:
3976
diff
changeset
|
378 env = SDL_getenv("SDL_VIDEO_ALLOW_SCREENSAVER"); |
b0d021cf41b6
windib target can now control screensaver with SDL_VIDEO_ALLOW_SCREENSAVER.
Ryan C. Gordon <icculus@icculus.org>
parents:
3976
diff
changeset
|
379 this->hidden->allow_screensaver = ( (env && SDL_atoi(env)) ? 1 : 0 ); |
b0d021cf41b6
windib target can now control screensaver with SDL_VIDEO_ALLOW_SCREENSAVER.
Ryan C. Gordon <icculus@icculus.org>
parents:
3976
diff
changeset
|
380 |
0 | 381 /* We're done! */ |
382 return(0); | |
383 } | |
384 | |
385 /* We support any format at any dimension */ | |
386 SDL_Rect **DIB_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags) | |
387 { | |
388 if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { | |
389 return(SDL_modelist[((format->BitsPerPixel+7)/8)-1]); | |
390 } else { | |
391 return((SDL_Rect **)-1); | |
392 } | |
393 } | |
394 | |
395 | |
396 /* | |
397 Helper fn to work out which screen depth windows is currently using. | |
398 15 bit mode is considered 555 format, 16 bit is 565. | |
399 returns 0 for unknown mode. | |
400 (Derived from code in sept 1999 Windows Developer Journal | |
401 http://www.wdj.com/code/archive.html) | |
402 */ | |
403 static int DIB_SussScreenDepth() | |
404 { | |
405 #ifdef NO_GETDIBITS | |
406 int depth; | |
407 HDC hdc; | |
408 | |
409 hdc = GetDC(SDL_Window); | |
410 depth = GetDeviceCaps(hdc, PLANES) * GetDeviceCaps(hdc, BITSPIXEL); | |
411 ReleaseDC(SDL_Window, hdc); | |
412 return(depth); | |
413 #else | |
1881 | 414 int depth; |
0 | 415 int dib_size; |
416 LPBITMAPINFOHEADER dib_hdr; | |
417 HDC hdc; | |
418 HBITMAP hbm; | |
419 | |
420 /* Allocate enough space for a DIB header plus palette (for | |
421 * 8-bit modes) or bitfields (for 16- and 32-bit modes) | |
422 */ | |
423 dib_size = sizeof(BITMAPINFOHEADER) + 256 * sizeof (RGBQUAD); | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
424 dib_hdr = (LPBITMAPINFOHEADER) SDL_malloc(dib_size); |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
425 SDL_memset(dib_hdr, 0, dib_size); |
0 | 426 dib_hdr->biSize = sizeof(BITMAPINFOHEADER); |
427 | |
428 /* Get a device-dependent bitmap that's compatible with the | |
429 screen. | |
430 */ | |
431 hdc = GetDC(NULL); | |
432 hbm = CreateCompatibleBitmap( hdc, 1, 1 ); | |
433 | |
434 /* Convert the DDB to a DIB. We need to call GetDIBits twice: | |
435 * the first call just fills in the BITMAPINFOHEADER; the | |
436 * second fills in the bitfields or palette. | |
437 */ | |
438 GetDIBits(hdc, hbm, 0, 1, NULL, (LPBITMAPINFO) dib_hdr, DIB_RGB_COLORS); | |
439 GetDIBits(hdc, hbm, 0, 1, NULL, (LPBITMAPINFO) dib_hdr, DIB_RGB_COLORS); | |
440 DeleteObject(hbm); | |
441 ReleaseDC(NULL, hdc); | |
442 | |
1881 | 443 depth = 0; |
0 | 444 switch( dib_hdr->biBitCount ) |
445 { | |
1881 | 446 case 8: depth = 8; break; |
447 case 24: depth = 24; break; | |
448 case 32: depth = 32; break; | |
0 | 449 case 16: |
450 if( dib_hdr->biCompression == BI_BITFIELDS ) { | |
451 /* check the red mask */ | |
452 switch( ((DWORD*)((char*)dib_hdr + dib_hdr->biSize))[0] ) { | |
1881 | 453 case 0xf800: depth = 16; break; /* 565 */ |
454 case 0x7c00: depth = 15; break; /* 555 */ | |
0 | 455 } |
456 } | |
457 } | |
1881 | 458 SDL_free(dib_hdr); |
459 return depth; | |
0 | 460 #endif /* NO_GETDIBITS */ |
461 } | |
462 | |
463 | |
464 /* Various screen update functions available */ | |
465 static void DIB_NormalUpdate(_THIS, int numrects, SDL_Rect *rects); | |
466 | |
467 SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current, | |
468 int width, int height, int bpp, Uint32 flags) | |
469 { | |
470 SDL_Surface *video; | |
4085 | 471 int prev_w, prev_h; |
0 | 472 Uint32 prev_flags; |
473 DWORD style; | |
474 const DWORD directstyle = | |
475 (WS_POPUP); | |
476 const DWORD windowstyle = | |
477 (WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX); | |
478 const DWORD resizestyle = | |
479 (WS_THICKFRAME|WS_MAXIMIZEBOX); | |
480 int binfo_size; | |
481 BITMAPINFO *binfo; | |
482 HDC hdc; | |
483 RECT bounds; | |
484 int x, y; | |
485 Uint32 Rmask, Gmask, Bmask; | |
486 | |
4099
822f9624f984
Brian Fisher fixed bug #513
Sam Lantinga <slouken@libsdl.org>
parents:
4096
diff
changeset
|
487 prev_flags = current->flags; |
822f9624f984
Brian Fisher fixed bug #513
Sam Lantinga <slouken@libsdl.org>
parents:
4096
diff
changeset
|
488 |
0 | 489 /* Clean up any GL context that may be hanging around */ |
490 if ( current->flags & SDL_OPENGL ) { | |
491 WIN_GL_ShutDown(this); | |
492 } | |
1291
31331c444ea2
Only save the window position if we're in windowed mode
Sam Lantinga <slouken@libsdl.org>
parents:
1290
diff
changeset
|
493 SDL_resizing = 1; |
0 | 494 |
495 /* Recalculate the bitmasks if necessary */ | |
496 if ( bpp == current->format->BitsPerPixel ) { | |
497 video = current; | |
498 } else { | |
499 switch (bpp) { | |
500 case 15: | |
501 case 16: | |
502 if ( DIB_SussScreenDepth() == 15 ) { | |
503 /* 5-5-5 */ | |
504 Rmask = 0x00007c00; | |
505 Gmask = 0x000003e0; | |
506 Bmask = 0x0000001f; | |
507 } else { | |
508 /* 5-6-5 */ | |
509 Rmask = 0x0000f800; | |
510 Gmask = 0x000007e0; | |
511 Bmask = 0x0000001f; | |
512 } | |
513 break; | |
514 case 24: | |
515 case 32: | |
516 /* GDI defined as 8-8-8 */ | |
517 Rmask = 0x00ff0000; | |
518 Gmask = 0x0000ff00; | |
519 Bmask = 0x000000ff; | |
520 break; | |
521 default: | |
522 Rmask = 0x00000000; | |
523 Gmask = 0x00000000; | |
524 Bmask = 0x00000000; | |
525 break; | |
526 } | |
527 video = SDL_CreateRGBSurface(SDL_SWSURFACE, | |
528 0, 0, bpp, Rmask, Gmask, Bmask, 0); | |
529 if ( video == NULL ) { | |
530 SDL_OutOfMemory(); | |
531 return(NULL); | |
532 } | |
533 } | |
534 | |
535 /* Fill in part of the video surface */ | |
4085 | 536 prev_w = video->w; |
537 prev_h = video->h; | |
0 | 538 video->flags = 0; /* Clear flags */ |
539 video->w = width; | |
540 video->h = height; | |
541 video->pitch = SDL_CalculatePitch(video); | |
542 | |
1152
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
543 /* Small fix for WinCE/Win32 - when activating window |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
544 SDL_VideoSurface is equal to zero, so activating code |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
545 is not called properly for fullscreen windows because |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
546 macros WINDIB_FULLSCREEN uses SDL_VideoSurface |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
547 */ |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
548 SDL_VideoSurface = video; |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
549 |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
550 #if defined(_WIN32_WCE) |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
551 if ( flags & SDL_FULLSCREEN ) |
514
1080bfc4aa96
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
552 video->flags |= SDL_FULLSCREEN; |
1080bfc4aa96
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
553 #endif |
1152
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
554 |
0 | 555 #ifndef NO_CHANGEDISPLAYSETTINGS |
556 /* Set fullscreen mode if appropriate */ | |
557 if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { | |
558 DEVMODE settings; | |
1295
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1292
diff
changeset
|
559 BOOL changed; |
0 | 560 |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
561 SDL_memset(&settings, 0, sizeof(DEVMODE)); |
0 | 562 settings.dmSize = sizeof(DEVMODE); |
1465
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
563 |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
564 #ifdef _WIN32_WCE |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
565 // try to rotate screen to fit requested resolution |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
566 if( this->hidden->supportRotation ) |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
567 { |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
568 DWORD rotation; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
569 |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
570 // ask current mode |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
571 settings.dmFields = DM_DISPLAYORIENTATION; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
572 ChangeDisplaySettingsEx(NULL, &settings, NULL, CDS_TEST, NULL); |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
573 rotation = settings.dmDisplayOrientation; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
574 |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
575 if( (width > GetDeviceCaps(GetDC(NULL), HORZRES)) |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
576 && (height < GetDeviceCaps(GetDC(NULL), VERTRES))) |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
577 { |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
578 switch( rotation ) |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
579 { |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
580 case DMDO_0: |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
581 settings.dmDisplayOrientation = DMDO_90; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
582 break; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
583 case DMDO_270: |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
584 settings.dmDisplayOrientation = DMDO_180; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
585 break; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
586 } |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
587 if( settings.dmDisplayOrientation != rotation ) |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
588 { |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
589 // go to landscape |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
590 this->hidden->origRotation = rotation; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
591 ChangeDisplaySettingsEx(NULL,&settings,NULL,CDS_RESET,NULL); |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
592 } |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
593 } |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
594 if( (width < GetDeviceCaps(GetDC(NULL), HORZRES)) |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
595 && (height > GetDeviceCaps(GetDC(NULL), VERTRES))) |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
596 { |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
597 switch( rotation ) |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
598 { |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
599 case DMDO_90: |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
600 settings.dmDisplayOrientation = DMDO_0; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
601 break; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
602 case DMDO_180: |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
603 settings.dmDisplayOrientation = DMDO_270; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
604 break; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
605 } |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
606 if( settings.dmDisplayOrientation != rotation ) |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
607 { |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
608 // go to portrait |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
609 this->hidden->origRotation = rotation; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
610 ChangeDisplaySettingsEx(NULL,&settings,NULL,CDS_RESET,NULL); |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
611 } |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
612 } |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
613 |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
614 } |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
615 #endif |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
616 |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
617 #ifndef _WIN32_WCE |
0 | 618 settings.dmBitsPerPel = video->format->BitsPerPixel; |
619 settings.dmPelsWidth = width; | |
620 settings.dmPelsHeight = height; | |
621 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
|
622 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
|
623 height <= (int)SDL_desktop_mode.dmPelsHeight ) { |
1295
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1292
diff
changeset
|
624 settings.dmDisplayFrequency = SDL_desktop_mode.dmDisplayFrequency; |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1292
diff
changeset
|
625 settings.dmFields |= DM_DISPLAYFREQUENCY; |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1292
diff
changeset
|
626 } |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1292
diff
changeset
|
627 changed = (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL); |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1292
diff
changeset
|
628 if ( ! changed && (settings.dmFields & DM_DISPLAYFREQUENCY) ) { |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1292
diff
changeset
|
629 settings.dmFields &= ~DM_DISPLAYFREQUENCY; |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1292
diff
changeset
|
630 changed = (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL); |
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1292
diff
changeset
|
631 } |
1465
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
632 #else |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
633 changed = 1; |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
634 #endif |
1295
c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1292
diff
changeset
|
635 if ( changed ) { |
0 | 636 video->flags |= SDL_FULLSCREEN; |
304
ec53caed9fb2
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
637 SDL_fullscreen_mode = settings; |
0 | 638 } |
1465
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
639 |
0 | 640 } |
641 #endif /* !NO_CHANGEDISPLAYSETTINGS */ | |
642 | |
45
60a6e045808e
Fix palette creation in windowed mode at 8 bpp
Sam Lantinga <slouken@lokigames.com>
parents:
36
diff
changeset
|
643 /* Reset the palette and create a new one if necessary */ |
4079
fda6e33893b7
Always advertise hardware palette, since Windows will remap colors for us.
Sam Lantinga <slouken@libsdl.org>
parents:
4075
diff
changeset
|
644 if ( grab_palette ) { |
fda6e33893b7
Always advertise hardware palette, since Windows will remap colors for us.
Sam Lantinga <slouken@libsdl.org>
parents:
4075
diff
changeset
|
645 DIB_ReleaseStaticColors(SDL_Window); |
fda6e33893b7
Always advertise hardware palette, since Windows will remap colors for us.
Sam Lantinga <slouken@libsdl.org>
parents:
4075
diff
changeset
|
646 grab_palette = FALSE; |
fda6e33893b7
Always advertise hardware palette, since Windows will remap colors for us.
Sam Lantinga <slouken@libsdl.org>
parents:
4075
diff
changeset
|
647 } |
45
60a6e045808e
Fix palette creation in windowed mode at 8 bpp
Sam Lantinga <slouken@lokigames.com>
parents:
36
diff
changeset
|
648 if ( screen_pal != NULL ) { |
60a6e045808e
Fix palette creation in windowed mode at 8 bpp
Sam Lantinga <slouken@lokigames.com>
parents:
36
diff
changeset
|
649 /* RJR: March 28, 2000 |
60a6e045808e
Fix palette creation in windowed mode at 8 bpp
Sam Lantinga <slouken@lokigames.com>
parents:
36
diff
changeset
|
650 delete identity palette if switching from a palettized mode */ |
60a6e045808e
Fix palette creation in windowed mode at 8 bpp
Sam Lantinga <slouken@lokigames.com>
parents:
36
diff
changeset
|
651 DeleteObject(screen_pal); |
60a6e045808e
Fix palette creation in windowed mode at 8 bpp
Sam Lantinga <slouken@lokigames.com>
parents:
36
diff
changeset
|
652 screen_pal = NULL; |
60a6e045808e
Fix palette creation in windowed mode at 8 bpp
Sam Lantinga <slouken@lokigames.com>
parents:
36
diff
changeset
|
653 } |
3992 | 654 if ( screen_logpal != NULL ) { |
655 SDL_free(screen_logpal); | |
656 screen_logpal = NULL; | |
657 } | |
4079
fda6e33893b7
Always advertise hardware palette, since Windows will remap colors for us.
Sam Lantinga <slouken@libsdl.org>
parents:
4075
diff
changeset
|
658 |
45
60a6e045808e
Fix palette creation in windowed mode at 8 bpp
Sam Lantinga <slouken@lokigames.com>
parents:
36
diff
changeset
|
659 if ( bpp <= 8 ) |
60a6e045808e
Fix palette creation in windowed mode at 8 bpp
Sam Lantinga <slouken@lokigames.com>
parents:
36
diff
changeset
|
660 { |
60a6e045808e
Fix palette creation in windowed mode at 8 bpp
Sam Lantinga <slouken@lokigames.com>
parents:
36
diff
changeset
|
661 /* RJR: March 28, 2000 |
60a6e045808e
Fix palette creation in windowed mode at 8 bpp
Sam Lantinga <slouken@lokigames.com>
parents:
36
diff
changeset
|
662 create identity palette switching to a palettized mode */ |
3992 | 663 DIB_CreatePalette(this, bpp); |
45
60a6e045808e
Fix palette creation in windowed mode at 8 bpp
Sam Lantinga <slouken@lokigames.com>
parents:
36
diff
changeset
|
664 } |
60a6e045808e
Fix palette creation in windowed mode at 8 bpp
Sam Lantinga <slouken@lokigames.com>
parents:
36
diff
changeset
|
665 |
1480 | 666 style = GetWindowLong(SDL_Window, GWL_STYLE); |
0 | 667 style &= ~(resizestyle|WS_MAXIMIZE); |
668 if ( (video->flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { | |
669 style &= ~windowstyle; | |
670 style |= directstyle; | |
671 } else { | |
672 #ifndef NO_CHANGEDISPLAYSETTINGS | |
673 if ( (prev_flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { | |
674 ChangeDisplaySettings(NULL, 0); | |
675 } | |
676 #endif | |
677 if ( flags & SDL_NOFRAME ) { | |
678 style &= ~windowstyle; | |
679 style |= directstyle; | |
680 video->flags |= SDL_NOFRAME; | |
681 } else { | |
682 style &= ~directstyle; | |
683 style |= windowstyle; | |
684 if ( flags & SDL_RESIZABLE ) { | |
685 style |= resizestyle; | |
686 video->flags |= SDL_RESIZABLE; | |
687 } | |
688 } | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
448
diff
changeset
|
689 #if WS_MAXIMIZE |
0 | 690 if (IsZoomed(SDL_Window)) style |= WS_MAXIMIZE; |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
691 #endif |
0 | 692 } |
145
29a638dc26db
Applied David MacCormack's patch to fix SDL_WINDOWID on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
112
diff
changeset
|
693 |
448
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
694 /* 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:
1251
diff
changeset
|
695 if ( !SDL_windowid ) |
1480 | 696 SetWindowLong(SDL_Window, GWL_STYLE, style); |
0 | 697 |
698 /* Delete the old bitmap if necessary */ | |
699 if ( screen_bmp != NULL ) { | |
700 DeleteObject(screen_bmp); | |
701 } | |
702 if ( ! (flags & SDL_OPENGL) ) { | |
703 BOOL is16bitmode = (video->format->BytesPerPixel == 2); | |
704 | |
705 /* Suss out the bitmap info header */ | |
706 binfo_size = sizeof(*binfo); | |
707 if( is16bitmode ) { | |
708 /* 16bit modes, palette area used for rgb bitmasks */ | |
709 binfo_size += 3*sizeof(DWORD); | |
710 } else if ( video->format->palette ) { | |
711 binfo_size += video->format->palette->ncolors * | |
712 sizeof(RGBQUAD); | |
713 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
714 binfo = (BITMAPINFO *)SDL_malloc(binfo_size); |
0 | 715 if ( ! binfo ) { |
716 if ( video != current ) { | |
717 SDL_FreeSurface(video); | |
718 } | |
719 SDL_OutOfMemory(); | |
720 return(NULL); | |
721 } | |
722 | |
723 binfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); | |
724 binfo->bmiHeader.biWidth = video->w; | |
725 binfo->bmiHeader.biHeight = -video->h; /* -ve for topdown bitmap */ | |
726 binfo->bmiHeader.biPlanes = 1; | |
727 binfo->bmiHeader.biSizeImage = video->h * video->pitch; | |
728 binfo->bmiHeader.biXPelsPerMeter = 0; | |
729 binfo->bmiHeader.biYPelsPerMeter = 0; | |
730 binfo->bmiHeader.biClrUsed = 0; | |
731 binfo->bmiHeader.biClrImportant = 0; | |
732 binfo->bmiHeader.biBitCount = video->format->BitsPerPixel; | |
733 | |
734 if ( is16bitmode ) { | |
735 /* BI_BITFIELDS tells CreateDIBSection about the rgb masks in the palette */ | |
736 binfo->bmiHeader.biCompression = BI_BITFIELDS; | |
737 ((Uint32*)binfo->bmiColors)[0] = video->format->Rmask; | |
738 ((Uint32*)binfo->bmiColors)[1] = video->format->Gmask; | |
739 ((Uint32*)binfo->bmiColors)[2] = video->format->Bmask; | |
740 } else { | |
741 binfo->bmiHeader.biCompression = BI_RGB; /* BI_BITFIELDS for 565 vs 555 */ | |
742 if ( video->format->palette ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
743 SDL_memset(binfo->bmiColors, 0, |
0 | 744 video->format->palette->ncolors*sizeof(RGBQUAD)); |
745 } | |
746 } | |
747 | |
748 /* Create the offscreen bitmap buffer */ | |
749 hdc = GetDC(SDL_Window); | |
750 screen_bmp = CreateDIBSection(hdc, binfo, DIB_RGB_COLORS, | |
751 (void **)(&video->pixels), NULL, 0); | |
752 ReleaseDC(SDL_Window, hdc); | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
753 SDL_free(binfo); |
0 | 754 if ( screen_bmp == NULL ) { |
755 if ( video != current ) { | |
756 SDL_FreeSurface(video); | |
757 } | |
758 SDL_SetError("Couldn't create DIB section"); | |
759 return(NULL); | |
760 } | |
761 this->UpdateRects = DIB_NormalUpdate; | |
762 | |
763 /* Set video surface flags */ | |
4079
fda6e33893b7
Always advertise hardware palette, since Windows will remap colors for us.
Sam Lantinga <slouken@libsdl.org>
parents:
4075
diff
changeset
|
764 if ( screen_pal && (flags & (SDL_FULLSCREEN|SDL_HWPALETTE)) ) { |
fda6e33893b7
Always advertise hardware palette, since Windows will remap colors for us.
Sam Lantinga <slouken@libsdl.org>
parents:
4075
diff
changeset
|
765 grab_palette = TRUE; |
0 | 766 } |
4079
fda6e33893b7
Always advertise hardware palette, since Windows will remap colors for us.
Sam Lantinga <slouken@libsdl.org>
parents:
4075
diff
changeset
|
767 /* BitBlt() maps colors for us */ |
fda6e33893b7
Always advertise hardware palette, since Windows will remap colors for us.
Sam Lantinga <slouken@libsdl.org>
parents:
4075
diff
changeset
|
768 video->flags |= SDL_HWPALETTE; |
0 | 769 } |
1465
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
770 #ifndef _WIN32_WCE |
0 | 771 /* Resize the window */ |
1290
c4a5a772c5d9
The event code was fine, and calculated the SDL_windowX/Y correctly.
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
772 if ( !SDL_windowid && !IsZoomed(SDL_Window) ) { |
1465
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
773 #else |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
774 if ( !SDL_windowid ) { |
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1433
diff
changeset
|
775 #endif |
448
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
776 HWND top; |
0 | 777 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
|
778 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
|
779 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:
766
diff
changeset
|
780 |
4085 | 781 if ( video->w != prev_w || video->h != prev_h ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
782 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
|
783 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:
766
diff
changeset
|
784 if ( window ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
785 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:
766
diff
changeset
|
786 SDL_windowX = x; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
787 SDL_windowY = y; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
788 } |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
789 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:
766
diff
changeset
|
790 center = window; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
791 } |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
792 } |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
793 } |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
794 swp_flags = (SWP_NOCOPYBITS | SWP_SHOWWINDOW); |
0 | 795 |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
796 bounds.left = SDL_windowX; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
797 bounds.top = SDL_windowY; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
798 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:
766
diff
changeset
|
799 bounds.bottom = SDL_windowY+video->h; |
3868 | 800 #ifndef _WIN32_WCE |
1882 | 801 AdjustWindowRectEx(&bounds, GetWindowLong(SDL_Window, GWL_STYLE), (GetMenu(SDL_Window) != NULL), 0); |
3868 | 802 #else |
803 // The bMenu parameter must be FALSE; menu bars are not supported | |
804 AdjustWindowRectEx(&bounds, GetWindowLong(SDL_Window, GWL_STYLE), 0, 0); | |
805 #endif | |
0 | 806 width = bounds.right-bounds.left; |
807 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:
766
diff
changeset
|
808 if ( (flags & SDL_FULLSCREEN) ) { |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
809 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:
766
diff
changeset
|
810 y = (GetSystemMetrics(SM_CYSCREEN)-height)/2; |
971
96671ebc50a4
Date: Mon, 25 Oct 2004 17:30:06 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
966
diff
changeset
|
811 } else if ( center ) { |
96671ebc50a4
Date: Mon, 25 Oct 2004 17:30:06 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
966
diff
changeset
|
812 x = (GetSystemMetrics(SM_CXSCREEN)-width)/2; |
96671ebc50a4
Date: Mon, 25 Oct 2004 17:30:06 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
966
diff
changeset
|
813 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:
766
diff
changeset
|
814 } 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:
766
diff
changeset
|
815 x = bounds.left; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
816 y = bounds.top; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
817 } else { |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
818 x = y = -1; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
819 swp_flags |= SWP_NOMOVE; |
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
766
diff
changeset
|
820 } |
448
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
821 if ( flags & SDL_FULLSCREEN ) { |
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
822 top = HWND_TOPMOST; |
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
823 } else { |
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
824 top = HWND_NOTOPMOST; |
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
825 } |
323c766f5a46
Fullscreen windows are always topmost under Windows
Sam Lantinga <slouken@libsdl.org>
parents:
442
diff
changeset
|
826 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
|
827 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
|
828 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
|
829 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
|
830 } |
0 | 831 SetForegroundWindow(SDL_Window); |
832 } | |
1291
31331c444ea2
Only save the window position if we're in windowed mode
Sam Lantinga <slouken@libsdl.org>
parents:
1290
diff
changeset
|
833 SDL_resizing = 0; |
0 | 834 |
835 /* Set up for OpenGL */ | |
836 if ( flags & SDL_OPENGL ) { | |
837 if ( WIN_GL_SetupWindow(this) < 0 ) { | |
838 return(NULL); | |
839 } | |
840 video->flags |= SDL_OPENGL; | |
841 } | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
842 |
1523 | 843 /* JC 14 Mar 2006 |
844 Flush the message loop or this can cause big problems later | |
845 Especially if the user decides to use dialog boxes or assert()! | |
846 */ | |
847 WIN_FlushMessageQueue(); | |
848 | |
0 | 849 /* We're live! */ |
850 return(video); | |
851 } | |
852 | |
853 /* We don't actually allow hardware surfaces in the DIB driver */ | |
854 static int DIB_AllocHWSurface(_THIS, SDL_Surface *surface) | |
855 { | |
856 return(-1); | |
857 } | |
858 static void DIB_FreeHWSurface(_THIS, SDL_Surface *surface) | |
859 { | |
860 return; | |
861 } | |
862 static int DIB_LockHWSurface(_THIS, SDL_Surface *surface) | |
863 { | |
864 return(0); | |
865 } | |
866 static void DIB_UnlockHWSurface(_THIS, SDL_Surface *surface) | |
867 { | |
868 return; | |
869 } | |
870 | |
871 static void DIB_NormalUpdate(_THIS, int numrects, SDL_Rect *rects) | |
872 { | |
873 HDC hdc, mdc; | |
874 int i; | |
875 | |
876 hdc = GetDC(SDL_Window); | |
877 if ( screen_pal ) { | |
878 SelectPalette(hdc, screen_pal, FALSE); | |
879 } | |
880 mdc = CreateCompatibleDC(hdc); | |
881 SelectObject(mdc, screen_bmp); | |
882 for ( i=0; i<numrects; ++i ) { | |
883 BitBlt(hdc, rects[i].x, rects[i].y, rects[i].w, rects[i].h, | |
884 mdc, rects[i].x, rects[i].y, SRCCOPY); | |
885 } | |
886 DeleteDC(mdc); | |
887 ReleaseDC(SDL_Window, hdc); | |
888 } | |
889 | |
3992 | 890 static int FindPaletteIndex(LOGPALETTE *pal, BYTE r, BYTE g, BYTE b) |
891 { | |
892 PALETTEENTRY *entry; | |
893 int i; | |
894 int nentries = pal->palNumEntries; | |
895 | |
896 for ( i = 0; i < nentries; ++i ) { | |
897 entry = &pal->palPalEntry[i]; | |
898 if ( entry->peRed == r && entry->peGreen == g && entry->peBlue == b ) { | |
899 return i; | |
900 } | |
901 } | |
902 return -1; | |
903 } | |
904 | |
905 static BOOL CheckPaletteEntry(LOGPALETTE *pal, int index, BYTE r, BYTE g, BYTE b) | |
906 { | |
907 PALETTEENTRY *entry; | |
908 BOOL moved = 0; | |
909 | |
910 entry = &pal->palPalEntry[index]; | |
911 if ( entry->peRed != r || entry->peGreen != g || entry->peBlue != b ) { | |
912 int found = FindPaletteIndex(pal, r, g, b); | |
913 if ( found >= 0 ) { | |
914 pal->palPalEntry[found] = *entry; | |
915 } | |
916 entry->peRed = r; | |
917 entry->peGreen = g; | |
918 entry->peBlue = b; | |
919 moved = 1; | |
920 } | |
921 entry->peFlags = 0; | |
922 | |
923 return moved; | |
924 } | |
1251
86d0d01290ea
Updated Windows CE/PocketPC support...adds GAPI driver, landscape mode,
Ryan C. Gordon <icculus@icculus.org>
parents:
1152
diff
changeset
|
925 |
0 | 926 int DIB_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) |
927 { | |
1292
59c7a470a51e
Fixed palette bug on non-WinCE
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
928 #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) |
59c7a470a51e
Fixed palette bug on non-WinCE
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
929 HDC hdc, mdc; |
0 | 930 RGBQUAD *pal; |
1292
59c7a470a51e
Fixed palette bug on non-WinCE
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
931 #else |
1251
86d0d01290ea
Updated Windows CE/PocketPC support...adds GAPI driver, landscape mode,
Ryan C. Gordon <icculus@icculus.org>
parents:
1152
diff
changeset
|
932 HDC hdc; |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
933 #endif |
1292
59c7a470a51e
Fixed palette bug on non-WinCE
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
934 int i; |
3992 | 935 int moved_entries = 0; |
0 | 936 |
937 /* Update the display palette */ | |
938 hdc = GetDC(SDL_Window); | |
939 if ( screen_pal ) { | |
3992 | 940 PALETTEENTRY *entry; |
0 | 941 |
942 for ( i=0; i<ncolors; ++i ) { | |
3992 | 943 entry = &screen_logpal->palPalEntry[firstcolor+i]; |
944 entry->peRed = colors[i].r; | |
945 entry->peGreen = colors[i].g; | |
946 entry->peBlue = colors[i].b; | |
947 entry->peFlags = PC_NOCOLLAPSE; | |
948 } | |
4075
0207ca19fd8f
Fixed building on Windows CE
Sam Lantinga <slouken@libsdl.org>
parents:
3992
diff
changeset
|
949 #ifdef SYSPAL_NOSTATIC |
3992 | 950 /* Check to make sure black and white are in position */ |
951 if ( GetSystemPaletteUse(hdc) != SYSPAL_NOSTATIC256 ) { | |
952 moved_entries += CheckPaletteEntry(screen_logpal, 0, 0x00, 0x00, 0x00); | |
953 moved_entries += CheckPaletteEntry(screen_logpal, screen_logpal->palNumEntries-1, 0xff, 0xff, 0xff); | |
0 | 954 } |
3992 | 955 /* FIXME: |
956 If we don't have full access to the palette, what we | |
957 really want to do is find the 236 most diverse colors | |
958 in the desired palette, set those entries (10-245) and | |
959 then map everything into the new system palette. | |
960 */ | |
4075
0207ca19fd8f
Fixed building on Windows CE
Sam Lantinga <slouken@libsdl.org>
parents:
3992
diff
changeset
|
961 #endif |
3992 | 962 |
4075
0207ca19fd8f
Fixed building on Windows CE
Sam Lantinga <slouken@libsdl.org>
parents:
3992
diff
changeset
|
963 #ifndef _WIN32_WCE |
3992 | 964 /* Copy the entries into the system palette */ |
965 UnrealizeObject(screen_pal); | |
4075
0207ca19fd8f
Fixed building on Windows CE
Sam Lantinga <slouken@libsdl.org>
parents:
3992
diff
changeset
|
966 #endif |
3992 | 967 SetPaletteEntries(screen_pal, 0, screen_logpal->palNumEntries, screen_logpal->palPalEntry); |
0 | 968 SelectPalette(hdc, screen_pal, FALSE); |
969 RealizePalette(hdc); | |
970 } | |
971 | |
1292
59c7a470a51e
Fixed palette bug on non-WinCE
Sam Lantinga <slouken@libsdl.org>
parents:
1291
diff
changeset
|
972 #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) |
0 | 973 /* Copy palette colors into DIB palette */ |
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
|
974 pal = SDL_stack_alloc(RGBQUAD, ncolors); |
0 | 975 for ( i=0; i<ncolors; ++i ) { |
976 pal[i].rgbRed = colors[i].r; | |
977 pal[i].rgbGreen = colors[i].g; | |
978 pal[i].rgbBlue = colors[i].b; | |
979 pal[i].rgbReserved = 0; | |
980 } | |
981 | |
982 /* Set the DIB palette and update the display */ | |
983 mdc = CreateCompatibleDC(hdc); | |
984 SelectObject(mdc, screen_bmp); | |
985 SetDIBColorTable(mdc, firstcolor, ncolors, pal); | |
4079
fda6e33893b7
Always advertise hardware palette, since Windows will remap colors for us.
Sam Lantinga <slouken@libsdl.org>
parents:
4075
diff
changeset
|
986 if ( moved_entries || !grab_palette ) { |
3992 | 987 BitBlt(hdc, 0, 0, this->screen->w, this->screen->h, |
988 mdc, 0, 0, SRCCOPY); | |
989 } | |
0 | 990 DeleteDC(mdc); |
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
|
991 SDL_stack_free(pal); |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
992 #endif |
0 | 993 ReleaseDC(SDL_Window, hdc); |
994 return(1); | |
995 } | |
996 | |
1251
86d0d01290ea
Updated Windows CE/PocketPC support...adds GAPI driver, landscape mode,
Ryan C. Gordon <icculus@icculus.org>
parents:
1152
diff
changeset
|
997 |
0 | 998 static void DIB_CheckGamma(_THIS) |
999 { | |
1000 #ifndef NO_GAMMA_SUPPORT | |
1001 HDC hdc; | |
1002 WORD ramp[3*256]; | |
1003 | |
1004 /* If we fail to get gamma, disable gamma control */ | |
1005 hdc = GetDC(SDL_Window); | |
1006 if ( ! GetDeviceGammaRamp(hdc, ramp) ) { | |
1007 this->GetGammaRamp = NULL; | |
1008 this->SetGammaRamp = NULL; | |
1009 } | |
1010 ReleaseDC(SDL_Window, hdc); | |
1011 #endif /* !NO_GAMMA_SUPPORT */ | |
1012 } | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
1013 void DIB_SwapGamma(_THIS) |
0 | 1014 { |
1015 #ifndef NO_GAMMA_SUPPORT | |
1016 HDC hdc; | |
1017 | |
1018 if ( gamma_saved ) { | |
1019 hdc = GetDC(SDL_Window); | |
1020 if ( SDL_GetAppState() & SDL_APPINPUTFOCUS ) { | |
1021 /* About to leave active state, restore gamma */ | |
1022 SetDeviceGammaRamp(hdc, gamma_saved); | |
1023 } else { | |
1024 /* About to enter active state, set game gamma */ | |
1025 GetDeviceGammaRamp(hdc, gamma_saved); | |
1026 SetDeviceGammaRamp(hdc, this->gamma); | |
1027 } | |
1028 ReleaseDC(SDL_Window, hdc); | |
1029 } | |
1030 #endif /* !NO_GAMMA_SUPPORT */ | |
1031 } | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
1032 void DIB_QuitGamma(_THIS) |
0 | 1033 { |
1034 #ifndef NO_GAMMA_SUPPORT | |
1035 if ( gamma_saved ) { | |
1036 /* Restore the original gamma if necessary */ | |
1037 if ( SDL_GetAppState() & SDL_APPINPUTFOCUS ) { | |
1038 HDC hdc; | |
1039 | |
1040 hdc = GetDC(SDL_Window); | |
1041 SetDeviceGammaRamp(hdc, gamma_saved); | |
1042 ReleaseDC(SDL_Window, hdc); | |
1043 } | |
1044 | |
1045 /* Free the saved gamma memory */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1046 SDL_free(gamma_saved); |
0 | 1047 gamma_saved = 0; |
1048 } | |
1049 #endif /* !NO_GAMMA_SUPPORT */ | |
1050 } | |
1051 | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
1052 int DIB_SetGammaRamp(_THIS, Uint16 *ramp) |
0 | 1053 { |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
1054 #ifdef NO_GAMMA_SUPPORT |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
1055 SDL_SetError("SDL compiled without gamma ramp support"); |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
1056 return -1; |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
1057 #else |
0 | 1058 HDC hdc; |
1059 BOOL succeeded; | |
1060 | |
1061 /* Set the ramp for the display */ | |
1062 if ( ! gamma_saved ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
1063 gamma_saved = (WORD *)SDL_malloc(3*256*sizeof(*gamma_saved)); |
0 | 1064 if ( ! gamma_saved ) { |
1065 SDL_OutOfMemory(); | |
1066 return -1; | |
1067 } | |
1068 hdc = GetDC(SDL_Window); | |
1069 GetDeviceGammaRamp(hdc, gamma_saved); | |
1070 ReleaseDC(SDL_Window, hdc); | |
1071 } | |
1072 if ( SDL_GetAppState() & SDL_APPINPUTFOCUS ) { | |
1073 hdc = GetDC(SDL_Window); | |
1074 succeeded = SetDeviceGammaRamp(hdc, ramp); | |
1075 ReleaseDC(SDL_Window, hdc); | |
1076 } else { | |
1077 succeeded = TRUE; | |
1078 } | |
1079 return succeeded ? 0 : -1; | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
1080 #endif /* !NO_GAMMA_SUPPORT */ |
0 | 1081 } |
1082 | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
1083 int DIB_GetGammaRamp(_THIS, Uint16 *ramp) |
0 | 1084 { |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
1085 #ifdef NO_GAMMA_SUPPORT |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
1086 SDL_SetError("SDL compiled without gamma ramp support"); |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
1087 return -1; |
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
1088 #else |
0 | 1089 HDC hdc; |
1090 BOOL succeeded; | |
1091 | |
1092 /* Get the ramp from the display */ | |
1093 hdc = GetDC(SDL_Window); | |
1094 succeeded = GetDeviceGammaRamp(hdc, ramp); | |
1095 ReleaseDC(SDL_Window, hdc); | |
1096 return succeeded ? 0 : -1; | |
338
518ffd98a8f6
Fixed gamma ramps in DirectX windowed and OpenGL modes
Sam Lantinga <slouken@libsdl.org>
parents:
304
diff
changeset
|
1097 #endif /* !NO_GAMMA_SUPPORT */ |
0 | 1098 } |
1099 | |
1100 void DIB_VideoQuit(_THIS) | |
1101 { | |
1881 | 1102 int i, j; |
1103 | |
0 | 1104 /* Destroy the window and everything associated with it */ |
1105 if ( SDL_Window ) { | |
1106 /* Delete the screen bitmap (also frees screen->pixels) */ | |
1107 if ( this->screen ) { | |
4079
fda6e33893b7
Always advertise hardware palette, since Windows will remap colors for us.
Sam Lantinga <slouken@libsdl.org>
parents:
4075
diff
changeset
|
1108 if ( grab_palette ) { |
3992 | 1109 DIB_ReleaseStaticColors(SDL_Window); |
1110 } | |
0 | 1111 #ifndef NO_CHANGEDISPLAYSETTINGS |
1112 if ( this->screen->flags & SDL_FULLSCREEN ) { | |
1113 ChangeDisplaySettings(NULL, 0); | |
376
a5f60a847a89
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
374
diff
changeset
|
1114 ShowWindow(SDL_Window, SW_HIDE); |
0 | 1115 } |
1116 #endif | |
1117 if ( this->screen->flags & SDL_OPENGL ) { | |
1118 WIN_GL_ShutDown(this); | |
1119 } | |
1120 this->screen->pixels = NULL; | |
1121 } | |
3992 | 1122 if ( screen_pal != NULL ) { |
1123 DeleteObject(screen_pal); | |
1124 screen_pal = NULL; | |
1125 } | |
1126 if ( screen_logpal != NULL ) { | |
1127 SDL_free(screen_logpal); | |
1128 screen_logpal = NULL; | |
1129 } | |
0 | 1130 if ( screen_bmp ) { |
1131 DeleteObject(screen_bmp); | |
1132 screen_bmp = NULL; | |
1133 } | |
1134 if ( screen_icn ) { | |
1135 DestroyIcon(screen_icn); | |
1136 screen_icn = NULL; | |
1137 } | |
1138 DIB_QuitGamma(this); | |
1139 DIB_DestroyWindow(this); | |
1140 | |
1141 SDL_Window = NULL; | |
1152
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
1142 |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
1143 #if defined(_WIN32_WCE) |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
1144 |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
1145 // Unload wince aygshell library to prevent leak |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
1146 if( aygshell ) |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
1147 { |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
1148 FreeLibrary(aygshell); |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
1149 aygshell = NULL; |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
1150 } |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
1151 #endif |
1881 | 1152 } |
1152
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1145
diff
changeset
|
1153 |
1881 | 1154 for ( i=0; i < SDL_arraysize(SDL_modelist); ++i ) { |
1155 if ( !SDL_modelist[i] ) { | |
1156 continue; | |
1157 } | |
1158 for ( j=0; SDL_modelist[i][j]; ++j ) { | |
1159 SDL_free(SDL_modelist[i][j]); | |
1160 } | |
1161 SDL_free(SDL_modelist[i]); | |
1162 SDL_modelist[i] = NULL; | |
1163 SDL_nummodes[i] = 0; | |
0 | 1164 } |
1165 } | |
1166 | |
1167 /* Exported for the windows message loop only */ | |
3992 | 1168 static void DIB_GrabStaticColors(HWND window) |
1169 { | |
4075
0207ca19fd8f
Fixed building on Windows CE
Sam Lantinga <slouken@libsdl.org>
parents:
3992
diff
changeset
|
1170 #ifdef SYSPAL_NOSTATIC |
3992 | 1171 HDC hdc; |
1172 | |
1173 hdc = GetDC(window); | |
1174 SetSystemPaletteUse(hdc, SYSPAL_NOSTATIC256); | |
1175 if ( GetSystemPaletteUse(hdc) != SYSPAL_NOSTATIC256 ) { | |
1176 SetSystemPaletteUse(hdc, SYSPAL_NOSTATIC); | |
1177 } | |
1178 ReleaseDC(window, hdc); | |
4075
0207ca19fd8f
Fixed building on Windows CE
Sam Lantinga <slouken@libsdl.org>
parents:
3992
diff
changeset
|
1179 #endif |
3992 | 1180 } |
1181 static void DIB_ReleaseStaticColors(HWND window) | |
1182 { | |
4075
0207ca19fd8f
Fixed building on Windows CE
Sam Lantinga <slouken@libsdl.org>
parents:
3992
diff
changeset
|
1183 #ifdef SYSPAL_NOSTATIC |
3992 | 1184 HDC hdc; |
1185 | |
1186 hdc = GetDC(window); | |
1187 SetSystemPaletteUse(hdc, SYSPAL_STATIC); | |
1188 ReleaseDC(window, hdc); | |
4075
0207ca19fd8f
Fixed building on Windows CE
Sam Lantinga <slouken@libsdl.org>
parents:
3992
diff
changeset
|
1189 #endif |
3992 | 1190 } |
1191 static void DIB_Activate(_THIS, BOOL active, BOOL minimized) | |
1192 { | |
4079
fda6e33893b7
Always advertise hardware palette, since Windows will remap colors for us.
Sam Lantinga <slouken@libsdl.org>
parents:
4075
diff
changeset
|
1193 if ( grab_palette ) { |
3992 | 1194 if ( !active ) { |
1195 DIB_ReleaseStaticColors(SDL_Window); | |
1196 DIB_RealizePalette(this); | |
1197 } else if ( !minimized ) { | |
1198 DIB_GrabStaticColors(SDL_Window); | |
1199 DIB_RealizePalette(this); | |
1200 } | |
1201 } | |
1202 } | |
1203 static void DIB_RealizePalette(_THIS) | |
0 | 1204 { |
1205 if ( screen_pal != NULL ) { | |
1206 HDC hdc; | |
1207 | |
1208 hdc = GetDC(SDL_Window); | |
4075
0207ca19fd8f
Fixed building on Windows CE
Sam Lantinga <slouken@libsdl.org>
parents:
3992
diff
changeset
|
1209 #ifndef _WIN32_WCE |
3992 | 1210 UnrealizeObject(screen_pal); |
4075
0207ca19fd8f
Fixed building on Windows CE
Sam Lantinga <slouken@libsdl.org>
parents:
3992
diff
changeset
|
1211 #endif |
0 | 1212 SelectPalette(hdc, screen_pal, FALSE); |
3992 | 1213 if ( RealizePalette(hdc) ) { |
0 | 1214 InvalidateRect(SDL_Window, NULL, FALSE); |
3992 | 1215 } |
0 | 1216 ReleaseDC(SDL_Window, hdc); |
1217 } | |
1218 } | |
1219 static void DIB_PaletteChanged(_THIS, HWND window) | |
1220 { | |
1221 if ( window != SDL_Window ) { | |
3992 | 1222 DIB_RealizePalette(this); |
0 | 1223 } |
1224 } | |
1225 | |
1226 /* Exported for the windows message loop only */ | |
1227 static void DIB_WinPAINT(_THIS, HDC hdc) | |
1228 { | |
1229 HDC mdc; | |
1230 | |
1231 if ( screen_pal ) { | |
1232 SelectPalette(hdc, screen_pal, FALSE); | |
1233 } | |
1234 mdc = CreateCompatibleDC(hdc); | |
1235 SelectObject(mdc, screen_bmp); | |
1236 BitBlt(hdc, 0, 0, SDL_VideoSurface->w, SDL_VideoSurface->h, | |
1237 mdc, 0, 0, SRCCOPY); | |
1238 DeleteDC(mdc); | |
1239 } | |
1240 | |
1241 /* Stub in case DirectX isn't available */ | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
1242 #if !SDL_AUDIO_DRIVER_DSOUND |
0 | 1243 void DX5_SoundFocus(HWND hwnd) |
1244 { | |
1245 return; | |
1246 } | |
1247 #endif |