Mercurial > sdl-ios-xcode
comparison src/video/SDL_video.c @ 2753:0969758c8809
indent
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 15 Sep 2008 04:32:36 +0000 |
parents | 587d2b5fb805 |
children | fa1095d42a5b |
comparison
equal
deleted
inserted
replaced
2752:edd2839b36f7 | 2753:0969758c8809 |
---|---|
33 #include "../events/SDL_sysevents.h" | 33 #include "../events/SDL_sysevents.h" |
34 #include "../events/SDL_events_c.h" | 34 #include "../events/SDL_events_c.h" |
35 | 35 |
36 #if SDL_VIDEO_OPENGL_ES | 36 #if SDL_VIDEO_OPENGL_ES |
37 #include "SDL_opengles.h" | 37 #include "SDL_opengles.h" |
38 #endif /* SDL_VIDEO_OPENGL_ES */ | 38 #endif /* SDL_VIDEO_OPENGL_ES */ |
39 | 39 |
40 #if SDL_VIDEO_OPENGL | 40 #if SDL_VIDEO_OPENGL |
41 #include "SDL_opengl.h" | 41 #include "SDL_opengl.h" |
42 | 42 |
43 /* On Windows, windows.h defines CreateWindow */ | 43 /* On Windows, windows.h defines CreateWindow */ |
44 #ifdef CreateWindow | 44 #ifdef CreateWindow |
45 #undef CreateWindow | 45 #undef CreateWindow |
46 #endif | 46 #endif |
47 #endif /* SDL_VIDEO_OPENGL */ | 47 #endif /* SDL_VIDEO_OPENGL */ |
48 | 48 |
49 /* Available video drivers */ | 49 /* Available video drivers */ |
50 static VideoBootStrap *bootstrap[] = { | 50 static VideoBootStrap *bootstrap[] = { |
51 #if SDL_VIDEO_DRIVER_COCOA | 51 #if SDL_VIDEO_DRIVER_COCOA |
52 &COCOA_bootstrap, | 52 &COCOA_bootstrap, |
53 #endif | 53 #endif |
54 #if SDL_VIDEO_DRIVER_X11 | 54 #if SDL_VIDEO_DRIVER_X11 |
55 &X11_bootstrap, | 55 &X11_bootstrap, |
56 #endif | 56 #endif |
57 #if SDL_VIDEO_DRIVER_NANOX | 57 #if SDL_VIDEO_DRIVER_NANOX |
58 &NX_bootstrap, | 58 &NX_bootstrap, |
59 #endif | 59 #endif |
60 #if SDL_VIDEO_DRIVER_IPOD | 60 #if SDL_VIDEO_DRIVER_IPOD |
61 &iPod_bootstrap, | 61 &iPod_bootstrap, |
62 #endif | 62 #endif |
63 #if SDL_VIDEO_DRIVER_WSCONS | 63 #if SDL_VIDEO_DRIVER_WSCONS |
64 &WSCONS_bootstrap, | 64 &WSCONS_bootstrap, |
65 #endif | 65 #endif |
66 #if SDL_VIDEO_DRIVER_FBCON | 66 #if SDL_VIDEO_DRIVER_FBCON |
67 &FBCON_bootstrap, | 67 &FBCON_bootstrap, |
68 #endif | 68 #endif |
69 #if SDL_VIDEO_DRIVER_DIRECTFB | 69 #if SDL_VIDEO_DRIVER_DIRECTFB |
70 &DirectFB_bootstrap, | 70 &DirectFB_bootstrap, |
71 #endif | 71 #endif |
72 #if SDL_VIDEO_DRIVER_PS2GS | 72 #if SDL_VIDEO_DRIVER_PS2GS |
73 &PS2GS_bootstrap, | 73 &PS2GS_bootstrap, |
74 #endif | 74 #endif |
75 #if SDL_VIDEO_DRIVER_VGL | 75 #if SDL_VIDEO_DRIVER_VGL |
76 &VGL_bootstrap, | 76 &VGL_bootstrap, |
77 #endif | 77 #endif |
78 #if SDL_VIDEO_DRIVER_SVGALIB | 78 #if SDL_VIDEO_DRIVER_SVGALIB |
79 &SVGALIB_bootstrap, | 79 &SVGALIB_bootstrap, |
80 #endif | 80 #endif |
81 #if SDL_VIDEO_DRIVER_GAPI | 81 #if SDL_VIDEO_DRIVER_GAPI |
82 &GAPI_bootstrap, | 82 &GAPI_bootstrap, |
83 #endif | 83 #endif |
84 #if SDL_VIDEO_DRIVER_WIN32 | 84 #if SDL_VIDEO_DRIVER_WIN32 |
85 &WIN32_bootstrap, | 85 &WIN32_bootstrap, |
86 #endif | 86 #endif |
87 #if SDL_VIDEO_DRIVER_BWINDOW | 87 #if SDL_VIDEO_DRIVER_BWINDOW |
88 &BWINDOW_bootstrap, | 88 &BWINDOW_bootstrap, |
89 #endif | 89 #endif |
90 #if SDL_VIDEO_DRIVER_PHOTON | 90 #if SDL_VIDEO_DRIVER_PHOTON |
91 &ph_bootstrap, | 91 &ph_bootstrap, |
92 #endif | 92 #endif |
93 #if SDL_VIDEO_DRIVER_EPOC | 93 #if SDL_VIDEO_DRIVER_EPOC |
94 &EPOC_bootstrap, | 94 &EPOC_bootstrap, |
95 #endif | 95 #endif |
96 #if SDL_VIDEO_DRIVER_XBIOS | 96 #if SDL_VIDEO_DRIVER_XBIOS |
97 &XBIOS_bootstrap, | 97 &XBIOS_bootstrap, |
98 #endif | 98 #endif |
99 #if SDL_VIDEO_DRIVER_GEM | 99 #if SDL_VIDEO_DRIVER_GEM |
100 &GEM_bootstrap, | 100 &GEM_bootstrap, |
101 #endif | 101 #endif |
102 #if SDL_VIDEO_DRIVER_DC | 102 #if SDL_VIDEO_DRIVER_DC |
103 &DC_bootstrap, | 103 &DC_bootstrap, |
104 #endif | 104 #endif |
105 #if SDL_VIDEO_DRIVER_RISCOS | 105 #if SDL_VIDEO_DRIVER_RISCOS |
106 &RISCOS_bootstrap, | 106 &RISCOS_bootstrap, |
107 #endif | 107 #endif |
108 #if SDL_VIDEO_DRIVER_OS2FS | 108 #if SDL_VIDEO_DRIVER_OS2FS |
109 &OS2FSLib_bootstrap, | 109 &OS2FSLib_bootstrap, |
110 #endif | 110 #endif |
111 #if SDL_VIDEO_DRIVER_NDS | 111 #if SDL_VIDEO_DRIVER_NDS |
112 &NDS_bootstrap, | 112 &NDS_bootstrap, |
113 #endif | 113 #endif |
114 #if SDL_VIDEO_DRIVER_UIKIT | 114 #if SDL_VIDEO_DRIVER_UIKIT |
115 &UIKIT_bootstrap, | 115 &UIKIT_bootstrap, |
116 #endif | 116 #endif |
117 #if SDL_VIDEO_DRIVER_DUMMY | 117 #if SDL_VIDEO_DRIVER_DUMMY |
118 &DUMMY_bootstrap, | 118 &DUMMY_bootstrap, |
119 #endif | 119 #endif |
120 NULL | 120 NULL |
121 }; | 121 }; |
122 | 122 |
123 static SDL_VideoDevice *_this = NULL; | 123 static SDL_VideoDevice *_this = NULL; |
124 | 124 |
125 /* Various local functions */ | 125 /* Various local functions */ |
126 int SDL_VideoInit(const char *driver_name, Uint32 flags); | 126 int SDL_VideoInit(const char *driver_name, Uint32 flags); |
127 void SDL_VideoQuit(void); | 127 void SDL_VideoQuit(void); |
128 | 128 |
129 static int | 129 static int |
130 cmpmodes(const void *A, const void *B) | 130 cmpmodes(const void *A, const void *B) |
131 { | 131 { |
132 SDL_DisplayMode a = *(const SDL_DisplayMode *) A; | 132 SDL_DisplayMode a = *(const SDL_DisplayMode *) A; |
133 SDL_DisplayMode b = *(const SDL_DisplayMode *) B; | 133 SDL_DisplayMode b = *(const SDL_DisplayMode *) B; |
134 | 134 |
135 if (a.w != b.w) { | 135 if (a.w != b.w) { |
136 return b.w - a.w; | 136 return b.w - a.w; |
137 } | 137 } |
138 if (a.h != b.h) { | 138 if (a.h != b.h) { |
139 return b.h - a.h; | 139 return b.h - a.h; |
140 } | 140 } |
141 if (SDL_BITSPERPIXEL(a.format) != SDL_BITSPERPIXEL(b.format)) { | 141 if (SDL_BITSPERPIXEL(a.format) != SDL_BITSPERPIXEL(b.format)) { |
142 return SDL_BITSPERPIXEL(b.format) - SDL_BITSPERPIXEL(a.format); | 142 return SDL_BITSPERPIXEL(b.format) - SDL_BITSPERPIXEL(a.format); |
143 } | 143 } |
144 if (a.refresh_rate != b.refresh_rate) { | 144 if (a.refresh_rate != b.refresh_rate) { |
145 return b.refresh_rate - a.refresh_rate; | 145 return b.refresh_rate - a.refresh_rate; |
146 } | 146 } |
147 return 0; | 147 return 0; |
148 } | 148 } |
149 | 149 |
150 static void | 150 static void |
151 SDL_UninitializedVideo() | 151 SDL_UninitializedVideo() |
152 { | 152 { |
153 SDL_SetError("Video subsystem has not been initialized"); | 153 SDL_SetError("Video subsystem has not been initialized"); |
154 } | 154 } |
155 | 155 |
156 int | 156 int |
157 SDL_GetNumVideoDrivers(void) | 157 SDL_GetNumVideoDrivers(void) |
158 { | 158 { |
159 return SDL_arraysize(bootstrap) - 1; | 159 return SDL_arraysize(bootstrap) - 1; |
160 } | 160 } |
161 | 161 |
162 const char * | 162 const char * |
163 SDL_GetVideoDriver(int index) | 163 SDL_GetVideoDriver(int index) |
164 { | 164 { |
165 if (index >= 0 && index < SDL_GetNumVideoDrivers()) { | 165 if (index >= 0 && index < SDL_GetNumVideoDrivers()) { |
166 return bootstrap[index]->name; | 166 return bootstrap[index]->name; |
167 } | 167 } |
168 return NULL; | 168 return NULL; |
169 } | 169 } |
170 | 170 |
171 /* | 171 /* |
172 * Initialize the video and event subsystems -- determine native pixel format | 172 * Initialize the video and event subsystems -- determine native pixel format |
173 */ | 173 */ |
174 int | 174 int |
175 SDL_VideoInit(const char *driver_name, Uint32 flags) | 175 SDL_VideoInit(const char *driver_name, Uint32 flags) |
176 { | 176 { |
177 SDL_VideoDevice *video; | 177 SDL_VideoDevice *video; |
178 int index; | 178 int index; |
179 int i; | 179 int i; |
180 | 180 |
181 /* Toggle the event thread flags, based on OS requirements */ | 181 /* Toggle the event thread flags, based on OS requirements */ |
182 #if defined(MUST_THREAD_EVENTS) | 182 #if defined(MUST_THREAD_EVENTS) |
183 flags |= SDL_INIT_EVENTTHREAD; | 183 flags |= SDL_INIT_EVENTTHREAD; |
184 #elif defined(CANT_THREAD_EVENTS) | 184 #elif defined(CANT_THREAD_EVENTS) |
185 if ((flags & SDL_INIT_EVENTTHREAD) == SDL_INIT_EVENTTHREAD) { | 185 if ((flags & SDL_INIT_EVENTTHREAD) == SDL_INIT_EVENTTHREAD) { |
186 SDL_SetError("OS doesn't support threaded events"); | 186 SDL_SetError("OS doesn't support threaded events"); |
187 return -1; | 187 return -1; |
188 } | 188 } |
189 #endif | 189 #endif |
190 | 190 |
191 /* Start the event loop */ | 191 /* Start the event loop */ |
192 if (SDL_StartEventLoop(flags) < 0) { | 192 if (SDL_StartEventLoop(flags) < 0) { |
193 return -1; | 193 return -1; |
194 } | 194 } |
195 /* Check to make sure we don't overwrite '_this' */ | 195 /* Check to make sure we don't overwrite '_this' */ |
196 if (_this != NULL) { | 196 if (_this != NULL) { |
197 SDL_VideoQuit(); | 197 SDL_VideoQuit(); |
198 } | 198 } |
199 /* Select the proper video driver */ | 199 /* Select the proper video driver */ |
200 index = 0; | 200 index = 0; |
201 video = NULL; | 201 video = NULL; |
202 if (driver_name == NULL) { | 202 if (driver_name == NULL) { |
203 driver_name = SDL_getenv("SDL_VIDEODRIVER"); | 203 driver_name = SDL_getenv("SDL_VIDEODRIVER"); |
204 } | 204 } |
205 if (driver_name != NULL) { | 205 if (driver_name != NULL) { |
206 for (i = 0; bootstrap[i]; ++i) { | 206 for (i = 0; bootstrap[i]; ++i) { |
207 if (SDL_strcasecmp(bootstrap[i]->name, driver_name) == 0) { | 207 if (SDL_strcasecmp(bootstrap[i]->name, driver_name) == 0) { |
208 if (bootstrap[i]->available()) { | 208 if (bootstrap[i]->available()) { |
209 video = bootstrap[i]->create(index); | 209 video = bootstrap[i]->create(index); |
210 } | 210 } |
211 break; | 211 break; |
212 } | 212 } |
213 } | 213 } |
214 } else { | 214 } else { |
215 for (i = 0; bootstrap[i]; ++i) { | 215 for (i = 0; bootstrap[i]; ++i) { |
216 if (bootstrap[i]->available()) { | 216 if (bootstrap[i]->available()) { |
217 video = bootstrap[i]->create(index); | 217 video = bootstrap[i]->create(index); |
218 if (video != NULL) { | 218 if (video != NULL) { |
219 break; | 219 break; |
220 } | 220 } |
221 } | 221 } |
222 } | 222 } |
223 } | 223 } |
224 if (video == NULL) { | 224 if (video == NULL) { |
225 if (driver_name) { | 225 if (driver_name) { |
226 SDL_SetError("%s not available", driver_name); | 226 SDL_SetError("%s not available", driver_name); |
227 } else { | 227 } else { |
228 SDL_SetError("No available video device"); | 228 SDL_SetError("No available video device"); |
229 } | 229 } |
230 return -1; | 230 return -1; |
231 } | 231 } |
232 _this = video; | 232 _this = video; |
233 _this->name = bootstrap[i]->name; | 233 _this->name = bootstrap[i]->name; |
234 _this->next_object_id = 1; | 234 _this->next_object_id = 1; |
235 | 235 |
236 | 236 |
237 /* Set some very sane GL defaults */ | 237 /* Set some very sane GL defaults */ |
238 _this->gl_config.driver_loaded = 0; | 238 _this->gl_config.driver_loaded = 0; |
239 _this->gl_config.dll_handle = NULL; | 239 _this->gl_config.dll_handle = NULL; |
240 _this->gl_config.red_size = 3; | 240 _this->gl_config.red_size = 3; |
241 _this->gl_config.green_size = 3; | 241 _this->gl_config.green_size = 3; |
242 _this->gl_config.blue_size = 2; | 242 _this->gl_config.blue_size = 2; |
243 _this->gl_config.alpha_size = 0; | 243 _this->gl_config.alpha_size = 0; |
244 _this->gl_config.buffer_size = 0; | 244 _this->gl_config.buffer_size = 0; |
245 _this->gl_config.depth_size = 16; | 245 _this->gl_config.depth_size = 16; |
246 _this->gl_config.stencil_size = 0; | 246 _this->gl_config.stencil_size = 0; |
247 _this->gl_config.double_buffer = 1; | 247 _this->gl_config.double_buffer = 1; |
248 _this->gl_config.accum_red_size = 0; | 248 _this->gl_config.accum_red_size = 0; |
249 _this->gl_config.accum_green_size = 0; | 249 _this->gl_config.accum_green_size = 0; |
250 _this->gl_config.accum_blue_size = 0; | 250 _this->gl_config.accum_blue_size = 0; |
251 _this->gl_config.accum_alpha_size = 0; | 251 _this->gl_config.accum_alpha_size = 0; |
252 _this->gl_config.stereo = 0; | 252 _this->gl_config.stereo = 0; |
253 _this->gl_config.multisamplebuffers = 0; | 253 _this->gl_config.multisamplebuffers = 0; |
254 _this->gl_config.multisamplesamples = 0; | 254 _this->gl_config.multisamplesamples = 0; |
255 _this->gl_config.retained_backing = 1; | 255 _this->gl_config.retained_backing = 1; |
256 _this->gl_config.accelerated = -1; /* not known, don't set */ | 256 _this->gl_config.accelerated = -1; /* not known, don't set */ |
257 | 257 |
258 /* Initialize the video subsystem */ | 258 /* Initialize the video subsystem */ |
259 if (_this->VideoInit(_this) < 0) { | 259 if (_this->VideoInit(_this) < 0) { |
260 SDL_VideoQuit(); | 260 SDL_VideoQuit(); |
261 return -1; | 261 return -1; |
262 } | 262 } |
263 /* Make sure some displays were added */ | 263 /* Make sure some displays were added */ |
264 if (_this->num_displays == 0) { | 264 if (_this->num_displays == 0) { |
265 SDL_SetError("The video driver did not add any displays"); | 265 SDL_SetError("The video driver did not add any displays"); |
266 SDL_VideoQuit(); | 266 SDL_VideoQuit(); |
267 return (-1); | 267 return (-1); |
268 } | 268 } |
269 /* The software renderer is always available */ | 269 /* The software renderer is always available */ |
270 for (i = 0; i < _this->num_displays; ++i) { | 270 for (i = 0; i < _this->num_displays; ++i) { |
271 #if SDL_VIDEO_RENDER_OGL | 271 #if SDL_VIDEO_RENDER_OGL |
272 SDL_AddRenderDriver(i, &GL_RenderDriver); | 272 SDL_AddRenderDriver(i, &GL_RenderDriver); |
273 #endif | 273 #endif |
274 | 274 |
275 #if SDL_VIDEO_RENDER_OGL_ES | 275 #if SDL_VIDEO_RENDER_OGL_ES |
276 SDL_AddRenderDriver(i, &GL_ES_RenderDriver); | 276 SDL_AddRenderDriver(i, &GL_ES_RenderDriver); |
277 #endif | 277 #endif |
278 if (_this->displays[i].num_render_drivers > 0) { | 278 if (_this->displays[i].num_render_drivers > 0) { |
279 SDL_AddRenderDriver(i, &SW_RenderDriver); | 279 SDL_AddRenderDriver(i, &SW_RenderDriver); |
280 } | 280 } |
281 } | 281 } |
282 | 282 |
283 /* We're ready to go! */ | 283 /* We're ready to go! */ |
284 return 0; | 284 return 0; |
285 } | 285 } |
286 | 286 |
287 const char * | 287 const char * |
288 SDL_GetCurrentVideoDriver() | 288 SDL_GetCurrentVideoDriver() |
289 { | 289 { |
290 if (!_this) { | 290 if (!_this) { |
291 SDL_UninitializedVideo(); | 291 SDL_UninitializedVideo(); |
292 return NULL; | 292 return NULL; |
293 } | 293 } |
294 return _this->name; | 294 return _this->name; |
295 } | 295 } |
296 | 296 |
297 SDL_VideoDevice * | 297 SDL_VideoDevice * |
298 SDL_GetVideoDevice() | 298 SDL_GetVideoDevice() |
299 { | 299 { |
300 return _this; | 300 return _this; |
301 } | 301 } |
302 | 302 |
303 int | 303 int |
304 SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode) | 304 SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode) |
305 { | 305 { |
306 SDL_VideoDisplay display; | 306 SDL_VideoDisplay display; |
307 | 307 |
308 SDL_zero(display); | 308 SDL_zero(display); |
309 if (desktop_mode) { | 309 if (desktop_mode) { |
310 display.desktop_mode = *desktop_mode; | 310 display.desktop_mode = *desktop_mode; |
311 } | 311 } |
312 display.current_mode = display.desktop_mode; | 312 display.current_mode = display.desktop_mode; |
313 | 313 |
314 return SDL_AddVideoDisplay(&display); | 314 return SDL_AddVideoDisplay(&display); |
315 } | 315 } |
316 | 316 |
317 int | 317 int |
318 SDL_AddVideoDisplay(const SDL_VideoDisplay * display) | 318 SDL_AddVideoDisplay(const SDL_VideoDisplay * display) |
319 { | 319 { |
320 SDL_VideoDisplay *displays; | 320 SDL_VideoDisplay *displays; |
321 int index = -1; | 321 int index = -1; |
322 | 322 |
323 displays = | 323 displays = |
324 SDL_realloc(_this->displays, | 324 SDL_realloc(_this->displays, |
325 (_this->num_displays + 1) * sizeof(*displays)); | 325 (_this->num_displays + 1) * sizeof(*displays)); |
326 if (displays) { | 326 if (displays) { |
327 index = _this->num_displays++; | 327 index = _this->num_displays++; |
328 displays[index] = *display; | 328 displays[index] = *display; |
329 displays[index].device = _this; | 329 displays[index].device = _this; |
330 _this->displays = displays; | 330 _this->displays = displays; |
331 } else { | 331 } else { |
332 SDL_OutOfMemory(); | 332 SDL_OutOfMemory(); |
333 } | 333 } |
334 return index; | 334 return index; |
335 } | 335 } |
336 | 336 |
337 int | 337 int |
338 SDL_GetNumVideoDisplays(void) | 338 SDL_GetNumVideoDisplays(void) |
339 { | 339 { |
340 if (!_this) { | 340 if (!_this) { |
341 SDL_UninitializedVideo(); | 341 SDL_UninitializedVideo(); |
342 return 0; | 342 return 0; |
343 } | 343 } |
344 return _this->num_displays; | 344 return _this->num_displays; |
345 } | 345 } |
346 | 346 |
347 int | 347 int |
348 SDL_SelectVideoDisplay(int index) | 348 SDL_SelectVideoDisplay(int index) |
349 { | 349 { |
350 if (!_this) { | 350 if (!_this) { |
351 SDL_UninitializedVideo(); | 351 SDL_UninitializedVideo(); |
352 return (-1); | 352 return (-1); |
353 } | 353 } |
354 if (index < 0 || index >= _this->num_displays) { | 354 if (index < 0 || index >= _this->num_displays) { |
355 SDL_SetError("index must be in the range 0 - %d", | 355 SDL_SetError("index must be in the range 0 - %d", |
356 _this->num_displays - 1); | 356 _this->num_displays - 1); |
357 return -1; | 357 return -1; |
358 } | 358 } |
359 _this->current_display = index; | 359 _this->current_display = index; |
360 return 0; | 360 return 0; |
361 } | 361 } |
362 | 362 |
363 int | 363 int |
364 SDL_GetCurrentVideoDisplay(void) | 364 SDL_GetCurrentVideoDisplay(void) |
365 { | 365 { |
366 if (!_this) { | 366 if (!_this) { |
367 SDL_UninitializedVideo(); | 367 SDL_UninitializedVideo(); |
368 return (-1); | 368 return (-1); |
369 } | 369 } |
370 return _this->current_display; | 370 return _this->current_display; |
371 } | 371 } |
372 | 372 |
373 SDL_bool | 373 SDL_bool |
374 SDL_AddDisplayMode(int displayIndex, const SDL_DisplayMode * mode) | 374 SDL_AddDisplayMode(int displayIndex, const SDL_DisplayMode * mode) |
375 { | 375 { |
376 SDL_VideoDisplay *display = &_this->displays[displayIndex]; | 376 SDL_VideoDisplay *display = &_this->displays[displayIndex]; |
377 SDL_DisplayMode *modes; | 377 SDL_DisplayMode *modes; |
378 int i, nmodes; | 378 int i, nmodes; |
379 | 379 |
380 /* Make sure we don't already have the mode in the list */ | 380 /* Make sure we don't already have the mode in the list */ |
381 modes = display->display_modes; | 381 modes = display->display_modes; |
382 nmodes = display->num_display_modes; | 382 nmodes = display->num_display_modes; |
383 for (i = nmodes; i--;) { | 383 for (i = nmodes; i--;) { |
384 if (SDL_memcmp(mode, &modes[i], sizeof(*mode)) == 0) { | 384 if (SDL_memcmp(mode, &modes[i], sizeof(*mode)) == 0) { |
385 return SDL_FALSE; | 385 return SDL_FALSE; |
386 } | 386 } |
387 } | 387 } |
388 | 388 |
389 /* Go ahead and add the new mode */ | 389 /* Go ahead and add the new mode */ |
390 if (nmodes == display->max_display_modes) { | 390 if (nmodes == display->max_display_modes) { |
391 modes = | 391 modes = |
392 SDL_realloc(modes, | 392 SDL_realloc(modes, |
393 (display->max_display_modes + 32) * sizeof(*modes)); | 393 (display->max_display_modes + 32) * sizeof(*modes)); |
394 if (!modes) { | 394 if (!modes) { |
395 return SDL_FALSE; | 395 return SDL_FALSE; |
396 } | 396 } |
397 display->display_modes = modes; | 397 display->display_modes = modes; |
398 display->max_display_modes += 32; | 398 display->max_display_modes += 32; |
399 } | 399 } |
400 modes[nmodes] = *mode; | 400 modes[nmodes] = *mode; |
401 display->num_display_modes++; | 401 display->num_display_modes++; |
402 | 402 |
403 return SDL_TRUE; | 403 return SDL_TRUE; |
404 } | 404 } |
405 | 405 |
406 int | 406 int |
407 SDL_GetNumDisplayModes() | 407 SDL_GetNumDisplayModes() |
408 { | 408 { |
409 if (_this) { | 409 if (_this) { |
410 SDL_VideoDisplay *display = &SDL_CurrentDisplay; | 410 SDL_VideoDisplay *display = &SDL_CurrentDisplay; |
411 if (!display->num_display_modes && _this->GetDisplayModes) { | 411 if (!display->num_display_modes && _this->GetDisplayModes) { |
412 _this->GetDisplayModes(_this); | 412 _this->GetDisplayModes(_this); |
413 SDL_qsort(display->display_modes, display->num_display_modes, | 413 SDL_qsort(display->display_modes, display->num_display_modes, |
414 sizeof(SDL_DisplayMode), cmpmodes); | 414 sizeof(SDL_DisplayMode), cmpmodes); |
415 } | 415 } |
416 return display->num_display_modes; | 416 return display->num_display_modes; |
417 } | 417 } |
418 return 0; | 418 return 0; |
419 } | 419 } |
420 | 420 |
421 int | 421 int |
422 SDL_GetDisplayMode(int index, SDL_DisplayMode * mode) | 422 SDL_GetDisplayMode(int index, SDL_DisplayMode * mode) |
423 { | 423 { |
424 if (index < 0 || index >= SDL_GetNumDisplayModes()) { | 424 if (index < 0 || index >= SDL_GetNumDisplayModes()) { |
425 SDL_SetError("index must be in the range of 0 - %d", | 425 SDL_SetError("index must be in the range of 0 - %d", |
426 SDL_GetNumDisplayModes() - 1); | 426 SDL_GetNumDisplayModes() - 1); |
427 return -1; | 427 return -1; |
428 } | 428 } |
429 if (mode) { | 429 if (mode) { |
430 *mode = SDL_CurrentDisplay.display_modes[index]; | 430 *mode = SDL_CurrentDisplay.display_modes[index]; |
431 } | 431 } |
432 return 0; | 432 return 0; |
433 } | 433 } |
434 | 434 |
435 int | 435 int |
436 SDL_GetDesktopDisplayMode(SDL_DisplayMode * mode) | 436 SDL_GetDesktopDisplayMode(SDL_DisplayMode * mode) |
437 { | 437 { |
438 if (!_this) { | 438 if (!_this) { |
439 SDL_UninitializedVideo(); | 439 SDL_UninitializedVideo(); |
440 return -1; | 440 return -1; |
441 } | 441 } |
442 if (mode) { | 442 if (mode) { |
443 *mode = SDL_CurrentDisplay.desktop_mode; | 443 *mode = SDL_CurrentDisplay.desktop_mode; |
444 } | 444 } |
445 return 0; | 445 return 0; |
446 } | 446 } |
447 | 447 |
448 int | 448 int |
449 SDL_GetCurrentDisplayMode(SDL_DisplayMode * mode) | 449 SDL_GetCurrentDisplayMode(SDL_DisplayMode * mode) |
450 { | 450 { |
451 if (!_this) { | 451 if (!_this) { |
452 SDL_UninitializedVideo(); | 452 SDL_UninitializedVideo(); |
453 return -1; | 453 return -1; |
454 } | 454 } |
455 if (mode) { | 455 if (mode) { |
456 *mode = SDL_CurrentDisplay.current_mode; | 456 *mode = SDL_CurrentDisplay.current_mode; |
457 } | 457 } |
458 return 0; | 458 return 0; |
459 } | 459 } |
460 | 460 |
461 SDL_DisplayMode * | 461 SDL_DisplayMode * |
462 SDL_GetClosestDisplayMode(const SDL_DisplayMode * mode, | 462 SDL_GetClosestDisplayMode(const SDL_DisplayMode * mode, |
463 SDL_DisplayMode * closest) | 463 SDL_DisplayMode * closest) |
464 { | 464 { |
465 Uint32 target_format; | 465 Uint32 target_format; |
466 int target_refresh_rate; | 466 int target_refresh_rate; |
467 int i; | 467 int i; |
468 SDL_DisplayMode *current, *match; | 468 SDL_DisplayMode *current, *match; |
469 | 469 |
470 if (!_this || !mode || !closest) { | 470 if (!_this || !mode || !closest) { |
471 return NULL; | 471 return NULL; |
472 } | 472 } |
473 /* Default to the desktop format */ | 473 /* Default to the desktop format */ |
474 if (mode->format) { | 474 if (mode->format) { |
475 target_format = mode->format; | 475 target_format = mode->format; |
476 } else { | 476 } else { |
477 target_format = SDL_CurrentDisplay.desktop_mode.format; | 477 target_format = SDL_CurrentDisplay.desktop_mode.format; |
478 } | 478 } |
479 | 479 |
480 /* Default to the desktop refresh rate */ | 480 /* Default to the desktop refresh rate */ |
481 if (mode->refresh_rate) { | 481 if (mode->refresh_rate) { |
482 target_refresh_rate = mode->refresh_rate; | 482 target_refresh_rate = mode->refresh_rate; |
483 } else { | 483 } else { |
484 target_refresh_rate = SDL_CurrentDisplay.desktop_mode.refresh_rate; | 484 target_refresh_rate = SDL_CurrentDisplay.desktop_mode.refresh_rate; |
485 } | 485 } |
486 | 486 |
487 match = NULL; | 487 match = NULL; |
488 for (i = 0; i < SDL_GetNumDisplayModes(); ++i) { | 488 for (i = 0; i < SDL_GetNumDisplayModes(); ++i) { |
489 current = &SDL_CurrentDisplay.display_modes[i]; | 489 current = &SDL_CurrentDisplay.display_modes[i]; |
490 | 490 |
491 if ((current->w && current->h) && | 491 if ((current->w && current->h) && |
492 (current->w < mode->w || current->h < mode->h)) { | 492 (current->w < mode->w || current->h < mode->h)) { |
493 /* Out of sorted modes large enough here */ | 493 /* Out of sorted modes large enough here */ |
494 break; | 494 break; |
495 } | 495 } |
496 if (!match || current->w < match->w || current->h < match->h) { | 496 if (!match || current->w < match->w || current->h < match->h) { |
497 match = current; | 497 match = current; |
498 continue; | 498 continue; |
499 } | 499 } |
500 if (current->format != match->format) { | 500 if (current->format != match->format) { |
501 /* Sorted highest depth to lowest */ | 501 /* Sorted highest depth to lowest */ |
502 if (current->format == target_format || | 502 if (current->format == target_format || |
503 (SDL_BITSPERPIXEL(current->format) >= | 503 (SDL_BITSPERPIXEL(current->format) >= |
504 SDL_BITSPERPIXEL(target_format) | 504 SDL_BITSPERPIXEL(target_format) |
505 && SDL_PIXELTYPE(current->format) == | 505 && SDL_PIXELTYPE(current->format) == |
506 SDL_PIXELTYPE(target_format))) { | 506 SDL_PIXELTYPE(target_format))) { |
507 match = current; | 507 match = current; |
508 } | 508 } |
509 continue; | 509 continue; |
510 } | 510 } |
511 if (current->refresh_rate != match->refresh_rate) { | 511 if (current->refresh_rate != match->refresh_rate) { |
512 /* Sorted highest refresh to lowest */ | 512 /* Sorted highest refresh to lowest */ |
513 if (current->refresh_rate >= target_refresh_rate) { | 513 if (current->refresh_rate >= target_refresh_rate) { |
514 match = current; | 514 match = current; |
515 } | 515 } |
516 } | 516 } |
517 } | 517 } |
518 if (match) { | 518 if (match) { |
519 if (match->format) { | 519 if (match->format) { |
520 closest->format = match->format; | 520 closest->format = match->format; |
521 } else { | 521 } else { |
522 closest->format = mode->format; | 522 closest->format = mode->format; |
523 } | 523 } |
524 if (match->w && match->h) { | 524 if (match->w && match->h) { |
525 closest->w = match->w; | 525 closest->w = match->w; |
526 closest->h = match->h; | 526 closest->h = match->h; |
527 } else { | 527 } else { |
528 closest->w = mode->w; | 528 closest->w = mode->w; |
529 closest->h = mode->h; | 529 closest->h = mode->h; |
530 } | 530 } |
531 if (match->refresh_rate) { | 531 if (match->refresh_rate) { |
532 closest->refresh_rate = match->refresh_rate; | 532 closest->refresh_rate = match->refresh_rate; |
533 } else { | 533 } else { |
534 closest->refresh_rate = mode->refresh_rate; | 534 closest->refresh_rate = mode->refresh_rate; |
535 } | 535 } |
536 closest->driverdata = match->driverdata; | 536 closest->driverdata = match->driverdata; |
537 | 537 |
538 /* | 538 /* |
539 * Pick some reasonable defaults if the app and driver don't | 539 * Pick some reasonable defaults if the app and driver don't |
540 * care | 540 * care |
541 */ | 541 */ |
542 if (!closest->format) { | 542 if (!closest->format) { |
543 closest->format = SDL_PIXELFORMAT_RGB888; | 543 closest->format = SDL_PIXELFORMAT_RGB888; |
544 } | 544 } |
545 if (!closest->w) { | 545 if (!closest->w) { |
546 closest->w = 640; | 546 closest->w = 640; |
547 } | 547 } |
548 if (!closest->h) { | 548 if (!closest->h) { |
549 closest->h = 480; | 549 closest->h = 480; |
550 } | 550 } |
551 return closest; | 551 return closest; |
552 } | 552 } |
553 return NULL; | 553 return NULL; |
554 } | 554 } |
555 | 555 |
556 int | 556 int |
557 SDL_SetDisplayMode(const SDL_DisplayMode * mode) | 557 SDL_SetDisplayMode(const SDL_DisplayMode * mode) |
558 { | 558 { |
559 SDL_VideoDisplay *display; | 559 SDL_VideoDisplay *display; |
560 SDL_DisplayMode display_mode; | 560 SDL_DisplayMode display_mode; |
561 SDL_DisplayMode current_mode; | 561 SDL_DisplayMode current_mode; |
562 int i, ncolors; | 562 int i, ncolors; |
563 | 563 |
564 if (!_this) { | 564 if (!_this) { |
565 SDL_UninitializedVideo(); | 565 SDL_UninitializedVideo(); |
566 return -1; | 566 return -1; |
567 } | 567 } |
568 display = &SDL_CurrentDisplay; | 568 display = &SDL_CurrentDisplay; |
569 if (!mode) { | 569 if (!mode) { |
570 mode = &display->desktop_mode; | 570 mode = &display->desktop_mode; |
571 } | 571 } |
572 display_mode = *mode; | 572 display_mode = *mode; |
573 | 573 |
574 /* Default to the current mode */ | 574 /* Default to the current mode */ |
575 if (!display_mode.format) { | 575 if (!display_mode.format) { |
576 display_mode.format = display->current_mode.format; | 576 display_mode.format = display->current_mode.format; |
577 } | 577 } |
578 if (!display_mode.w) { | 578 if (!display_mode.w) { |
579 display_mode.w = display->current_mode.w; | 579 display_mode.w = display->current_mode.w; |
580 } | 580 } |
581 if (!display_mode.h) { | 581 if (!display_mode.h) { |
582 display_mode.h = display->current_mode.h; | 582 display_mode.h = display->current_mode.h; |
583 } | 583 } |
584 if (!display_mode.refresh_rate) { | 584 if (!display_mode.refresh_rate) { |
585 display_mode.refresh_rate = display->current_mode.refresh_rate; | 585 display_mode.refresh_rate = display->current_mode.refresh_rate; |
586 } | 586 } |
587 /* Get a good video mode, the closest one possible */ | 587 /* Get a good video mode, the closest one possible */ |
588 if (!SDL_GetClosestDisplayMode(&display_mode, &display_mode)) { | 588 if (!SDL_GetClosestDisplayMode(&display_mode, &display_mode)) { |
589 SDL_SetError("No video mode large enough for %dx%d", | 589 SDL_SetError("No video mode large enough for %dx%d", |
590 display_mode.w, display_mode.h); | 590 display_mode.w, display_mode.h); |
591 return -1; | 591 return -1; |
592 } | 592 } |
593 /* See if there's anything left to do */ | 593 /* See if there's anything left to do */ |
594 SDL_GetCurrentDisplayMode(¤t_mode); | 594 SDL_GetCurrentDisplayMode(¤t_mode); |
595 if (SDL_memcmp(&display_mode, ¤t_mode, sizeof(display_mode)) == 0) { | 595 if (SDL_memcmp(&display_mode, ¤t_mode, sizeof(display_mode)) == 0) { |
596 return 0; | 596 return 0; |
597 } | 597 } |
598 /* Actually change the display mode */ | 598 /* Actually change the display mode */ |
599 if (_this->SetDisplayMode(_this, &display_mode) < 0) { | 599 if (_this->SetDisplayMode(_this, &display_mode) < 0) { |
600 return -1; | 600 return -1; |
601 } | 601 } |
602 display->current_mode = display_mode; | 602 display->current_mode = display_mode; |
603 | 603 |
604 /* Set up a palette, if necessary */ | 604 /* Set up a palette, if necessary */ |
605 if (SDL_ISPIXELFORMAT_INDEXED(display_mode.format)) { | 605 if (SDL_ISPIXELFORMAT_INDEXED(display_mode.format)) { |
606 ncolors = (1 << SDL_BITSPERPIXEL(display_mode.format)); | 606 ncolors = (1 << SDL_BITSPERPIXEL(display_mode.format)); |
607 } else { | 607 } else { |
608 ncolors = 0; | 608 ncolors = 0; |
609 } | 609 } |
610 if ((!ncolors && display->palette) || (ncolors && !display->palette) | 610 if ((!ncolors && display->palette) || (ncolors && !display->palette) |
611 || (ncolors && ncolors != display->palette->ncolors)) { | 611 || (ncolors && ncolors != display->palette->ncolors)) { |
612 if (display->palette) { | 612 if (display->palette) { |
613 SDL_FreePalette(display->palette); | 613 SDL_FreePalette(display->palette); |
614 display->palette = NULL; | 614 display->palette = NULL; |
615 } | 615 } |
616 if (ncolors) { | 616 if (ncolors) { |
617 display->palette = SDL_AllocPalette(ncolors); | 617 display->palette = SDL_AllocPalette(ncolors); |
618 if (!display->palette) { | 618 if (!display->palette) { |
619 return -1; | 619 return -1; |
620 } | 620 } |
621 SDL_DitherColors(display->palette->colors, | 621 SDL_DitherColors(display->palette->colors, |
622 SDL_BITSPERPIXEL(display_mode.format)); | 622 SDL_BITSPERPIXEL(display_mode.format)); |
623 } | 623 } |
624 } | 624 } |
625 /* Move any fullscreen windows into position */ | 625 /* Move any fullscreen windows into position */ |
626 for (i = 0; i < display->num_windows; ++i) { | 626 for (i = 0; i < display->num_windows; ++i) { |
627 SDL_Window *window = &display->windows[i]; | 627 SDL_Window *window = &display->windows[i]; |
628 if (FULLSCREEN_VISIBLE(window)) { | 628 if (FULLSCREEN_VISIBLE(window)) { |
629 SDL_SetWindowPosition(window->id, SDL_WINDOWPOS_CENTERED, | 629 SDL_SetWindowPosition(window->id, SDL_WINDOWPOS_CENTERED, |
630 SDL_WINDOWPOS_CENTERED); | 630 SDL_WINDOWPOS_CENTERED); |
631 } | 631 } |
632 } | 632 } |
633 | 633 |
634 return 0; | 634 return 0; |
635 } | 635 } |
636 | 636 |
637 int | 637 int |
638 SDL_SetFullscreenDisplayMode(const SDL_DisplayMode * mode) | 638 SDL_SetFullscreenDisplayMode(const SDL_DisplayMode * mode) |
639 { | 639 { |
640 SDL_VideoDisplay *display; | 640 SDL_VideoDisplay *display; |
641 SDL_DisplayMode fullscreen_mode; | 641 SDL_DisplayMode fullscreen_mode; |
642 int i; | 642 int i; |
643 | 643 |
644 if (!_this) { | 644 if (!_this) { |
645 SDL_UninitializedVideo(); | 645 SDL_UninitializedVideo(); |
646 return -1; | 646 return -1; |
647 } | 647 } |
648 display = &SDL_CurrentDisplay; | 648 display = &SDL_CurrentDisplay; |
649 if (!mode) { | 649 if (!mode) { |
650 mode = &display->desktop_mode; | 650 mode = &display->desktop_mode; |
651 } | 651 } |
652 SDL_GetClosestDisplayMode(mode, &fullscreen_mode); | 652 SDL_GetClosestDisplayMode(mode, &fullscreen_mode); |
653 if (SDL_memcmp | 653 if (SDL_memcmp |
654 (&fullscreen_mode, &display->fullscreen_mode, | 654 (&fullscreen_mode, &display->fullscreen_mode, |
655 sizeof(fullscreen_mode)) == 0) { | 655 sizeof(fullscreen_mode)) == 0) { |
656 /* Nothing to do... */ | 656 /* Nothing to do... */ |
657 return 0; | 657 return 0; |
658 } | 658 } |
659 display->fullscreen_mode = fullscreen_mode; | 659 display->fullscreen_mode = fullscreen_mode; |
660 | 660 |
661 /* Actually set the mode if we have a fullscreen window visible */ | 661 /* Actually set the mode if we have a fullscreen window visible */ |
662 for (i = 0; i < display->num_windows; ++i) { | 662 for (i = 0; i < display->num_windows; ++i) { |
663 SDL_Window *window = &display->windows[i]; | 663 SDL_Window *window = &display->windows[i]; |
664 if (FULLSCREEN_VISIBLE(window)) { | 664 if (FULLSCREEN_VISIBLE(window)) { |
665 if (SDL_SetDisplayMode(&display->fullscreen_mode) < 0) { | 665 if (SDL_SetDisplayMode(&display->fullscreen_mode) < 0) { |
666 return -1; | 666 return -1; |
667 } | 667 } |
668 } | 668 } |
669 if (window->flags & SDL_WINDOW_FULLSCREEN) { | 669 if (window->flags & SDL_WINDOW_FULLSCREEN) { |
670 SDL_OnWindowResized(window); | 670 SDL_OnWindowResized(window); |
671 } | 671 } |
672 } | 672 } |
673 return 0; | 673 return 0; |
674 } | 674 } |
675 | 675 |
676 int | 676 int |
677 SDL_GetFullscreenDisplayMode(SDL_DisplayMode * mode) | 677 SDL_GetFullscreenDisplayMode(SDL_DisplayMode * mode) |
678 { | 678 { |
679 if (!_this) { | 679 if (!_this) { |
680 SDL_UninitializedVideo(); | 680 SDL_UninitializedVideo(); |
681 return -1; | 681 return -1; |
682 } | 682 } |
683 if (mode) { | 683 if (mode) { |
684 *mode = SDL_CurrentDisplay.fullscreen_mode; | 684 *mode = SDL_CurrentDisplay.fullscreen_mode; |
685 } | 685 } |
686 return 0; | 686 return 0; |
687 } | 687 } |
688 | 688 |
689 int | 689 int |
690 SDL_SetDisplayPalette(const SDL_Color * colors, int firstcolor, int ncolors) | 690 SDL_SetDisplayPalette(const SDL_Color * colors, int firstcolor, int ncolors) |
691 { | 691 { |
692 SDL_Palette *palette; | 692 SDL_Palette *palette; |
693 int status = 0; | 693 int status = 0; |
694 | 694 |
695 if (!_this) { | 695 if (!_this) { |
696 SDL_UninitializedVideo(); | 696 SDL_UninitializedVideo(); |
697 return -1; | 697 return -1; |
698 } | 698 } |
699 palette = SDL_CurrentDisplay.palette; | 699 palette = SDL_CurrentDisplay.palette; |
700 if (!palette) { | 700 if (!palette) { |
701 SDL_SetError("Display mode does not have a palette"); | 701 SDL_SetError("Display mode does not have a palette"); |
702 return -1; | 702 return -1; |
703 } | 703 } |
704 status = SDL_SetPaletteColors(palette, colors, firstcolor, ncolors); | 704 status = SDL_SetPaletteColors(palette, colors, firstcolor, ncolors); |
705 | 705 |
706 if (_this->SetDisplayPalette) { | 706 if (_this->SetDisplayPalette) { |
707 if (_this->SetDisplayPalette(_this, palette) < 0) { | 707 if (_this->SetDisplayPalette(_this, palette) < 0) { |
708 status = -1; | 708 status = -1; |
709 } | 709 } |
710 } | 710 } |
711 return status; | 711 return status; |
712 } | 712 } |
713 | 713 |
714 int | 714 int |
715 SDL_GetDisplayPalette(SDL_Color * colors, int firstcolor, int ncolors) | 715 SDL_GetDisplayPalette(SDL_Color * colors, int firstcolor, int ncolors) |
716 { | 716 { |
717 SDL_Palette *palette; | 717 SDL_Palette *palette; |
718 | 718 |
719 if (!_this) { | 719 if (!_this) { |
720 SDL_UninitializedVideo(); | 720 SDL_UninitializedVideo(); |
721 return -1; | 721 return -1; |
722 } | 722 } |
723 palette = SDL_CurrentDisplay.palette; | 723 palette = SDL_CurrentDisplay.palette; |
724 if (!palette->ncolors) { | 724 if (!palette->ncolors) { |
725 SDL_SetError("Display mode does not have a palette"); | 725 SDL_SetError("Display mode does not have a palette"); |
726 return -1; | 726 return -1; |
727 } | 727 } |
728 if (firstcolor < 0 || (firstcolor + ncolors) > palette->ncolors) { | 728 if (firstcolor < 0 || (firstcolor + ncolors) > palette->ncolors) { |
729 SDL_SetError("Palette indices are out of range"); | 729 SDL_SetError("Palette indices are out of range"); |
730 return -1; | 730 return -1; |
731 } | 731 } |
732 SDL_memcpy(colors, &palette->colors[firstcolor], | 732 SDL_memcpy(colors, &palette->colors[firstcolor], |
733 ncolors * sizeof(*colors)); | 733 ncolors * sizeof(*colors)); |
734 return 0; | 734 return 0; |
735 } | 735 } |
736 | 736 |
737 SDL_WindowID | 737 SDL_WindowID |
738 SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags) | 738 SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags) |
739 { | 739 { |
740 const Uint32 allowed_flags = (SDL_WINDOW_FULLSCREEN | | 740 const Uint32 allowed_flags = (SDL_WINDOW_FULLSCREEN | |
741 SDL_WINDOW_OPENGL | | 741 SDL_WINDOW_OPENGL | |
742 SDL_WINDOW_BORDERLESS | | 742 SDL_WINDOW_BORDERLESS | |
743 SDL_WINDOW_RESIZABLE); | 743 SDL_WINDOW_RESIZABLE); |
744 SDL_VideoDisplay *display; | 744 SDL_VideoDisplay *display; |
745 SDL_Window window; | 745 SDL_Window window; |
746 int num_windows; | 746 int num_windows; |
747 SDL_Window *windows; | 747 SDL_Window *windows; |
748 | 748 |
749 if (!_this) { | 749 if (!_this) { |
750 SDL_UninitializedVideo(); | 750 SDL_UninitializedVideo(); |
751 return 0; | 751 return 0; |
752 } | 752 } |
753 if ((flags & SDL_WINDOW_OPENGL) && !_this->GL_CreateContext) { | 753 if ((flags & SDL_WINDOW_OPENGL) && !_this->GL_CreateContext) { |
754 SDL_SetError("No OpenGL support in video driver"); | 754 SDL_SetError("No OpenGL support in video driver"); |
755 return 0; | 755 return 0; |
756 } | 756 } |
757 /* Fullscreen windows don't have any window decorations */ | 757 /* Fullscreen windows don't have any window decorations */ |
758 if (flags & SDL_WINDOW_FULLSCREEN) { | 758 if (flags & SDL_WINDOW_FULLSCREEN) { |
759 flags |= SDL_WINDOW_BORDERLESS; | 759 flags |= SDL_WINDOW_BORDERLESS; |
760 flags &= ~SDL_WINDOW_RESIZABLE; | 760 flags &= ~SDL_WINDOW_RESIZABLE; |
761 } | 761 } |
762 SDL_zero(window); | 762 SDL_zero(window); |
763 window.id = _this->next_object_id++; | 763 window.id = _this->next_object_id++; |
764 window.x = x; | 764 window.x = x; |
765 window.y = y; | 765 window.y = y; |
766 window.w = w; | 766 window.w = w; |
767 window.h = h; | 767 window.h = h; |
768 window.flags = (flags & allowed_flags); | 768 window.flags = (flags & allowed_flags); |
769 window.display = _this->current_display; | 769 window.display = _this->current_display; |
770 | 770 |
771 if (_this->CreateWindow && _this->CreateWindow(_this, &window) < 0) { | 771 if (_this->CreateWindow && _this->CreateWindow(_this, &window) < 0) { |
772 return 0; | 772 return 0; |
773 } | 773 } |
774 display = &SDL_CurrentDisplay; | 774 display = &SDL_CurrentDisplay; |
775 num_windows = display->num_windows; | 775 num_windows = display->num_windows; |
776 windows = | 776 windows = |
777 SDL_realloc(display->windows, (num_windows + 1) * sizeof(*windows)); | 777 SDL_realloc(display->windows, (num_windows + 1) * sizeof(*windows)); |
778 if (!windows) { | 778 if (!windows) { |
779 if (_this->DestroyWindow) { | 779 if (_this->DestroyWindow) { |
780 _this->DestroyWindow(_this, &window); | 780 _this->DestroyWindow(_this, &window); |
781 } | 781 } |
782 return 0; | 782 return 0; |
783 } | 783 } |
784 windows[num_windows] = window; | 784 windows[num_windows] = window; |
785 display->windows = windows; | 785 display->windows = windows; |
786 display->num_windows++; | 786 display->num_windows++; |
787 | 787 |
788 if (title) { | 788 if (title) { |
789 SDL_SetWindowTitle(window.id, title); | 789 SDL_SetWindowTitle(window.id, title); |
790 } | 790 } |
791 if (flags & SDL_WINDOW_MAXIMIZED) { | 791 if (flags & SDL_WINDOW_MAXIMIZED) { |
792 SDL_MaximizeWindow(window.id); | 792 SDL_MaximizeWindow(window.id); |
793 } | 793 } |
794 if (flags & SDL_WINDOW_MINIMIZED) { | 794 if (flags & SDL_WINDOW_MINIMIZED) { |
795 SDL_MinimizeWindow(window.id); | 795 SDL_MinimizeWindow(window.id); |
796 } | 796 } |
797 if (flags & SDL_WINDOW_SHOWN) { | 797 if (flags & SDL_WINDOW_SHOWN) { |
798 SDL_ShowWindow(window.id); | 798 SDL_ShowWindow(window.id); |
799 } | 799 } |
800 if (flags & SDL_WINDOW_INPUT_GRABBED) { | 800 if (flags & SDL_WINDOW_INPUT_GRABBED) { |
801 SDL_SetWindowGrab(window.id, 1); | 801 SDL_SetWindowGrab(window.id, 1); |
802 } | 802 } |
803 return window.id; | 803 return window.id; |
804 } | 804 } |
805 | 805 |
806 SDL_WindowID | 806 SDL_WindowID |
807 SDL_CreateWindowFrom(const void *data) | 807 SDL_CreateWindowFrom(const void *data) |
808 { | 808 { |
809 SDL_VideoDisplay *display; | 809 SDL_VideoDisplay *display; |
810 SDL_Window window; | 810 SDL_Window window; |
811 int num_windows; | 811 int num_windows; |
812 SDL_Window *windows; | 812 SDL_Window *windows; |
813 | 813 |
814 if (!_this) { | 814 if (!_this) { |
815 SDL_UninitializedVideo(); | 815 SDL_UninitializedVideo(); |
816 return (0); | 816 return (0); |
817 } | 817 } |
818 SDL_zero(window); | 818 SDL_zero(window); |
819 window.id = _this->next_object_id++; | 819 window.id = _this->next_object_id++; |
820 window.display = _this->current_display; | 820 window.display = _this->current_display; |
821 | 821 |
822 if (!_this->CreateWindowFrom || | 822 if (!_this->CreateWindowFrom || |
823 _this->CreateWindowFrom(_this, &window, data) < 0) { | 823 _this->CreateWindowFrom(_this, &window, data) < 0) { |
824 return 0; | 824 return 0; |
825 } | 825 } |
826 display = &SDL_CurrentDisplay; | 826 display = &SDL_CurrentDisplay; |
827 num_windows = display->num_windows; | 827 num_windows = display->num_windows; |
828 windows = | 828 windows = |
829 SDL_realloc(display->windows, (num_windows + 1) * sizeof(*windows)); | 829 SDL_realloc(display->windows, (num_windows + 1) * sizeof(*windows)); |
830 if (!windows) { | 830 if (!windows) { |
831 if (_this->DestroyWindow) { | 831 if (_this->DestroyWindow) { |
832 _this->DestroyWindow(_this, &window); | 832 _this->DestroyWindow(_this, &window); |
833 } | 833 } |
834 if (window.title) { | 834 if (window.title) { |
835 SDL_free(window.title); | 835 SDL_free(window.title); |
836 } | 836 } |
837 return 0; | 837 return 0; |
838 } | 838 } |
839 windows[num_windows] = window; | 839 windows[num_windows] = window; |
840 display->windows = windows; | 840 display->windows = windows; |
841 display->num_windows++; | 841 display->num_windows++; |
842 | 842 |
843 return window.id; | 843 return window.id; |
844 } | 844 } |
845 | 845 |
846 int | 846 int |
847 SDL_RecreateWindow(SDL_Window * window, Uint32 flags) | 847 SDL_RecreateWindow(SDL_Window * window, Uint32 flags) |
848 { | 848 { |
849 char *title = window->title; | 849 char *title = window->title; |
850 | 850 |
851 if ((flags & SDL_WINDOW_OPENGL) && !_this->GL_CreateContext) { | 851 if ((flags & SDL_WINDOW_OPENGL) && !_this->GL_CreateContext) { |
852 SDL_SetError("No OpenGL support in video driver"); | 852 SDL_SetError("No OpenGL support in video driver"); |
853 return -1; | 853 return -1; |
854 } | 854 } |
855 if (_this->DestroyWindow) { | 855 if (_this->DestroyWindow) { |
856 _this->DestroyWindow(_this, window); | 856 _this->DestroyWindow(_this, window); |
857 } | 857 } |
858 window->title = NULL; | 858 window->title = NULL; |
859 window->flags = | 859 window->flags = |
860 (flags & | 860 (flags & |
861 ~(SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED | SDL_WINDOW_SHOWN | | 861 ~(SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED | SDL_WINDOW_SHOWN | |
862 SDL_WINDOW_INPUT_GRABBED)); | 862 SDL_WINDOW_INPUT_GRABBED)); |
863 | 863 |
864 if (_this->CreateWindow && _this->CreateWindow(_this, window) < 0) { | 864 if (_this->CreateWindow && _this->CreateWindow(_this, window) < 0) { |
865 return -1; | 865 return -1; |
866 } | 866 } |
867 if (title) { | 867 if (title) { |
868 SDL_SetWindowTitle(window->id, title); | 868 SDL_SetWindowTitle(window->id, title); |
869 SDL_free(title); | 869 SDL_free(title); |
870 } | 870 } |
871 if (flags & SDL_WINDOW_MAXIMIZED) { | 871 if (flags & SDL_WINDOW_MAXIMIZED) { |
872 SDL_MaximizeWindow(window->id); | 872 SDL_MaximizeWindow(window->id); |
873 } | 873 } |
874 if (flags & SDL_WINDOW_MINIMIZED) { | 874 if (flags & SDL_WINDOW_MINIMIZED) { |
875 SDL_MinimizeWindow(window->id); | 875 SDL_MinimizeWindow(window->id); |
876 } | 876 } |
877 if (flags & SDL_WINDOW_SHOWN) { | 877 if (flags & SDL_WINDOW_SHOWN) { |
878 SDL_ShowWindow(window->id); | 878 SDL_ShowWindow(window->id); |
879 } | 879 } |
880 if (flags & SDL_WINDOW_INPUT_GRABBED) { | 880 if (flags & SDL_WINDOW_INPUT_GRABBED) { |
881 SDL_SetWindowGrab(window->id, 1); | 881 SDL_SetWindowGrab(window->id, 1); |
882 } | 882 } |
883 return 0; | 883 return 0; |
884 } | 884 } |
885 | 885 |
886 SDL_Window * | 886 SDL_Window * |
887 SDL_GetWindowFromID(SDL_WindowID windowID) | 887 SDL_GetWindowFromID(SDL_WindowID windowID) |
888 { | 888 { |
889 int i, j; | 889 int i, j; |
890 | 890 |
891 if (!_this) { | 891 if (!_this) { |
892 SDL_UninitializedVideo(); | 892 SDL_UninitializedVideo(); |
893 return NULL; | 893 return NULL; |
894 } | 894 } |
895 for (i = 0; i < _this->num_displays; ++i) { | 895 for (i = 0; i < _this->num_displays; ++i) { |
896 SDL_VideoDisplay *display = &_this->displays[i]; | 896 SDL_VideoDisplay *display = &_this->displays[i]; |
897 for (j = 0; j < display->num_windows; ++j) { | 897 for (j = 0; j < display->num_windows; ++j) { |
898 SDL_Window *window = &display->windows[j]; | 898 SDL_Window *window = &display->windows[j]; |
899 if (window->id == windowID) { | 899 if (window->id == windowID) { |
900 return window; | 900 return window; |
901 } | 901 } |
902 } | 902 } |
903 } | 903 } |
904 return NULL; | 904 return NULL; |
905 } | 905 } |
906 | 906 |
907 SDL_VideoDisplay * | 907 SDL_VideoDisplay * |
908 SDL_GetDisplayFromWindow(SDL_Window * window) | 908 SDL_GetDisplayFromWindow(SDL_Window * window) |
909 { | 909 { |
910 if (!_this) { | 910 if (!_this) { |
911 SDL_UninitializedVideo(); | 911 SDL_UninitializedVideo(); |
912 return NULL; | 912 return NULL; |
913 } | 913 } |
914 if (!window) { | 914 if (!window) { |
915 return NULL; | 915 return NULL; |
916 } | 916 } |
917 return &_this->displays[window->display]; | 917 return &_this->displays[window->display]; |
918 } | 918 } |
919 | 919 |
920 Uint32 | 920 Uint32 |
921 SDL_GetWindowFlags(SDL_WindowID windowID) | 921 SDL_GetWindowFlags(SDL_WindowID windowID) |
922 { | 922 { |
923 SDL_Window *window = SDL_GetWindowFromID(windowID); | 923 SDL_Window *window = SDL_GetWindowFromID(windowID); |
924 | 924 |
925 if (!window) { | 925 if (!window) { |
926 return 0; | 926 return 0; |
927 } | 927 } |
928 return window->flags; | 928 return window->flags; |
929 } | 929 } |
930 | 930 |
931 void | 931 void |
932 SDL_SetWindowTitle(SDL_WindowID windowID, const char *title) | 932 SDL_SetWindowTitle(SDL_WindowID windowID, const char *title) |
933 { | 933 { |
934 SDL_Window *window = SDL_GetWindowFromID(windowID); | 934 SDL_Window *window = SDL_GetWindowFromID(windowID); |
935 | 935 |
936 if (!window || title == window->title) { | 936 if (!window || title == window->title) { |
937 return; | 937 return; |
938 } | 938 } |
939 if (window->title) { | 939 if (window->title) { |
940 SDL_free(window->title); | 940 SDL_free(window->title); |
941 } | 941 } |
942 if (title) { | 942 if (title) { |
943 window->title = SDL_strdup(title); | 943 window->title = SDL_strdup(title); |
944 } else { | 944 } else { |
945 window->title = NULL; | 945 window->title = NULL; |
946 } | 946 } |
947 | 947 |
948 if (_this->SetWindowTitle) { | 948 if (_this->SetWindowTitle) { |
949 _this->SetWindowTitle(_this, window); | 949 _this->SetWindowTitle(_this, window); |
950 } | 950 } |
951 } | 951 } |
952 | 952 |
953 const char * | 953 const char * |
954 SDL_GetWindowTitle(SDL_WindowID windowID) | 954 SDL_GetWindowTitle(SDL_WindowID windowID) |
955 { | 955 { |
956 SDL_Window *window = SDL_GetWindowFromID(windowID); | 956 SDL_Window *window = SDL_GetWindowFromID(windowID); |
957 | 957 |
958 if (!window) { | 958 if (!window) { |
959 return NULL; | 959 return NULL; |
960 } | 960 } |
961 return window->title; | 961 return window->title; |
962 } | 962 } |
963 | 963 |
964 void | 964 void |
965 SDL_SetWindowData(SDL_WindowID windowID, void *userdata) | 965 SDL_SetWindowData(SDL_WindowID windowID, void *userdata) |
966 { | 966 { |
967 SDL_Window *window = SDL_GetWindowFromID(windowID); | 967 SDL_Window *window = SDL_GetWindowFromID(windowID); |
968 | 968 |
969 if (!window) { | 969 if (!window) { |
970 return; | 970 return; |
971 } | 971 } |
972 window->userdata = userdata; | 972 window->userdata = userdata; |
973 } | 973 } |
974 | 974 |
975 void * | 975 void * |
976 SDL_GetWindowData(SDL_WindowID windowID) | 976 SDL_GetWindowData(SDL_WindowID windowID) |
977 { | 977 { |
978 SDL_Window *window = SDL_GetWindowFromID(windowID); | 978 SDL_Window *window = SDL_GetWindowFromID(windowID); |
979 | 979 |
980 if (!window) { | 980 if (!window) { |
981 return NULL; | 981 return NULL; |
982 } | 982 } |
983 return window->userdata; | 983 return window->userdata; |
984 } | 984 } |
985 | 985 |
986 void | 986 void |
987 SDL_SetWindowPosition(SDL_WindowID windowID, int x, int y) | 987 SDL_SetWindowPosition(SDL_WindowID windowID, int x, int y) |
988 { | 988 { |
989 SDL_Window *window = SDL_GetWindowFromID(windowID); | 989 SDL_Window *window = SDL_GetWindowFromID(windowID); |
990 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); | 990 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); |
991 | 991 |
992 if (!window) { | 992 if (!window) { |
993 return; | 993 return; |
994 } | 994 } |
995 if (x == SDL_WINDOWPOS_CENTERED) { | 995 if (x == SDL_WINDOWPOS_CENTERED) { |
996 window->x = (display->current_mode.w - window->w) / 2; | 996 window->x = (display->current_mode.w - window->w) / 2; |
997 } else if (x != SDL_WINDOWPOS_UNDEFINED) { | 997 } else if (x != SDL_WINDOWPOS_UNDEFINED) { |
998 window->x = x; | 998 window->x = x; |
999 } | 999 } |
1000 if (y == SDL_WINDOWPOS_CENTERED) { | 1000 if (y == SDL_WINDOWPOS_CENTERED) { |
1001 window->y = (display->current_mode.h - window->h) / 2; | 1001 window->y = (display->current_mode.h - window->h) / 2; |
1002 } else if (y != SDL_WINDOWPOS_UNDEFINED) { | 1002 } else if (y != SDL_WINDOWPOS_UNDEFINED) { |
1003 window->y = y; | 1003 window->y = y; |
1004 } | 1004 } |
1005 if (_this->SetWindowPosition) { | 1005 if (_this->SetWindowPosition) { |
1006 _this->SetWindowPosition(_this, window); | 1006 _this->SetWindowPosition(_this, window); |
1007 } | 1007 } |
1008 } | 1008 } |
1009 | 1009 |
1010 void | 1010 void |
1011 SDL_GetWindowPosition(SDL_WindowID windowID, int *x, int *y) | 1011 SDL_GetWindowPosition(SDL_WindowID windowID, int *x, int *y) |
1012 { | 1012 { |
1013 SDL_Window *window = SDL_GetWindowFromID(windowID); | 1013 SDL_Window *window = SDL_GetWindowFromID(windowID); |
1014 | 1014 |
1015 if (!window) { | 1015 if (!window) { |
1016 return; | 1016 return; |
1017 } | 1017 } |
1018 if (x) { | 1018 if (x) { |
1019 *x = window->x; | 1019 *x = window->x; |
1020 } | 1020 } |
1021 if (y) { | 1021 if (y) { |
1022 *y = window->y; | 1022 *y = window->y; |
1023 } | 1023 } |
1024 } | 1024 } |
1025 | 1025 |
1026 void | 1026 void |
1027 SDL_SetWindowSize(SDL_WindowID windowID, int w, int h) | 1027 SDL_SetWindowSize(SDL_WindowID windowID, int w, int h) |
1028 { | 1028 { |
1029 SDL_Window *window = SDL_GetWindowFromID(windowID); | 1029 SDL_Window *window = SDL_GetWindowFromID(windowID); |
1030 | 1030 |
1031 if (!window) { | 1031 if (!window) { |
1032 return; | 1032 return; |
1033 } | 1033 } |
1034 window->w = w; | 1034 window->w = w; |
1035 window->h = h; | 1035 window->h = h; |
1036 | 1036 |
1037 if (_this->SetWindowSize) { | 1037 if (_this->SetWindowSize) { |
1038 _this->SetWindowSize(_this, window); | 1038 _this->SetWindowSize(_this, window); |
1039 } | 1039 } |
1040 } | 1040 } |
1041 | 1041 |
1042 void | 1042 void |
1043 SDL_GetWindowSize(SDL_WindowID windowID, int *w, int *h) | 1043 SDL_GetWindowSize(SDL_WindowID windowID, int *w, int *h) |
1044 { | 1044 { |
1045 SDL_Window *window = SDL_GetWindowFromID(windowID); | 1045 SDL_Window *window = SDL_GetWindowFromID(windowID); |
1046 | 1046 |
1047 if (!window) { | 1047 if (!window) { |
1048 return; | 1048 return; |
1049 } | 1049 } |
1050 if (w) { | 1050 if (w) { |
1051 *w = window->w; | 1051 *w = window->w; |
1052 } | 1052 } |
1053 if (h) { | 1053 if (h) { |
1054 *h = window->h; | 1054 *h = window->h; |
1055 } | 1055 } |
1056 } | 1056 } |
1057 | 1057 |
1058 void | 1058 void |
1059 SDL_ShowWindow(SDL_WindowID windowID) | 1059 SDL_ShowWindow(SDL_WindowID windowID) |
1060 { | 1060 { |
1061 SDL_Window *window = SDL_GetWindowFromID(windowID); | 1061 SDL_Window *window = SDL_GetWindowFromID(windowID); |
1062 | 1062 |
1063 if (!window || (window->flags & SDL_WINDOW_SHOWN)) { | 1063 if (!window || (window->flags & SDL_WINDOW_SHOWN)) { |
1064 return; | 1064 return; |
1065 } | 1065 } |
1066 SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_SHOWN, 0, 0); | 1066 SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_SHOWN, 0, 0); |
1067 | 1067 |
1068 if (_this->ShowWindow) { | 1068 if (_this->ShowWindow) { |
1069 _this->ShowWindow(_this, window); | 1069 _this->ShowWindow(_this, window); |
1070 } | 1070 } |
1071 } | 1071 } |
1072 | 1072 |
1073 void | 1073 void |
1074 SDL_HideWindow(SDL_WindowID windowID) | 1074 SDL_HideWindow(SDL_WindowID windowID) |
1075 { | 1075 { |
1076 SDL_Window *window = SDL_GetWindowFromID(windowID); | 1076 SDL_Window *window = SDL_GetWindowFromID(windowID); |
1077 | 1077 |
1078 if (!window || !(window->flags & SDL_WINDOW_SHOWN)) { | 1078 if (!window || !(window->flags & SDL_WINDOW_SHOWN)) { |
1079 return; | 1079 return; |
1080 } | 1080 } |
1081 SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_HIDDEN, 0, 0); | 1081 SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_HIDDEN, 0, 0); |
1082 | 1082 |
1083 if (_this->HideWindow) { | 1083 if (_this->HideWindow) { |
1084 _this->HideWindow(_this, window); | 1084 _this->HideWindow(_this, window); |
1085 } | 1085 } |
1086 } | 1086 } |
1087 | 1087 |
1088 void | 1088 void |
1089 SDL_RaiseWindow(SDL_WindowID windowID) | 1089 SDL_RaiseWindow(SDL_WindowID windowID) |
1090 { | 1090 { |
1091 SDL_Window *window = SDL_GetWindowFromID(windowID); | 1091 SDL_Window *window = SDL_GetWindowFromID(windowID); |
1092 | 1092 |
1093 if (!window || !(window->flags & SDL_WINDOW_SHOWN)) { | 1093 if (!window || !(window->flags & SDL_WINDOW_SHOWN)) { |
1094 return; | 1094 return; |
1095 } | 1095 } |
1096 if (_this->RaiseWindow) { | 1096 if (_this->RaiseWindow) { |
1097 _this->RaiseWindow(_this, window); | 1097 _this->RaiseWindow(_this, window); |
1098 } | 1098 } |
1099 } | 1099 } |
1100 | 1100 |
1101 void | 1101 void |
1102 SDL_MaximizeWindow(SDL_WindowID windowID) | 1102 SDL_MaximizeWindow(SDL_WindowID windowID) |
1103 { | 1103 { |
1104 SDL_Window *window = SDL_GetWindowFromID(windowID); | 1104 SDL_Window *window = SDL_GetWindowFromID(windowID); |
1105 | 1105 |
1106 if (!window || (window->flags & SDL_WINDOW_MAXIMIZED)) { | 1106 if (!window || (window->flags & SDL_WINDOW_MAXIMIZED)) { |
1107 return; | 1107 return; |
1108 } | 1108 } |
1109 SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_MAXIMIZED, 0, 0); | 1109 SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_MAXIMIZED, 0, 0); |
1110 | 1110 |
1111 if (_this->MaximizeWindow) { | 1111 if (_this->MaximizeWindow) { |
1112 _this->MaximizeWindow(_this, window); | 1112 _this->MaximizeWindow(_this, window); |
1113 } | 1113 } |
1114 } | 1114 } |
1115 | 1115 |
1116 void | 1116 void |
1117 SDL_MinimizeWindow(SDL_WindowID windowID) | 1117 SDL_MinimizeWindow(SDL_WindowID windowID) |
1118 { | 1118 { |
1119 SDL_Window *window = SDL_GetWindowFromID(windowID); | 1119 SDL_Window *window = SDL_GetWindowFromID(windowID); |
1120 | 1120 |
1121 if (!window || (window->flags & SDL_WINDOW_MINIMIZED)) { | 1121 if (!window || (window->flags & SDL_WINDOW_MINIMIZED)) { |
1122 return; | 1122 return; |
1123 } | 1123 } |
1124 SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_MINIMIZED, 0, 0); | 1124 SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_MINIMIZED, 0, 0); |
1125 | 1125 |
1126 if (_this->MinimizeWindow) { | 1126 if (_this->MinimizeWindow) { |
1127 _this->MinimizeWindow(_this, window); | 1127 _this->MinimizeWindow(_this, window); |
1128 } | 1128 } |
1129 } | 1129 } |
1130 | 1130 |
1131 void | 1131 void |
1132 SDL_RestoreWindow(SDL_WindowID windowID) | 1132 SDL_RestoreWindow(SDL_WindowID windowID) |
1133 { | 1133 { |
1134 SDL_Window *window = SDL_GetWindowFromID(windowID); | 1134 SDL_Window *window = SDL_GetWindowFromID(windowID); |
1135 | 1135 |
1136 if (!window | 1136 if (!window |
1137 || (window->flags & (SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED))) { | 1137 || (window->flags & (SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED))) { |
1138 return; | 1138 return; |
1139 } | 1139 } |
1140 SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_RESTORED, 0, 0); | 1140 SDL_SendWindowEvent(window->id, SDL_WINDOWEVENT_RESTORED, 0, 0); |
1141 | 1141 |
1142 if (_this->RestoreWindow) { | 1142 if (_this->RestoreWindow) { |
1143 _this->RestoreWindow(_this, window); | 1143 _this->RestoreWindow(_this, window); |
1144 } | 1144 } |
1145 } | 1145 } |
1146 | 1146 |
1147 int | 1147 int |
1148 SDL_SetWindowFullscreen(SDL_WindowID windowID, int fullscreen) | 1148 SDL_SetWindowFullscreen(SDL_WindowID windowID, int fullscreen) |
1149 { | 1149 { |
1150 SDL_Window *window = SDL_GetWindowFromID(windowID); | 1150 SDL_Window *window = SDL_GetWindowFromID(windowID); |
1151 | 1151 |
1152 if (!window) { | 1152 if (!window) { |
1153 return -1; | 1153 return -1; |
1154 } | 1154 } |
1155 if (fullscreen) { | 1155 if (fullscreen) { |
1156 fullscreen = SDL_WINDOW_FULLSCREEN; | 1156 fullscreen = SDL_WINDOW_FULLSCREEN; |
1157 } | 1157 } |
1158 if ((window->flags & SDL_WINDOW_FULLSCREEN) == fullscreen) { | 1158 if ((window->flags & SDL_WINDOW_FULLSCREEN) == fullscreen) { |
1159 return 0; | 1159 return 0; |
1160 } | 1160 } |
1161 if (fullscreen) { | 1161 if (fullscreen) { |
1162 window->flags |= SDL_WINDOW_FULLSCREEN; | 1162 window->flags |= SDL_WINDOW_FULLSCREEN; |
1163 | 1163 |
1164 if (FULLSCREEN_VISIBLE(window)) { | 1164 if (FULLSCREEN_VISIBLE(window)) { |
1165 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); | 1165 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); |
1166 | 1166 |
1167 /* Hide any other fullscreen windows */ | 1167 /* Hide any other fullscreen windows */ |
1168 int i; | 1168 int i; |
1169 for (i = 0; i < display->num_windows; ++i) { | 1169 for (i = 0; i < display->num_windows; ++i) { |
1170 SDL_Window *other = &display->windows[i]; | 1170 SDL_Window *other = &display->windows[i]; |
1171 if (other->id != windowID && FULLSCREEN_VISIBLE(other)) { | 1171 if (other->id != windowID && FULLSCREEN_VISIBLE(other)) { |
1172 SDL_MinimizeWindow(other->id); | 1172 SDL_MinimizeWindow(other->id); |
1173 } | 1173 } |
1174 } | 1174 } |
1175 | 1175 |
1176 SDL_SetDisplayMode(&display->fullscreen_mode); | 1176 SDL_SetDisplayMode(&display->fullscreen_mode); |
1177 } | 1177 } |
1178 } else { | 1178 } else { |
1179 window->flags &= ~SDL_WINDOW_FULLSCREEN; | 1179 window->flags &= ~SDL_WINDOW_FULLSCREEN; |
1180 | 1180 |
1181 if (FULLSCREEN_VISIBLE(window)) { | 1181 if (FULLSCREEN_VISIBLE(window)) { |
1182 SDL_SetDisplayMode(NULL); | 1182 SDL_SetDisplayMode(NULL); |
1183 } | 1183 } |
1184 } | 1184 } |
1185 return 0; | 1185 return 0; |
1186 } | 1186 } |
1187 | 1187 |
1188 void | 1188 void |
1189 SDL_SetWindowGrab(SDL_WindowID windowID, int mode) | 1189 SDL_SetWindowGrab(SDL_WindowID windowID, int mode) |
1190 { | 1190 { |
1191 SDL_Window *window = SDL_GetWindowFromID(windowID); | 1191 SDL_Window *window = SDL_GetWindowFromID(windowID); |
1192 | 1192 |
1193 if (!window || (!!mode == !!(window->flags & SDL_WINDOW_INPUT_GRABBED))) { | 1193 if (!window || (!!mode == !!(window->flags & SDL_WINDOW_INPUT_GRABBED))) { |
1194 return; | 1194 return; |
1195 } | 1195 } |
1196 if (mode) { | 1196 if (mode) { |
1197 window->flags |= SDL_WINDOW_INPUT_GRABBED; | 1197 window->flags |= SDL_WINDOW_INPUT_GRABBED; |
1198 } else { | 1198 } else { |
1199 window->flags &= ~SDL_WINDOW_INPUT_GRABBED; | 1199 window->flags &= ~SDL_WINDOW_INPUT_GRABBED; |
1200 } | 1200 } |
1201 | 1201 |
1202 if ((window->flags & SDL_WINDOW_INPUT_FOCUS) && _this->SetWindowGrab) { | 1202 if ((window->flags & SDL_WINDOW_INPUT_FOCUS) && _this->SetWindowGrab) { |
1203 _this->SetWindowGrab(_this, window); | 1203 _this->SetWindowGrab(_this, window); |
1204 } | 1204 } |
1205 } | 1205 } |
1206 | 1206 |
1207 int | 1207 int |
1208 SDL_GetWindowGrab(SDL_WindowID windowID) | 1208 SDL_GetWindowGrab(SDL_WindowID windowID) |
1209 { | 1209 { |
1210 SDL_Window *window = SDL_GetWindowFromID(windowID); | 1210 SDL_Window *window = SDL_GetWindowFromID(windowID); |
1211 | 1211 |
1212 if (!window) { | 1212 if (!window) { |
1213 return 0; | 1213 return 0; |
1214 } | 1214 } |
1215 return ((window->flags & SDL_WINDOW_INPUT_GRABBED) != 0); | 1215 return ((window->flags & SDL_WINDOW_INPUT_GRABBED) != 0); |
1216 } | 1216 } |
1217 | 1217 |
1218 void | 1218 void |
1219 SDL_OnWindowShown(SDL_Window * window) | 1219 SDL_OnWindowShown(SDL_Window * window) |
1220 { | 1220 { |
1226 } | 1226 } |
1227 | 1227 |
1228 void | 1228 void |
1229 SDL_OnWindowResized(SDL_Window * window) | 1229 SDL_OnWindowResized(SDL_Window * window) |
1230 { | 1230 { |
1231 SDL_Renderer *renderer = window->renderer; | 1231 SDL_Renderer *renderer = window->renderer; |
1232 | 1232 |
1233 if (renderer && renderer->DisplayModeChanged) { | 1233 if (renderer && renderer->DisplayModeChanged) { |
1234 renderer->DisplayModeChanged(renderer); | 1234 renderer->DisplayModeChanged(renderer); |
1235 } | 1235 } |
1236 } | 1236 } |
1237 | 1237 |
1238 void | 1238 void |
1239 SDL_OnWindowFocusGained(SDL_Window * window) | 1239 SDL_OnWindowFocusGained(SDL_Window * window) |
1240 { | 1240 { |
1241 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); | 1241 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); |
1242 | 1242 |
1243 if (window->flags & SDL_WINDOW_FULLSCREEN) { | 1243 if (window->flags & SDL_WINDOW_FULLSCREEN) { |
1244 SDL_SetDisplayMode(&display->fullscreen_mode); | 1244 SDL_SetDisplayMode(&display->fullscreen_mode); |
1245 } | 1245 } |
1246 if (display->gamma && _this->SetDisplayGammaRamp) { | 1246 if (display->gamma && _this->SetDisplayGammaRamp) { |
1247 _this->SetDisplayGammaRamp(_this, display->gamma); | 1247 _this->SetDisplayGammaRamp(_this, display->gamma); |
1248 } | 1248 } |
1249 if ((window->flags & SDL_WINDOW_INPUT_GRABBED) && _this->SetWindowGrab) { | 1249 if ((window->flags & SDL_WINDOW_INPUT_GRABBED) && _this->SetWindowGrab) { |
1250 _this->SetWindowGrab(_this, window); | 1250 _this->SetWindowGrab(_this, window); |
1251 } | 1251 } |
1252 } | 1252 } |
1253 | 1253 |
1254 void | 1254 void |
1255 SDL_OnWindowFocusLost(SDL_Window * window) | 1255 SDL_OnWindowFocusLost(SDL_Window * window) |
1256 { | 1256 { |
1257 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); | 1257 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); |
1258 | 1258 |
1259 if (window->flags & SDL_WINDOW_FULLSCREEN) { | 1259 if (window->flags & SDL_WINDOW_FULLSCREEN) { |
1260 SDL_MinimizeWindow(window->id); | 1260 SDL_MinimizeWindow(window->id); |
1261 SDL_SetDisplayMode(NULL); | 1261 SDL_SetDisplayMode(NULL); |
1262 } | 1262 } |
1263 if (display->gamma && _this->SetDisplayGammaRamp) { | 1263 if (display->gamma && _this->SetDisplayGammaRamp) { |
1264 _this->SetDisplayGammaRamp(_this, display->saved_gamma); | 1264 _this->SetDisplayGammaRamp(_this, display->saved_gamma); |
1265 } | 1265 } |
1266 if ((window->flags & SDL_WINDOW_INPUT_GRABBED) && _this->SetWindowGrab) { | 1266 if ((window->flags & SDL_WINDOW_INPUT_GRABBED) && _this->SetWindowGrab) { |
1267 _this->SetWindowGrab(_this, window); | 1267 _this->SetWindowGrab(_this, window); |
1268 } | 1268 } |
1269 } | 1269 } |
1270 | 1270 |
1271 SDL_WindowID | 1271 SDL_WindowID |
1272 SDL_GetFocusWindow(void) | 1272 SDL_GetFocusWindow(void) |
1273 { | 1273 { |
1274 SDL_VideoDisplay *display; | 1274 SDL_VideoDisplay *display; |
1275 int i; | 1275 int i; |
1276 | 1276 |
1277 if (!_this) { | 1277 if (!_this) { |
1278 return 0; | 1278 return 0; |
1279 } | 1279 } |
1280 display = &SDL_CurrentDisplay; | 1280 display = &SDL_CurrentDisplay; |
1281 for (i = 0; i < display->num_windows; ++i) { | 1281 for (i = 0; i < display->num_windows; ++i) { |
1282 SDL_Window *window = &display->windows[i]; | 1282 SDL_Window *window = &display->windows[i]; |
1283 | 1283 |
1284 if (window->flags & SDL_WINDOW_INPUT_FOCUS) { | 1284 if (window->flags & SDL_WINDOW_INPUT_FOCUS) { |
1285 return window->id; | 1285 return window->id; |
1286 } | 1286 } |
1287 } | 1287 } |
1288 return 0; | 1288 return 0; |
1289 } | 1289 } |
1290 | 1290 |
1291 void | 1291 void |
1292 SDL_DestroyWindow(SDL_WindowID windowID) | 1292 SDL_DestroyWindow(SDL_WindowID windowID) |
1293 { | 1293 { |
1294 int i, j; | 1294 int i, j; |
1295 | 1295 |
1296 if (!_this) { | 1296 if (!_this) { |
1297 return; | 1297 return; |
1298 } | 1298 } |
1299 /* Restore video mode, etc. */ | 1299 /* Restore video mode, etc. */ |
1300 SDL_SendWindowEvent(windowID, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0); | 1300 SDL_SendWindowEvent(windowID, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0); |
1301 | 1301 |
1302 for (i = 0; i < _this->num_displays; ++i) { | 1302 for (i = 0; i < _this->num_displays; ++i) { |
1303 SDL_VideoDisplay *display = &_this->displays[i]; | 1303 SDL_VideoDisplay *display = &_this->displays[i]; |
1304 for (j = 0; j < display->num_windows; ++j) { | 1304 for (j = 0; j < display->num_windows; ++j) { |
1305 SDL_Window *window = &display->windows[j]; | 1305 SDL_Window *window = &display->windows[j]; |
1306 if (window->id != windowID) { | 1306 if (window->id != windowID) { |
1307 continue; | 1307 continue; |
1308 } | 1308 } |
1309 if (window->title) { | 1309 if (window->title) { |
1310 SDL_free(window->title); | 1310 SDL_free(window->title); |
1311 window->title = NULL; | 1311 window->title = NULL; |
1312 } | 1312 } |
1313 if (window->renderer) { | 1313 if (window->renderer) { |
1314 SDL_DestroyRenderer(window->id); | 1314 SDL_DestroyRenderer(window->id); |
1315 window->renderer = NULL; | 1315 window->renderer = NULL; |
1316 } | 1316 } |
1317 if (_this->DestroyWindow) { | 1317 if (_this->DestroyWindow) { |
1318 _this->DestroyWindow(_this, window); | 1318 _this->DestroyWindow(_this, window); |
1319 } | 1319 } |
1320 if (j != display->num_windows - 1) { | 1320 if (j != display->num_windows - 1) { |
1321 SDL_memcpy(&display->windows[i], | 1321 SDL_memcpy(&display->windows[i], |
1322 &display->windows[i + 1], | 1322 &display->windows[i + 1], |
1323 (display->num_windows - i - 1) * sizeof(*window)); | 1323 (display->num_windows - i - 1) * sizeof(*window)); |
1324 } | 1324 } |
1325 --display->num_windows; | 1325 --display->num_windows; |
1326 return; | 1326 return; |
1327 } | 1327 } |
1328 } | 1328 } |
1329 } | 1329 } |
1330 | 1330 |
1331 void | 1331 void |
1332 SDL_AddRenderDriver(int displayIndex, const SDL_RenderDriver * driver) | 1332 SDL_AddRenderDriver(int displayIndex, const SDL_RenderDriver * driver) |
1333 { | 1333 { |
1334 SDL_VideoDisplay *display; | 1334 SDL_VideoDisplay *display; |
1335 SDL_RenderDriver *render_drivers; | 1335 SDL_RenderDriver *render_drivers; |
1336 | 1336 |
1337 if (displayIndex >= _this->num_displays) { | 1337 if (displayIndex >= _this->num_displays) { |
1338 return; | 1338 return; |
1339 } | 1339 } |
1340 display = &_this->displays[displayIndex]; | 1340 display = &_this->displays[displayIndex]; |
1341 | 1341 |
1342 render_drivers = | 1342 render_drivers = |
1343 SDL_realloc(display->render_drivers, | 1343 SDL_realloc(display->render_drivers, |
1344 (display->num_render_drivers + | 1344 (display->num_render_drivers + |
1345 1) * sizeof(*render_drivers)); | 1345 1) * sizeof(*render_drivers)); |
1346 if (render_drivers) { | 1346 if (render_drivers) { |
1347 render_drivers[display->num_render_drivers] = *driver; | 1347 render_drivers[display->num_render_drivers] = *driver; |
1348 display->render_drivers = render_drivers; | 1348 display->render_drivers = render_drivers; |
1349 display->num_render_drivers++; | 1349 display->num_render_drivers++; |
1350 } | 1350 } |
1351 } | 1351 } |
1352 | 1352 |
1353 int | 1353 int |
1354 SDL_GetNumRenderDrivers(void) | 1354 SDL_GetNumRenderDrivers(void) |
1355 { | 1355 { |
1356 if (_this) { | 1356 if (_this) { |
1357 return SDL_CurrentDisplay.num_render_drivers; | 1357 return SDL_CurrentDisplay.num_render_drivers; |
1358 } | 1358 } |
1359 return 0; | 1359 return 0; |
1360 } | 1360 } |
1361 | 1361 |
1362 int | 1362 int |
1363 SDL_GetRenderDriverInfo(int index, SDL_RendererInfo * info) | 1363 SDL_GetRenderDriverInfo(int index, SDL_RendererInfo * info) |
1364 { | 1364 { |
1365 if (!_this) { | 1365 if (!_this) { |
1366 SDL_UninitializedVideo(); | 1366 SDL_UninitializedVideo(); |
1367 return -1; | 1367 return -1; |
1368 } | 1368 } |
1369 if (index < 0 || index >= SDL_GetNumRenderDrivers()) { | 1369 if (index < 0 || index >= SDL_GetNumRenderDrivers()) { |
1370 SDL_SetError("index must be in the range of 0 - %d", | 1370 SDL_SetError("index must be in the range of 0 - %d", |
1371 SDL_GetNumRenderDrivers() - 1); | 1371 SDL_GetNumRenderDrivers() - 1); |
1372 return -1; | 1372 return -1; |
1373 } | 1373 } |
1374 *info = SDL_CurrentDisplay.render_drivers[index].info; | 1374 *info = SDL_CurrentDisplay.render_drivers[index].info; |
1375 return 0; | 1375 return 0; |
1376 } | 1376 } |
1377 | 1377 |
1378 int | 1378 int |
1379 SDL_CreateRenderer(SDL_WindowID windowID, int index, Uint32 flags) | 1379 SDL_CreateRenderer(SDL_WindowID windowID, int index, Uint32 flags) |
1380 { | 1380 { |
1381 SDL_Window *window = SDL_GetWindowFromID(windowID); | 1381 SDL_Window *window = SDL_GetWindowFromID(windowID); |
1382 | 1382 |
1383 if (!window) { | 1383 if (!window) { |
1384 return 0; | 1384 return 0; |
1385 } | 1385 } |
1386 if (index < 0) { | 1386 if (index < 0) { |
1387 const char *override = SDL_getenv("SDL_VIDEO_RENDERER"); | 1387 const char *override = SDL_getenv("SDL_VIDEO_RENDERER"); |
1388 int n = SDL_GetNumRenderDrivers(); | 1388 int n = SDL_GetNumRenderDrivers(); |
1389 for (index = 0; index < n; ++index) { | 1389 for (index = 0; index < n; ++index) { |
1390 SDL_RenderDriver *driver = | 1390 SDL_RenderDriver *driver = |
1391 &SDL_CurrentDisplay.render_drivers[index]; | 1391 &SDL_CurrentDisplay.render_drivers[index]; |
1392 | 1392 |
1393 if (override) { | 1393 if (override) { |
1394 if (SDL_strcasecmp(override, driver->info.name) == 0) { | 1394 if (SDL_strcasecmp(override, driver->info.name) == 0) { |
1395 break; | 1395 break; |
1396 } | 1396 } |
1397 } else { | 1397 } else { |
1398 if ((driver->info.flags & flags) == flags) { | 1398 if ((driver->info.flags & flags) == flags) { |
1399 break; | 1399 break; |
1400 } | 1400 } |
1401 } | 1401 } |
1402 } | 1402 } |
1403 if (index == n) { | 1403 if (index == n) { |
1404 SDL_SetError("Couldn't find matching render driver"); | 1404 SDL_SetError("Couldn't find matching render driver"); |
1405 return -1; | 1405 return -1; |
1406 } | 1406 } |
1407 } | 1407 } |
1408 if (index >= SDL_GetNumRenderDrivers()) { | 1408 if (index >= SDL_GetNumRenderDrivers()) { |
1409 SDL_SetError("index must be -1 or in the range of 0 - %d", | 1409 SDL_SetError("index must be -1 or in the range of 0 - %d", |
1410 SDL_GetNumRenderDrivers() - 1); | 1410 SDL_GetNumRenderDrivers() - 1); |
1411 return -1; | 1411 return -1; |
1412 } | 1412 } |
1413 /* Free any existing renderer */ | 1413 /* Free any existing renderer */ |
1414 SDL_DestroyRenderer(windowID); | 1414 SDL_DestroyRenderer(windowID); |
1415 | 1415 |
1416 /* Create a new renderer instance */ | 1416 /* Create a new renderer instance */ |
1417 window->renderer = SDL_CurrentDisplay.render_drivers[index] | 1417 window->renderer = SDL_CurrentDisplay.render_drivers[index] |
1418 .CreateRenderer(window, flags); | 1418 .CreateRenderer(window, flags); |
1419 SDL_SelectRenderer(window->id); | 1419 SDL_SelectRenderer(window->id); |
1420 | 1420 |
1421 return 0; | 1421 return 0; |
1422 } | 1422 } |
1423 | 1423 |
1424 int | 1424 int |
1425 SDL_SelectRenderer(SDL_WindowID windowID) | 1425 SDL_SelectRenderer(SDL_WindowID windowID) |
1426 { | 1426 { |
1427 SDL_Window *window = SDL_GetWindowFromID(windowID); | 1427 SDL_Window *window = SDL_GetWindowFromID(windowID); |
1428 SDL_Renderer *renderer; | 1428 SDL_Renderer *renderer; |
1429 | 1429 |
1430 if (!window || !window->renderer) { | 1430 if (!window || !window->renderer) { |
1431 return -1; | 1431 return -1; |
1432 } | 1432 } |
1433 renderer = window->renderer; | 1433 renderer = window->renderer; |
1434 if (renderer && renderer->ActivateRenderer) { | 1434 if (renderer && renderer->ActivateRenderer) { |
1435 if (renderer->ActivateRenderer(renderer) < 0) { | 1435 if (renderer->ActivateRenderer(renderer) < 0) { |
1436 return -1; | 1436 return -1; |
1437 } | 1437 } |
1438 } | 1438 } |
1439 SDL_CurrentDisplay.current_renderer = renderer; | 1439 SDL_CurrentDisplay.current_renderer = renderer; |
1440 return 0; | 1440 return 0; |
1441 } | 1441 } |
1442 | 1442 |
1443 int | 1443 int |
1444 SDL_GetRendererInfo(SDL_RendererInfo * info) | 1444 SDL_GetRendererInfo(SDL_RendererInfo * info) |
1445 { | 1445 { |
1446 if (!_this) { | 1446 if (!_this) { |
1447 SDL_UninitializedVideo(); | 1447 SDL_UninitializedVideo(); |
1448 return -1; | 1448 return -1; |
1449 } | 1449 } |
1450 if (!SDL_CurrentDisplay.current_renderer) { | 1450 if (!SDL_CurrentDisplay.current_renderer) { |
1451 SDL_SetError("There is no current renderer"); | 1451 SDL_SetError("There is no current renderer"); |
1452 return -1; | 1452 return -1; |
1453 } | 1453 } |
1454 *info = SDL_CurrentDisplay.current_renderer->info; | 1454 *info = SDL_CurrentDisplay.current_renderer->info; |
1455 return 0; | 1455 return 0; |
1456 } | 1456 } |
1457 | 1457 |
1458 SDL_TextureID | 1458 SDL_TextureID |
1459 SDL_CreateTexture(Uint32 format, int access, int w, int h) | 1459 SDL_CreateTexture(Uint32 format, int access, int w, int h) |
1460 { | 1460 { |
1461 int hash; | 1461 int hash; |
1462 SDL_Renderer *renderer; | 1462 SDL_Renderer *renderer; |
1463 SDL_Texture *texture; | 1463 SDL_Texture *texture; |
1464 | 1464 |
1465 if (!_this) { | 1465 if (!_this) { |
1466 SDL_UninitializedVideo(); | 1466 SDL_UninitializedVideo(); |
1467 return 0; | 1467 return 0; |
1468 } | 1468 } |
1469 renderer = SDL_CurrentDisplay.current_renderer; | 1469 renderer = SDL_CurrentDisplay.current_renderer; |
1470 if (!renderer || !renderer->CreateTexture) { | 1470 if (!renderer || !renderer->CreateTexture) { |
1471 return 0; | 1471 return 0; |
1472 } | 1472 } |
1473 texture = (SDL_Texture *) SDL_calloc(1, sizeof(*texture)); | 1473 texture = (SDL_Texture *) SDL_calloc(1, sizeof(*texture)); |
1474 if (!texture) { | 1474 if (!texture) { |
1475 SDL_OutOfMemory(); | 1475 SDL_OutOfMemory(); |
1476 return 0; | 1476 return 0; |
1477 } | 1477 } |
1478 texture->id = _this->next_object_id++; | 1478 texture->id = _this->next_object_id++; |
1479 texture->format = format; | 1479 texture->format = format; |
1480 texture->access = access; | 1480 texture->access = access; |
1481 texture->w = w; | 1481 texture->w = w; |
1482 texture->h = h; | 1482 texture->h = h; |
1483 texture->r = 255; | 1483 texture->r = 255; |
1484 texture->g = 255; | 1484 texture->g = 255; |
1485 texture->b = 255; | 1485 texture->b = 255; |
1486 texture->a = 255; | 1486 texture->a = 255; |
1487 texture->renderer = renderer; | 1487 texture->renderer = renderer; |
1488 | 1488 |
1489 if (renderer->CreateTexture(renderer, texture) < 0) { | 1489 if (renderer->CreateTexture(renderer, texture) < 0) { |
1490 if (renderer->DestroyTexture) { | 1490 if (renderer->DestroyTexture) { |
1491 renderer->DestroyTexture(renderer, texture); | 1491 renderer->DestroyTexture(renderer, texture); |
1492 } | 1492 } |
1493 SDL_free(texture); | 1493 SDL_free(texture); |
1494 return 0; | 1494 return 0; |
1495 } | 1495 } |
1496 hash = (texture->id % SDL_arraysize(SDL_CurrentDisplay.textures)); | 1496 hash = (texture->id % SDL_arraysize(SDL_CurrentDisplay.textures)); |
1497 texture->next = SDL_CurrentDisplay.textures[hash]; | 1497 texture->next = SDL_CurrentDisplay.textures[hash]; |
1498 SDL_CurrentDisplay.textures[hash] = texture; | 1498 SDL_CurrentDisplay.textures[hash] = texture; |
1499 | 1499 |
1500 return texture->id; | 1500 return texture->id; |
1501 } | 1501 } |
1502 | 1502 |
1503 SDL_TextureID | 1503 SDL_TextureID |
1504 SDL_CreateTextureFromSurface(Uint32 format, SDL_Surface * surface) | 1504 SDL_CreateTextureFromSurface(Uint32 format, SDL_Surface * surface) |
1505 { | 1505 { |
1506 SDL_TextureID textureID; | 1506 SDL_TextureID textureID; |
1507 SDL_PixelFormat *fmt; | 1507 SDL_PixelFormat *fmt; |
1508 int bpp; | 1508 int bpp; |
1509 Uint32 Rmask, Gmask, Bmask, Amask; | 1509 Uint32 Rmask, Gmask, Bmask, Amask; |
1510 | 1510 |
1511 if (!surface) { | 1511 if (!surface) { |
1512 SDL_SetError("SDL_CreateTextureFromSurface() passed NULL surface"); | 1512 SDL_SetError("SDL_CreateTextureFromSurface() passed NULL surface"); |
1513 return 0; | 1513 return 0; |
1514 } | 1514 } |
1515 fmt = surface->format; | 1515 fmt = surface->format; |
1516 | 1516 |
1517 if (format) { | 1517 if (format) { |
1518 if (!SDL_PixelFormatEnumToMasks | 1518 if (!SDL_PixelFormatEnumToMasks |
1519 (format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) { | 1519 (format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) { |
1520 SDL_SetError("Unknown pixel format"); | 1520 SDL_SetError("Unknown pixel format"); |
1521 return 0; | 1521 return 0; |
1522 } | 1522 } |
1523 } else { | 1523 } else { |
1524 if (surface->format->Amask | 1524 if (surface->format->Amask |
1525 || !(surface->map->info.flags & | 1525 || !(surface->map->info.flags & |
1526 (SDL_COPY_COLORKEY | SDL_COPY_MASK | SDL_COPY_BLEND))) { | 1526 (SDL_COPY_COLORKEY | SDL_COPY_MASK | SDL_COPY_BLEND))) { |
1527 bpp = fmt->BitsPerPixel; | 1527 bpp = fmt->BitsPerPixel; |
1528 Rmask = fmt->Rmask; | 1528 Rmask = fmt->Rmask; |
1529 Gmask = fmt->Gmask; | 1529 Gmask = fmt->Gmask; |
1530 Bmask = fmt->Bmask; | 1530 Bmask = fmt->Bmask; |
1531 Amask = fmt->Amask; | 1531 Amask = fmt->Amask; |
1532 } else { | 1532 } else { |
1533 /* Need a format with alpha */ | 1533 /* Need a format with alpha */ |
1534 bpp = 32; | 1534 bpp = 32; |
1535 Rmask = 0x00FF0000; | 1535 Rmask = 0x00FF0000; |
1536 Gmask = 0x0000FF00; | 1536 Gmask = 0x0000FF00; |
1537 Bmask = 0x000000FF; | 1537 Bmask = 0x000000FF; |
1538 Amask = 0xFF000000; | 1538 Amask = 0xFF000000; |
1539 } | 1539 } |
1540 format = SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, Amask); | 1540 format = SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, Amask); |
1541 if (!format) { | 1541 if (!format) { |
1542 SDL_SetError("Unknown pixel format"); | 1542 SDL_SetError("Unknown pixel format"); |
1543 return 0; | 1543 return 0; |
1544 } | 1544 } |
1545 } | 1545 } |
1546 | 1546 |
1547 textureID = | 1547 textureID = |
1548 SDL_CreateTexture(format, SDL_TEXTUREACCESS_STATIC, surface->w, | 1548 SDL_CreateTexture(format, SDL_TEXTUREACCESS_STATIC, surface->w, |
1549 surface->h); | 1549 surface->h); |
1550 if (!textureID) { | 1550 if (!textureID) { |
1551 return 0; | 1551 return 0; |
1552 } | 1552 } |
1553 if (bpp == fmt->BitsPerPixel && Rmask == fmt->Rmask && Gmask == fmt->Gmask | 1553 if (bpp == fmt->BitsPerPixel && Rmask == fmt->Rmask && Gmask == fmt->Gmask |
1554 && Bmask == fmt->Bmask && Amask == fmt->Amask) { | 1554 && Bmask == fmt->Bmask && Amask == fmt->Amask) { |
1555 if (SDL_MUSTLOCK(surface)) { | 1555 if (SDL_MUSTLOCK(surface)) { |
1556 if (SDL_LockSurface(surface) < 0) { | 1556 if (SDL_LockSurface(surface) < 0) { |
1557 SDL_DestroyTexture(textureID); | 1557 SDL_DestroyTexture(textureID); |
1558 return 0; | 1558 return 0; |
1559 } | 1559 } |
1560 SDL_UpdateTexture(textureID, NULL, surface->pixels, | 1560 SDL_UpdateTexture(textureID, NULL, surface->pixels, |
1561 surface->pitch); | 1561 surface->pitch); |
1562 SDL_UnlockSurface(surface); | 1562 SDL_UnlockSurface(surface); |
1563 } else { | 1563 } else { |
1564 SDL_UpdateTexture(textureID, NULL, surface->pixels, | 1564 SDL_UpdateTexture(textureID, NULL, surface->pixels, |
1565 surface->pitch); | 1565 surface->pitch); |
1566 } | 1566 } |
1567 } else { | 1567 } else { |
1568 SDL_PixelFormat *dst_fmt; | 1568 SDL_PixelFormat *dst_fmt; |
1569 SDL_Surface *dst = NULL; | 1569 SDL_Surface *dst = NULL; |
1570 | 1570 |
1571 /* Set up a destination surface for the texture update */ | 1571 /* Set up a destination surface for the texture update */ |
1572 dst_fmt = SDL_AllocFormat(bpp, Rmask, Gmask, Bmask, Amask); | 1572 dst_fmt = SDL_AllocFormat(bpp, Rmask, Gmask, Bmask, Amask); |
1573 if (dst_fmt) { | 1573 if (dst_fmt) { |
1574 if (SDL_ISPIXELFORMAT_INDEXED(format)) { | 1574 if (SDL_ISPIXELFORMAT_INDEXED(format)) { |
1575 dst_fmt->palette = | 1575 dst_fmt->palette = |
1576 SDL_AllocPalette((1 << SDL_BITSPERPIXEL(format))); | 1576 SDL_AllocPalette((1 << SDL_BITSPERPIXEL(format))); |
1577 if (dst_fmt->palette) { | 1577 if (dst_fmt->palette) { |
1578 /* | 1578 /* |
1579 * FIXME: Should we try to copy | 1579 * FIXME: Should we try to copy |
1580 * fmt->palette? | 1580 * fmt->palette? |
1581 */ | 1581 */ |
1582 SDL_DitherColors(dst_fmt->palette->colors, | 1582 SDL_DitherColors(dst_fmt->palette->colors, |
1583 SDL_BITSPERPIXEL(format)); | 1583 SDL_BITSPERPIXEL(format)); |
1584 } | 1584 } |
1585 } | 1585 } |
1586 dst = SDL_ConvertSurface(surface, dst_fmt, 0); | 1586 dst = SDL_ConvertSurface(surface, dst_fmt, 0); |
1587 if (dst) { | 1587 if (dst) { |
1588 SDL_UpdateTexture(textureID, NULL, dst->pixels, dst->pitch); | 1588 SDL_UpdateTexture(textureID, NULL, dst->pixels, dst->pitch); |
1589 SDL_FreeSurface(dst); | 1589 SDL_FreeSurface(dst); |
1590 } | 1590 } |
1591 if (dst_fmt->palette) { | 1591 if (dst_fmt->palette) { |
1592 SDL_FreePalette(dst_fmt->palette); | 1592 SDL_FreePalette(dst_fmt->palette); |
1593 } | 1593 } |
1594 SDL_FreeFormat(dst_fmt); | 1594 SDL_FreeFormat(dst_fmt); |
1595 } | 1595 } |
1596 if (!dst) { | 1596 if (!dst) { |
1597 SDL_DestroyTexture(textureID); | 1597 SDL_DestroyTexture(textureID); |
1598 return 0; | 1598 return 0; |
1599 } | 1599 } |
1600 } | 1600 } |
1601 | 1601 |
1602 if (SDL_ISPIXELFORMAT_INDEXED(format) && fmt->palette) { | 1602 if (SDL_ISPIXELFORMAT_INDEXED(format) && fmt->palette) { |
1603 SDL_SetTexturePalette(textureID, fmt->palette->colors, 0, | 1603 SDL_SetTexturePalette(textureID, fmt->palette->colors, 0, |
1604 fmt->palette->ncolors); | 1604 fmt->palette->ncolors); |
1605 } | 1605 } |
1606 return textureID; | 1606 return textureID; |
1607 } | 1607 } |
1608 | 1608 |
1609 static __inline__ SDL_Texture * | 1609 static __inline__ SDL_Texture * |
1610 SDL_GetTextureFromID(SDL_TextureID textureID) | 1610 SDL_GetTextureFromID(SDL_TextureID textureID) |
1611 { | 1611 { |
1612 int hash; | 1612 int hash; |
1613 SDL_Texture *texture; | 1613 SDL_Texture *texture; |
1614 | 1614 |
1615 if (!_this) { | 1615 if (!_this) { |
1616 return NULL; | 1616 return NULL; |
1617 } | 1617 } |
1618 hash = (textureID % SDL_arraysize(SDL_CurrentDisplay.textures)); | 1618 hash = (textureID % SDL_arraysize(SDL_CurrentDisplay.textures)); |
1619 for (texture = SDL_CurrentDisplay.textures[hash]; texture; | 1619 for (texture = SDL_CurrentDisplay.textures[hash]; texture; |
1620 texture = texture->next) { | 1620 texture = texture->next) { |
1621 if (texture->id == textureID) { | 1621 if (texture->id == textureID) { |
1622 return texture; | 1622 return texture; |
1623 } | 1623 } |
1624 } | 1624 } |
1625 return NULL; | 1625 return NULL; |
1626 } | 1626 } |
1627 | 1627 |
1628 int | 1628 int |
1629 SDL_QueryTexture(SDL_TextureID textureID, Uint32 * format, int *access, | 1629 SDL_QueryTexture(SDL_TextureID textureID, Uint32 * format, int *access, |
1630 int *w, int *h) | 1630 int *w, int *h) |
1631 { | 1631 { |
1632 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1632 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1633 | 1633 |
1634 if (!texture) { | 1634 if (!texture) { |
1635 return -1; | 1635 return -1; |
1636 } | 1636 } |
1637 if (format) { | 1637 if (format) { |
1638 *format = texture->format; | 1638 *format = texture->format; |
1639 } | 1639 } |
1640 if (access) { | 1640 if (access) { |
1641 *access = texture->access; | 1641 *access = texture->access; |
1642 } | 1642 } |
1643 if (w) { | 1643 if (w) { |
1644 *w = texture->w; | 1644 *w = texture->w; |
1645 } | 1645 } |
1646 if (h) { | 1646 if (h) { |
1647 *h = texture->h; | 1647 *h = texture->h; |
1648 } | 1648 } |
1649 return 0; | 1649 return 0; |
1650 } | 1650 } |
1651 | 1651 |
1652 int | 1652 int |
1653 SDL_QueryTexturePixels(SDL_TextureID textureID, void **pixels, int *pitch) | 1653 SDL_QueryTexturePixels(SDL_TextureID textureID, void **pixels, int *pitch) |
1654 { | 1654 { |
1655 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1655 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1656 SDL_Renderer *renderer; | 1656 SDL_Renderer *renderer; |
1657 | 1657 |
1658 if (!texture) { | 1658 if (!texture) { |
1659 return -1; | 1659 return -1; |
1660 } | 1660 } |
1661 renderer = texture->renderer; | 1661 renderer = texture->renderer; |
1662 if (!renderer->QueryTexturePixels) { | 1662 if (!renderer->QueryTexturePixels) { |
1663 return -1; | 1663 return -1; |
1664 } | 1664 } |
1665 return renderer->QueryTexturePixels(renderer, texture, pixels, pitch); | 1665 return renderer->QueryTexturePixels(renderer, texture, pixels, pitch); |
1666 } | 1666 } |
1667 | 1667 |
1668 int | 1668 int |
1669 SDL_SetTexturePalette(SDL_TextureID textureID, const SDL_Color * colors, | 1669 SDL_SetTexturePalette(SDL_TextureID textureID, const SDL_Color * colors, |
1670 int firstcolor, int ncolors) | 1670 int firstcolor, int ncolors) |
1671 { | 1671 { |
1672 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1672 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1673 SDL_Renderer *renderer; | 1673 SDL_Renderer *renderer; |
1674 | 1674 |
1675 if (!texture) { | 1675 if (!texture) { |
1676 return -1; | 1676 return -1; |
1677 } | 1677 } |
1678 renderer = texture->renderer; | 1678 renderer = texture->renderer; |
1679 if (!renderer->SetTexturePalette) { | 1679 if (!renderer->SetTexturePalette) { |
1680 return -1; | 1680 return -1; |
1681 } | 1681 } |
1682 return renderer->SetTexturePalette(renderer, texture, colors, firstcolor, | 1682 return renderer->SetTexturePalette(renderer, texture, colors, firstcolor, |
1683 ncolors); | 1683 ncolors); |
1684 } | 1684 } |
1685 | 1685 |
1686 int | 1686 int |
1687 SDL_GetTexturePalette(SDL_TextureID textureID, SDL_Color * colors, | 1687 SDL_GetTexturePalette(SDL_TextureID textureID, SDL_Color * colors, |
1688 int firstcolor, int ncolors) | 1688 int firstcolor, int ncolors) |
1689 { | 1689 { |
1690 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1690 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1691 SDL_Renderer *renderer; | 1691 SDL_Renderer *renderer; |
1692 | 1692 |
1693 if (!texture) { | 1693 if (!texture) { |
1694 return -1; | 1694 return -1; |
1695 } | 1695 } |
1696 renderer = texture->renderer; | 1696 renderer = texture->renderer; |
1697 if (!renderer->GetTexturePalette) { | 1697 if (!renderer->GetTexturePalette) { |
1698 return -1; | 1698 return -1; |
1699 } | 1699 } |
1700 return renderer->GetTexturePalette(renderer, texture, colors, firstcolor, | 1700 return renderer->GetTexturePalette(renderer, texture, colors, firstcolor, |
1701 ncolors); | 1701 ncolors); |
1702 } | 1702 } |
1703 | 1703 |
1704 int | 1704 int |
1705 SDL_SetTextureColorMod(SDL_TextureID textureID, Uint8 r, Uint8 g, Uint8 b) | 1705 SDL_SetTextureColorMod(SDL_TextureID textureID, Uint8 r, Uint8 g, Uint8 b) |
1706 { | 1706 { |
1707 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1707 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1708 SDL_Renderer *renderer; | 1708 SDL_Renderer *renderer; |
1709 | 1709 |
1710 if (!texture) { | 1710 if (!texture) { |
1711 return -1; | 1711 return -1; |
1712 } | 1712 } |
1713 renderer = texture->renderer; | 1713 renderer = texture->renderer; |
1714 if (!renderer->SetTextureColorMod) { | 1714 if (!renderer->SetTextureColorMod) { |
1715 return -1; | 1715 return -1; |
1716 } | 1716 } |
1717 if (r < 255 || g < 255 || b < 255) { | 1717 if (r < 255 || g < 255 || b < 255) { |
1718 texture->modMode |= SDL_TEXTUREMODULATE_COLOR; | 1718 texture->modMode |= SDL_TEXTUREMODULATE_COLOR; |
1719 } else { | 1719 } else { |
1720 texture->modMode &= ~SDL_TEXTUREMODULATE_COLOR; | 1720 texture->modMode &= ~SDL_TEXTUREMODULATE_COLOR; |
1721 } | 1721 } |
1722 texture->r = r; | 1722 texture->r = r; |
1723 texture->g = g; | 1723 texture->g = g; |
1724 texture->b = b; | 1724 texture->b = b; |
1725 return renderer->SetTextureColorMod(renderer, texture); | 1725 return renderer->SetTextureColorMod(renderer, texture); |
1726 } | 1726 } |
1727 | 1727 |
1728 int | 1728 int |
1729 SDL_GetTextureColorMod(SDL_TextureID textureID, Uint8 * r, Uint8 * g, | 1729 SDL_GetTextureColorMod(SDL_TextureID textureID, Uint8 * r, Uint8 * g, |
1730 Uint8 * b) | 1730 Uint8 * b) |
1731 { | 1731 { |
1732 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1732 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1733 SDL_Renderer *renderer; | 1733 SDL_Renderer *renderer; |
1734 | 1734 |
1735 if (!texture) { | 1735 if (!texture) { |
1736 return -1; | 1736 return -1; |
1737 } | 1737 } |
1738 renderer = texture->renderer; | 1738 renderer = texture->renderer; |
1739 if (r) { | 1739 if (r) { |
1740 *r = texture->r; | 1740 *r = texture->r; |
1741 } | 1741 } |
1742 if (g) { | 1742 if (g) { |
1743 *g = texture->g; | 1743 *g = texture->g; |
1744 } | 1744 } |
1745 if (b) { | 1745 if (b) { |
1746 *b = texture->b; | 1746 *b = texture->b; |
1747 } | 1747 } |
1748 return 0; | 1748 return 0; |
1749 } | 1749 } |
1750 | 1750 |
1751 int | 1751 int |
1752 SDL_SetTextureAlphaMod(SDL_TextureID textureID, Uint8 alpha) | 1752 SDL_SetTextureAlphaMod(SDL_TextureID textureID, Uint8 alpha) |
1753 { | 1753 { |
1754 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1754 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1755 SDL_Renderer *renderer; | 1755 SDL_Renderer *renderer; |
1756 | 1756 |
1757 if (!texture) { | 1757 if (!texture) { |
1758 return -1; | 1758 return -1; |
1759 } | 1759 } |
1760 renderer = texture->renderer; | 1760 renderer = texture->renderer; |
1761 if (!renderer->SetTextureAlphaMod) { | 1761 if (!renderer->SetTextureAlphaMod) { |
1762 return -1; | 1762 return -1; |
1763 } | 1763 } |
1764 if (alpha < 255) { | 1764 if (alpha < 255) { |
1765 texture->modMode |= SDL_TEXTUREMODULATE_ALPHA; | 1765 texture->modMode |= SDL_TEXTUREMODULATE_ALPHA; |
1766 } else { | 1766 } else { |
1767 texture->modMode &= ~SDL_TEXTUREMODULATE_ALPHA; | 1767 texture->modMode &= ~SDL_TEXTUREMODULATE_ALPHA; |
1768 } | 1768 } |
1769 texture->a = alpha; | 1769 texture->a = alpha; |
1770 return renderer->SetTextureAlphaMod(renderer, texture); | 1770 return renderer->SetTextureAlphaMod(renderer, texture); |
1771 } | 1771 } |
1772 | 1772 |
1773 int | 1773 int |
1774 SDL_GetTextureAlphaMod(SDL_TextureID textureID, Uint8 * alpha) | 1774 SDL_GetTextureAlphaMod(SDL_TextureID textureID, Uint8 * alpha) |
1775 { | 1775 { |
1776 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1776 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1777 | 1777 |
1778 if (!texture) { | 1778 if (!texture) { |
1779 return -1; | 1779 return -1; |
1780 } | 1780 } |
1781 if (alpha) { | 1781 if (alpha) { |
1782 *alpha = texture->a; | 1782 *alpha = texture->a; |
1783 } | 1783 } |
1784 return 0; | 1784 return 0; |
1785 } | 1785 } |
1786 | 1786 |
1787 int | 1787 int |
1788 SDL_SetTextureBlendMode(SDL_TextureID textureID, int blendMode) | 1788 SDL_SetTextureBlendMode(SDL_TextureID textureID, int blendMode) |
1789 { | 1789 { |
1790 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1790 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1791 SDL_Renderer *renderer; | 1791 SDL_Renderer *renderer; |
1792 | 1792 |
1793 if (!texture) { | 1793 if (!texture) { |
1794 return -1; | 1794 return -1; |
1795 } | 1795 } |
1796 renderer = texture->renderer; | 1796 renderer = texture->renderer; |
1797 if (!renderer->SetTextureBlendMode) { | 1797 if (!renderer->SetTextureBlendMode) { |
1798 return -1; | 1798 return -1; |
1799 } | 1799 } |
1800 texture->blendMode = blendMode; | 1800 texture->blendMode = blendMode; |
1801 return renderer->SetTextureBlendMode(renderer, texture); | 1801 return renderer->SetTextureBlendMode(renderer, texture); |
1802 } | 1802 } |
1803 | 1803 |
1804 int | 1804 int |
1805 SDL_GetTextureBlendMode(SDL_TextureID textureID, int *blendMode) | 1805 SDL_GetTextureBlendMode(SDL_TextureID textureID, int *blendMode) |
1806 { | 1806 { |
1807 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1807 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1808 | 1808 |
1809 if (!texture) { | 1809 if (!texture) { |
1810 return -1; | 1810 return -1; |
1811 } | 1811 } |
1812 if (blendMode) { | 1812 if (blendMode) { |
1813 *blendMode = texture->blendMode; | 1813 *blendMode = texture->blendMode; |
1814 } | 1814 } |
1815 return 0; | 1815 return 0; |
1816 } | 1816 } |
1817 | 1817 |
1818 int | 1818 int |
1819 SDL_SetTextureScaleMode(SDL_TextureID textureID, int scaleMode) | 1819 SDL_SetTextureScaleMode(SDL_TextureID textureID, int scaleMode) |
1820 { | 1820 { |
1821 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1821 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1822 SDL_Renderer *renderer; | 1822 SDL_Renderer *renderer; |
1823 | 1823 |
1824 if (!texture) { | 1824 if (!texture) { |
1825 return -1; | 1825 return -1; |
1826 } | 1826 } |
1827 renderer = texture->renderer; | 1827 renderer = texture->renderer; |
1828 if (!renderer->SetTextureScaleMode) { | 1828 if (!renderer->SetTextureScaleMode) { |
1829 return -1; | 1829 return -1; |
1830 } | 1830 } |
1831 texture->scaleMode = scaleMode; | 1831 texture->scaleMode = scaleMode; |
1832 return renderer->SetTextureScaleMode(renderer, texture); | 1832 return renderer->SetTextureScaleMode(renderer, texture); |
1833 } | 1833 } |
1834 | 1834 |
1835 int | 1835 int |
1836 SDL_GetTextureScaleMode(SDL_TextureID textureID, int *scaleMode) | 1836 SDL_GetTextureScaleMode(SDL_TextureID textureID, int *scaleMode) |
1837 { | 1837 { |
1838 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1838 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1839 | 1839 |
1840 if (!texture) { | 1840 if (!texture) { |
1841 return -1; | 1841 return -1; |
1842 } | 1842 } |
1843 if (scaleMode) { | 1843 if (scaleMode) { |
1844 *scaleMode = texture->scaleMode; | 1844 *scaleMode = texture->scaleMode; |
1845 } | 1845 } |
1846 return 0; | 1846 return 0; |
1847 } | 1847 } |
1848 | 1848 |
1849 int | 1849 int |
1850 SDL_UpdateTexture(SDL_TextureID textureID, const SDL_Rect * rect, | 1850 SDL_UpdateTexture(SDL_TextureID textureID, const SDL_Rect * rect, |
1851 const void *pixels, int pitch) | 1851 const void *pixels, int pitch) |
1852 { | 1852 { |
1853 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1853 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1854 SDL_Renderer *renderer; | 1854 SDL_Renderer *renderer; |
1855 SDL_Rect full_rect; | 1855 SDL_Rect full_rect; |
1856 | 1856 |
1857 if (!texture) { | 1857 if (!texture) { |
1858 return -1; | 1858 return -1; |
1859 } | 1859 } |
1860 renderer = texture->renderer; | 1860 renderer = texture->renderer; |
1861 if (!renderer->UpdateTexture) { | 1861 if (!renderer->UpdateTexture) { |
1862 return -1; | 1862 return -1; |
1863 } | 1863 } |
1864 if (!rect) { | 1864 if (!rect) { |
1865 full_rect.x = 0; | 1865 full_rect.x = 0; |
1866 full_rect.y = 0; | 1866 full_rect.y = 0; |
1867 full_rect.w = texture->w; | 1867 full_rect.w = texture->w; |
1868 full_rect.h = texture->h; | 1868 full_rect.h = texture->h; |
1869 rect = &full_rect; | 1869 rect = &full_rect; |
1870 } | 1870 } |
1871 return renderer->UpdateTexture(renderer, texture, rect, pixels, pitch); | 1871 return renderer->UpdateTexture(renderer, texture, rect, pixels, pitch); |
1872 } | 1872 } |
1873 | 1873 |
1874 int | 1874 int |
1875 SDL_LockTexture(SDL_TextureID textureID, const SDL_Rect * rect, int markDirty, | 1875 SDL_LockTexture(SDL_TextureID textureID, const SDL_Rect * rect, int markDirty, |
1876 void **pixels, int *pitch) | 1876 void **pixels, int *pitch) |
1877 { | 1877 { |
1878 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1878 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1879 SDL_Renderer *renderer; | 1879 SDL_Renderer *renderer; |
1880 SDL_Rect full_rect; | 1880 SDL_Rect full_rect; |
1881 | 1881 |
1882 if (!texture) { | 1882 if (!texture) { |
1883 return -1; | 1883 return -1; |
1884 } | 1884 } |
1885 if (texture->access != SDL_TEXTUREACCESS_STREAMING) { | 1885 if (texture->access != SDL_TEXTUREACCESS_STREAMING) { |
1886 SDL_SetError("SDL_LockTexture(): texture must be streaming"); | 1886 SDL_SetError("SDL_LockTexture(): texture must be streaming"); |
1887 return -1; | 1887 return -1; |
1888 } | 1888 } |
1889 renderer = texture->renderer; | 1889 renderer = texture->renderer; |
1890 if (!renderer->LockTexture) { | 1890 if (!renderer->LockTexture) { |
1891 return -1; | 1891 return -1; |
1892 } | 1892 } |
1893 if (!rect) { | 1893 if (!rect) { |
1894 full_rect.x = 0; | 1894 full_rect.x = 0; |
1895 full_rect.y = 0; | 1895 full_rect.y = 0; |
1896 full_rect.w = texture->w; | 1896 full_rect.w = texture->w; |
1897 full_rect.h = texture->h; | 1897 full_rect.h = texture->h; |
1898 rect = &full_rect; | 1898 rect = &full_rect; |
1899 } | 1899 } |
1900 return renderer->LockTexture(renderer, texture, rect, markDirty, pixels, | 1900 return renderer->LockTexture(renderer, texture, rect, markDirty, pixels, |
1901 pitch); | 1901 pitch); |
1902 } | 1902 } |
1903 | 1903 |
1904 void | 1904 void |
1905 SDL_UnlockTexture(SDL_TextureID textureID) | 1905 SDL_UnlockTexture(SDL_TextureID textureID) |
1906 { | 1906 { |
1907 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1907 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1908 SDL_Renderer *renderer; | 1908 SDL_Renderer *renderer; |
1909 | 1909 |
1910 if (!texture) { | 1910 if (!texture) { |
1911 return; | 1911 return; |
1912 } | 1912 } |
1913 if (texture->access != SDL_TEXTUREACCESS_STREAMING) { | 1913 if (texture->access != SDL_TEXTUREACCESS_STREAMING) { |
1914 return; | 1914 return; |
1915 } | 1915 } |
1916 renderer = texture->renderer; | 1916 renderer = texture->renderer; |
1917 if (!renderer->UnlockTexture) { | 1917 if (!renderer->UnlockTexture) { |
1918 return; | 1918 return; |
1919 } | 1919 } |
1920 renderer->UnlockTexture(renderer, texture); | 1920 renderer->UnlockTexture(renderer, texture); |
1921 } | 1921 } |
1922 | 1922 |
1923 void | 1923 void |
1924 SDL_DirtyTexture(SDL_TextureID textureID, int numrects, | 1924 SDL_DirtyTexture(SDL_TextureID textureID, int numrects, |
1925 const SDL_Rect * rects) | 1925 const SDL_Rect * rects) |
1926 { | 1926 { |
1927 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1927 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1928 SDL_Renderer *renderer; | 1928 SDL_Renderer *renderer; |
1929 | 1929 |
1930 if (!texture) { | 1930 if (!texture) { |
1931 return; | 1931 return; |
1932 } | 1932 } |
1933 if (texture->access != SDL_TEXTUREACCESS_STREAMING) { | 1933 if (texture->access != SDL_TEXTUREACCESS_STREAMING) { |
1934 return; | 1934 return; |
1935 } | 1935 } |
1936 renderer = texture->renderer; | 1936 renderer = texture->renderer; |
1937 if (!renderer->DirtyTexture) { | 1937 if (!renderer->DirtyTexture) { |
1938 return; | 1938 return; |
1939 } | 1939 } |
1940 renderer->DirtyTexture(renderer, texture, numrects, rects); | 1940 renderer->DirtyTexture(renderer, texture, numrects, rects); |
1941 } | 1941 } |
1942 | 1942 |
1943 int | 1943 int |
1944 SDL_RenderFill(Uint8 r, Uint8 g, Uint8 b, Uint8 a, const SDL_Rect * rect) | 1944 SDL_RenderFill(Uint8 r, Uint8 g, Uint8 b, Uint8 a, const SDL_Rect * rect) |
1945 { | 1945 { |
1946 SDL_Renderer *renderer; | 1946 SDL_Renderer *renderer; |
1947 SDL_Window *window; | 1947 SDL_Window *window; |
1948 SDL_Rect real_rect; | 1948 SDL_Rect real_rect; |
1949 | 1949 |
1950 if (!_this) { | 1950 if (!_this) { |
1951 SDL_UninitializedVideo(); | 1951 SDL_UninitializedVideo(); |
1952 return -1; | 1952 return -1; |
1953 } | 1953 } |
1954 renderer = SDL_CurrentDisplay.current_renderer; | 1954 renderer = SDL_CurrentDisplay.current_renderer; |
1955 if (!renderer || !renderer->RenderFill) { | 1955 if (!renderer || !renderer->RenderFill) { |
1956 return -1; | 1956 return -1; |
1957 } | 1957 } |
1958 window = SDL_GetWindowFromID(renderer->window); | 1958 window = SDL_GetWindowFromID(renderer->window); |
1959 real_rect.x = 0; | 1959 real_rect.x = 0; |
1960 real_rect.y = 0; | 1960 real_rect.y = 0; |
1961 real_rect.w = window->w; | 1961 real_rect.w = window->w; |
1962 real_rect.h = window->h; | 1962 real_rect.h = window->h; |
1963 if (rect) { | 1963 if (rect) { |
1964 if (!SDL_IntersectRect(rect, &real_rect, &real_rect)) { | 1964 if (!SDL_IntersectRect(rect, &real_rect, &real_rect)) { |
1965 return 0; | 1965 return 0; |
1966 } | 1966 } |
1967 } | 1967 } |
1968 return renderer->RenderFill(renderer, r, g, b, a, &real_rect); | 1968 return renderer->RenderFill(renderer, r, g, b, a, &real_rect); |
1969 } | 1969 } |
1970 | 1970 |
1971 int | 1971 int |
1972 SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect * srcrect, | 1972 SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect * srcrect, |
1973 const SDL_Rect * dstrect) | 1973 const SDL_Rect * dstrect) |
1974 { | 1974 { |
1975 SDL_Texture *texture = SDL_GetTextureFromID(textureID); | 1975 SDL_Texture *texture = SDL_GetTextureFromID(textureID); |
1976 SDL_Renderer *renderer; | 1976 SDL_Renderer *renderer; |
1977 SDL_Window *window; | 1977 SDL_Window *window; |
1978 SDL_Rect real_srcrect; | 1978 SDL_Rect real_srcrect; |
1979 SDL_Rect real_dstrect; | 1979 SDL_Rect real_dstrect; |
1980 | 1980 |
1981 if (!texture || texture->renderer != SDL_CurrentDisplay.current_renderer) { | 1981 if (!texture || texture->renderer != SDL_CurrentDisplay.current_renderer) { |
1982 return -1; | 1982 return -1; |
1983 } | 1983 } |
1984 renderer = SDL_CurrentDisplay.current_renderer; | 1984 renderer = SDL_CurrentDisplay.current_renderer; |
1985 if (!renderer || !renderer->RenderCopy) { | 1985 if (!renderer || !renderer->RenderCopy) { |
1986 return -1; | 1986 return -1; |
1987 } | 1987 } |
1988 window = SDL_GetWindowFromID(renderer->window); | 1988 window = SDL_GetWindowFromID(renderer->window); |
1989 if (srcrect) { | 1989 if (srcrect) { |
1990 real_srcrect = *srcrect; | 1990 real_srcrect = *srcrect; |
1991 } else { | 1991 } else { |
1992 real_srcrect.x = 0; | 1992 real_srcrect.x = 0; |
1993 real_srcrect.y = 0; | 1993 real_srcrect.y = 0; |
1994 real_srcrect.w = texture->w; | 1994 real_srcrect.w = texture->w; |
1995 real_srcrect.h = texture->h; | 1995 real_srcrect.h = texture->h; |
1996 } | 1996 } |
1997 if (dstrect) { | 1997 if (dstrect) { |
1998 real_dstrect = *dstrect; | 1998 real_dstrect = *dstrect; |
1999 } else { | 1999 } else { |
2000 real_dstrect.x = 0; | 2000 real_dstrect.x = 0; |
2001 real_dstrect.y = 0; | 2001 real_dstrect.y = 0; |
2002 real_dstrect.w = window->w; | 2002 real_dstrect.w = window->w; |
2003 real_dstrect.h = window->h; | 2003 real_dstrect.h = window->h; |
2004 } | 2004 } |
2005 | 2005 |
2006 return renderer->RenderCopy(renderer, texture, &real_srcrect, | 2006 return renderer->RenderCopy(renderer, texture, &real_srcrect, |
2007 &real_dstrect); | 2007 &real_dstrect); |
2008 } | 2008 } |
2009 | 2009 |
2010 void | 2010 void |
2011 SDL_RenderPresent(void) | 2011 SDL_RenderPresent(void) |
2012 { | 2012 { |
2013 SDL_Renderer *renderer; | 2013 SDL_Renderer *renderer; |
2014 | 2014 |
2015 if (!_this) { | 2015 if (!_this) { |
2016 SDL_UninitializedVideo(); | 2016 SDL_UninitializedVideo(); |
2017 return; | 2017 return; |
2018 } | 2018 } |
2019 renderer = SDL_CurrentDisplay.current_renderer; | 2019 renderer = SDL_CurrentDisplay.current_renderer; |
2020 if (!renderer || !renderer->RenderPresent) { | 2020 if (!renderer || !renderer->RenderPresent) { |
2021 return; | 2021 return; |
2022 } | 2022 } |
2023 renderer->RenderPresent(renderer); | 2023 renderer->RenderPresent(renderer); |
2024 } | 2024 } |
2025 | 2025 |
2026 void | 2026 void |
2027 SDL_DestroyTexture(SDL_TextureID textureID) | 2027 SDL_DestroyTexture(SDL_TextureID textureID) |
2028 { | 2028 { |
2029 int hash; | 2029 int hash; |
2030 SDL_Texture *prev, *texture; | 2030 SDL_Texture *prev, *texture; |
2031 SDL_Renderer *renderer; | 2031 SDL_Renderer *renderer; |
2032 | 2032 |
2033 if (!_this) { | 2033 if (!_this) { |
2034 SDL_UninitializedVideo(); | 2034 SDL_UninitializedVideo(); |
2035 return; | 2035 return; |
2036 } | 2036 } |
2037 /* Look up the texture in the hash table */ | 2037 /* Look up the texture in the hash table */ |
2038 hash = (textureID % SDL_arraysize(SDL_CurrentDisplay.textures)); | 2038 hash = (textureID % SDL_arraysize(SDL_CurrentDisplay.textures)); |
2039 prev = NULL; | 2039 prev = NULL; |
2040 for (texture = SDL_CurrentDisplay.textures[hash]; texture; | 2040 for (texture = SDL_CurrentDisplay.textures[hash]; texture; |
2041 prev = texture, texture = texture->next) { | 2041 prev = texture, texture = texture->next) { |
2042 if (texture->id == textureID) { | 2042 if (texture->id == textureID) { |
2043 break; | 2043 break; |
2044 } | 2044 } |
2045 } | 2045 } |
2046 if (!texture) { | 2046 if (!texture) { |
2047 return; | 2047 return; |
2048 } | 2048 } |
2049 /* Unlink the texture from the list */ | 2049 /* Unlink the texture from the list */ |
2050 if (prev) { | 2050 if (prev) { |
2051 prev->next = texture->next; | 2051 prev->next = texture->next; |
2052 } else { | 2052 } else { |
2053 SDL_CurrentDisplay.textures[hash] = texture->next; | 2053 SDL_CurrentDisplay.textures[hash] = texture->next; |
2054 } | 2054 } |
2055 | 2055 |
2056 /* Free the texture */ | 2056 /* Free the texture */ |
2057 renderer = texture->renderer; | 2057 renderer = texture->renderer; |
2058 renderer->DestroyTexture(renderer, texture); | 2058 renderer->DestroyTexture(renderer, texture); |
2059 SDL_free(texture); | 2059 SDL_free(texture); |
2060 } | 2060 } |
2061 | 2061 |
2062 void | 2062 void |
2063 SDL_DestroyRenderer(SDL_WindowID windowID) | 2063 SDL_DestroyRenderer(SDL_WindowID windowID) |
2064 { | 2064 { |
2065 SDL_Window *window = SDL_GetWindowFromID(windowID); | 2065 SDL_Window *window = SDL_GetWindowFromID(windowID); |
2066 SDL_Renderer *renderer; | 2066 SDL_Renderer *renderer; |
2067 int i; | 2067 int i; |
2068 | 2068 |
2069 if (!window) { | 2069 if (!window) { |
2070 return; | 2070 return; |
2071 } | 2071 } |
2072 renderer = window->renderer; | 2072 renderer = window->renderer; |
2073 if (!renderer) { | 2073 if (!renderer) { |
2074 return; | 2074 return; |
2075 } | 2075 } |
2076 /* Free existing textures for this renderer */ | 2076 /* Free existing textures for this renderer */ |
2077 for (i = 0; i < SDL_arraysize(SDL_CurrentDisplay.textures); ++i) { | 2077 for (i = 0; i < SDL_arraysize(SDL_CurrentDisplay.textures); ++i) { |
2078 SDL_Texture *texture; | 2078 SDL_Texture *texture; |
2079 SDL_Texture *prev = NULL; | 2079 SDL_Texture *prev = NULL; |
2080 SDL_Texture *next; | 2080 SDL_Texture *next; |
2081 for (texture = SDL_CurrentDisplay.textures[i]; texture; | 2081 for (texture = SDL_CurrentDisplay.textures[i]; texture; |
2082 texture = next) { | 2082 texture = next) { |
2083 next = texture->next; | 2083 next = texture->next; |
2084 if (texture->renderer == renderer) { | 2084 if (texture->renderer == renderer) { |
2085 if (prev) { | 2085 if (prev) { |
2086 prev->next = next; | 2086 prev->next = next; |
2087 } else { | 2087 } else { |
2088 SDL_CurrentDisplay.textures[i] = next; | 2088 SDL_CurrentDisplay.textures[i] = next; |
2089 } | 2089 } |
2090 renderer->DestroyTexture(renderer, texture); | 2090 renderer->DestroyTexture(renderer, texture); |
2091 SDL_free(texture); | 2091 SDL_free(texture); |
2092 } else { | 2092 } else { |
2093 prev = texture; | 2093 prev = texture; |
2094 } | 2094 } |
2095 } | 2095 } |
2096 } | 2096 } |
2097 | 2097 |
2098 /* Free the renderer instance */ | 2098 /* Free the renderer instance */ |
2099 renderer->DestroyRenderer(renderer); | 2099 renderer->DestroyRenderer(renderer); |
2100 | 2100 |
2101 /* Clear references */ | 2101 /* Clear references */ |
2102 window->renderer = NULL; | 2102 window->renderer = NULL; |
2103 if (SDL_CurrentDisplay.current_renderer == renderer) { | 2103 if (SDL_CurrentDisplay.current_renderer == renderer) { |
2104 SDL_CurrentDisplay.current_renderer = NULL; | 2104 SDL_CurrentDisplay.current_renderer = NULL; |
2105 } | 2105 } |
2106 } | 2106 } |
2107 | 2107 |
2108 void | 2108 void |
2109 SDL_VideoQuit(void) | 2109 SDL_VideoQuit(void) |
2110 { | 2110 { |
2111 int i, j; | 2111 int i, j; |
2112 | 2112 |
2113 if (!_this) { | 2113 if (!_this) { |
2114 return; | 2114 return; |
2115 } | 2115 } |
2116 /* Halt event processing before doing anything else */ | 2116 /* Halt event processing before doing anything else */ |
2117 SDL_StopEventLoop(); | 2117 SDL_StopEventLoop(); |
2118 | 2118 |
2119 /* Clean up the system video */ | 2119 /* Clean up the system video */ |
2120 for (i = _this->num_displays; i--;) { | 2120 for (i = _this->num_displays; i--;) { |
2121 SDL_VideoDisplay *display = &_this->displays[i]; | 2121 SDL_VideoDisplay *display = &_this->displays[i]; |
2122 for (j = display->num_windows; j--;) { | 2122 for (j = display->num_windows; j--;) { |
2123 SDL_DestroyWindow(display->windows[i].id); | 2123 SDL_DestroyWindow(display->windows[i].id); |
2124 } | 2124 } |
2125 if (display->windows) { | 2125 if (display->windows) { |
2126 SDL_free(display->windows); | 2126 SDL_free(display->windows); |
2127 display->windows = NULL; | 2127 display->windows = NULL; |
2128 } | 2128 } |
2129 display->num_windows = 0; | 2129 display->num_windows = 0; |
2130 if (display->render_drivers) { | 2130 if (display->render_drivers) { |
2131 SDL_free(display->render_drivers); | 2131 SDL_free(display->render_drivers); |
2132 display->render_drivers = NULL; | 2132 display->render_drivers = NULL; |
2133 } | 2133 } |
2134 display->num_render_drivers = 0; | 2134 display->num_render_drivers = 0; |
2135 } | 2135 } |
2136 _this->VideoQuit(_this); | 2136 _this->VideoQuit(_this); |
2137 | 2137 |
2138 for (i = _this->num_displays; i--;) { | 2138 for (i = _this->num_displays; i--;) { |
2139 SDL_VideoDisplay *display = &_this->displays[i]; | 2139 SDL_VideoDisplay *display = &_this->displays[i]; |
2140 for (j = display->num_display_modes; j--;) { | 2140 for (j = display->num_display_modes; j--;) { |
2141 if (display->display_modes[j].driverdata) { | 2141 if (display->display_modes[j].driverdata) { |
2142 SDL_free(display->display_modes[j].driverdata); | 2142 SDL_free(display->display_modes[j].driverdata); |
2143 display->display_modes[j].driverdata = NULL; | 2143 display->display_modes[j].driverdata = NULL; |
2144 } | 2144 } |
2145 } | 2145 } |
2146 if (display->display_modes) { | 2146 if (display->display_modes) { |
2147 SDL_free(display->display_modes); | 2147 SDL_free(display->display_modes); |
2148 display->display_modes = NULL; | 2148 display->display_modes = NULL; |
2149 } | 2149 } |
2150 if (display->desktop_mode.driverdata) { | 2150 if (display->desktop_mode.driverdata) { |
2151 SDL_free(display->desktop_mode.driverdata); | 2151 SDL_free(display->desktop_mode.driverdata); |
2152 display->desktop_mode.driverdata = NULL; | 2152 display->desktop_mode.driverdata = NULL; |
2153 } | 2153 } |
2154 if (display->palette) { | 2154 if (display->palette) { |
2155 SDL_FreePalette(display->palette); | 2155 SDL_FreePalette(display->palette); |
2156 display->palette = NULL; | 2156 display->palette = NULL; |
2157 } | 2157 } |
2158 if (display->gamma) { | 2158 if (display->gamma) { |
2159 SDL_free(display->gamma); | 2159 SDL_free(display->gamma); |
2160 display->gamma = NULL; | 2160 display->gamma = NULL; |
2161 } | 2161 } |
2162 if (display->driverdata) { | 2162 if (display->driverdata) { |
2163 SDL_free(display->driverdata); | 2163 SDL_free(display->driverdata); |
2164 display->driverdata = NULL; | 2164 display->driverdata = NULL; |
2165 } | 2165 } |
2166 } | 2166 } |
2167 if (_this->displays) { | 2167 if (_this->displays) { |
2168 SDL_free(_this->displays); | 2168 SDL_free(_this->displays); |
2169 _this->displays = NULL; | 2169 _this->displays = NULL; |
2170 } | 2170 } |
2171 _this->free(_this); | 2171 _this->free(_this); |
2172 _this = NULL; | 2172 _this = NULL; |
2173 } | 2173 } |
2174 | 2174 |
2175 int | 2175 int |
2176 SDL_GL_LoadLibrary(const char *path) | 2176 SDL_GL_LoadLibrary(const char *path) |
2177 { | 2177 { |
2178 int retval; | 2178 int retval; |
2179 | 2179 |
2180 if (!_this) { | 2180 if (!_this) { |
2181 SDL_UninitializedVideo(); | 2181 SDL_UninitializedVideo(); |
2182 return -1; | 2182 return -1; |
2183 } | 2183 } |
2184 if (_this->GL_LoadLibrary) { | 2184 if (_this->GL_LoadLibrary) { |
2185 retval = _this->GL_LoadLibrary(_this, path); | 2185 retval = _this->GL_LoadLibrary(_this, path); |
2186 } else { | 2186 } else { |
2187 SDL_SetError("No dynamic GL support in video driver"); | 2187 SDL_SetError("No dynamic GL support in video driver"); |
2188 retval = -1; | 2188 retval = -1; |
2189 } | 2189 } |
2190 return (retval); | 2190 return (retval); |
2191 } | 2191 } |
2192 | 2192 |
2193 void * | 2193 void * |
2194 SDL_GL_GetProcAddress(const char *proc) | 2194 SDL_GL_GetProcAddress(const char *proc) |
2195 { | 2195 { |
2196 void *func; | 2196 void *func; |
2197 | 2197 |
2198 if (!_this) { | 2198 if (!_this) { |
2199 SDL_UninitializedVideo(); | 2199 SDL_UninitializedVideo(); |
2200 return NULL; | 2200 return NULL; |
2201 } | 2201 } |
2202 func = NULL; | 2202 func = NULL; |
2203 if (_this->GL_GetProcAddress) { | 2203 if (_this->GL_GetProcAddress) { |
2204 if (_this->gl_config.driver_loaded) { | 2204 if (_this->gl_config.driver_loaded) { |
2205 func = _this->GL_GetProcAddress(_this, proc); | 2205 func = _this->GL_GetProcAddress(_this, proc); |
2206 } else { | 2206 } else { |
2207 SDL_SetError("No GL driver has been loaded"); | 2207 SDL_SetError("No GL driver has been loaded"); |
2208 } | 2208 } |
2209 } else { | 2209 } else { |
2210 SDL_SetError("No dynamic GL support in video driver"); | 2210 SDL_SetError("No dynamic GL support in video driver"); |
2211 } | 2211 } |
2212 return func; | 2212 return func; |
2213 } | 2213 } |
2214 | 2214 |
2215 SDL_bool | 2215 SDL_bool |
2216 SDL_GL_ExtensionSupported(const char *extension) | 2216 SDL_GL_ExtensionSupported(const char *extension) |
2217 { | 2217 { |
2218 #if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES | 2218 #if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES |
2219 const GLubyte *(APIENTRY * glGetStringFunc) (GLenum); | 2219 const GLubyte *(APIENTRY * glGetStringFunc) (GLenum); |
2220 const char *extensions; | 2220 const char *extensions; |
2221 const char *start; | 2221 const char *start; |
2222 const char *where, *terminator; | 2222 const char *where, *terminator; |
2223 | 2223 |
2224 /* Extension names should not have spaces. */ | 2224 /* Extension names should not have spaces. */ |
2225 where = SDL_strchr(extension, ' '); | 2225 where = SDL_strchr(extension, ' '); |
2226 if (where || *extension == '\0') { | 2226 if (where || *extension == '\0') { |
2227 return SDL_FALSE; | 2227 return SDL_FALSE; |
2228 } | 2228 } |
2229 /* See if there's an environment variable override */ | 2229 /* See if there's an environment variable override */ |
2230 start = SDL_getenv(extension); | 2230 start = SDL_getenv(extension); |
2231 if (start && *start == '0') { | 2231 if (start && *start == '0') { |
2232 return SDL_FALSE; | 2232 return SDL_FALSE; |
2233 } | 2233 } |
2234 /* Lookup the available extensions */ | 2234 /* Lookup the available extensions */ |
2235 glGetStringFunc = SDL_GL_GetProcAddress("glGetString"); | 2235 glGetStringFunc = SDL_GL_GetProcAddress("glGetString"); |
2236 if (glGetStringFunc) { | 2236 if (glGetStringFunc) { |
2237 extensions = (const char *) glGetStringFunc(GL_EXTENSIONS); | 2237 extensions = (const char *) glGetStringFunc(GL_EXTENSIONS); |
2238 } else { | 2238 } else { |
2239 extensions = NULL; | 2239 extensions = NULL; |
2240 } | 2240 } |
2241 if (!extensions) { | 2241 if (!extensions) { |
2242 return SDL_FALSE; | 2242 return SDL_FALSE; |
2243 } | 2243 } |
2244 /* | 2244 /* |
2245 * It takes a bit of care to be fool-proof about parsing the OpenGL | 2245 * It takes a bit of care to be fool-proof about parsing the OpenGL |
2246 * extensions string. Don't be fooled by sub-strings, etc. | 2246 * extensions string. Don't be fooled by sub-strings, etc. |
2247 */ | 2247 */ |
2248 | 2248 |
2249 start = extensions; | 2249 start = extensions; |
2250 | 2250 |
2251 for (;;) { | 2251 for (;;) { |
2252 where = SDL_strstr(start, extension); | 2252 where = SDL_strstr(start, extension); |
2253 if (!where) | 2253 if (!where) |
2254 break; | 2254 break; |
2255 | 2255 |
2256 terminator = where + SDL_strlen(extension); | 2256 terminator = where + SDL_strlen(extension); |
2257 if (where == start || *(where - 1) == ' ') | 2257 if (where == start || *(where - 1) == ' ') |
2258 if (*terminator == ' ' || *terminator == '\0') | 2258 if (*terminator == ' ' || *terminator == '\0') |
2259 return SDL_TRUE; | 2259 return SDL_TRUE; |
2260 | 2260 |
2261 start = terminator; | 2261 start = terminator; |
2262 } | 2262 } |
2263 return SDL_FALSE; | 2263 return SDL_FALSE; |
2264 #else | 2264 #else |
2265 return SDL_FALSE; | 2265 return SDL_FALSE; |
2266 #endif | 2266 #endif |
2267 } | 2267 } |
2268 | 2268 |
2269 int | 2269 int |
2270 SDL_GL_SetAttribute(SDL_GLattr attr, int value) | 2270 SDL_GL_SetAttribute(SDL_GLattr attr, int value) |
2271 { | 2271 { |
2272 #if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES | 2272 #if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES |
2273 int retval; | 2273 int retval; |
2274 | 2274 |
2275 if (!_this) { | 2275 if (!_this) { |
2276 SDL_UninitializedVideo(); | 2276 SDL_UninitializedVideo(); |
2277 return -1; | 2277 return -1; |
2278 } | 2278 } |
2279 retval = 0; | 2279 retval = 0; |
2280 switch (attr) { | 2280 switch (attr) { |
2281 case SDL_GL_RED_SIZE: | 2281 case SDL_GL_RED_SIZE: |
2282 _this->gl_config.red_size = value; | 2282 _this->gl_config.red_size = value; |
2283 break; | 2283 break; |
2284 case SDL_GL_GREEN_SIZE: | 2284 case SDL_GL_GREEN_SIZE: |
2285 _this->gl_config.green_size = value; | 2285 _this->gl_config.green_size = value; |
2286 break; | 2286 break; |
2287 case SDL_GL_BLUE_SIZE: | 2287 case SDL_GL_BLUE_SIZE: |
2288 _this->gl_config.blue_size = value; | 2288 _this->gl_config.blue_size = value; |
2289 break; | 2289 break; |
2290 case SDL_GL_ALPHA_SIZE: | 2290 case SDL_GL_ALPHA_SIZE: |
2291 _this->gl_config.alpha_size = value; | 2291 _this->gl_config.alpha_size = value; |
2292 break; | 2292 break; |
2293 case SDL_GL_DOUBLEBUFFER: | 2293 case SDL_GL_DOUBLEBUFFER: |
2294 _this->gl_config.double_buffer = value; | 2294 _this->gl_config.double_buffer = value; |
2295 break; | 2295 break; |
2296 case SDL_GL_BUFFER_SIZE: | 2296 case SDL_GL_BUFFER_SIZE: |
2297 _this->gl_config.buffer_size = value; | 2297 _this->gl_config.buffer_size = value; |
2298 break; | 2298 break; |
2299 case SDL_GL_DEPTH_SIZE: | 2299 case SDL_GL_DEPTH_SIZE: |
2300 _this->gl_config.depth_size = value; | 2300 _this->gl_config.depth_size = value; |
2301 break; | 2301 break; |
2302 case SDL_GL_STENCIL_SIZE: | 2302 case SDL_GL_STENCIL_SIZE: |
2303 _this->gl_config.stencil_size = value; | 2303 _this->gl_config.stencil_size = value; |
2304 break; | 2304 break; |
2305 case SDL_GL_ACCUM_RED_SIZE: | 2305 case SDL_GL_ACCUM_RED_SIZE: |
2306 _this->gl_config.accum_red_size = value; | 2306 _this->gl_config.accum_red_size = value; |
2307 break; | 2307 break; |
2308 case SDL_GL_ACCUM_GREEN_SIZE: | 2308 case SDL_GL_ACCUM_GREEN_SIZE: |
2309 _this->gl_config.accum_green_size = value; | 2309 _this->gl_config.accum_green_size = value; |
2310 break; | 2310 break; |
2311 case SDL_GL_ACCUM_BLUE_SIZE: | 2311 case SDL_GL_ACCUM_BLUE_SIZE: |
2312 _this->gl_config.accum_blue_size = value; | 2312 _this->gl_config.accum_blue_size = value; |
2313 break; | 2313 break; |
2314 case SDL_GL_ACCUM_ALPHA_SIZE: | 2314 case SDL_GL_ACCUM_ALPHA_SIZE: |
2315 _this->gl_config.accum_alpha_size = value; | 2315 _this->gl_config.accum_alpha_size = value; |
2316 break; | 2316 break; |
2317 case SDL_GL_STEREO: | 2317 case SDL_GL_STEREO: |
2318 _this->gl_config.stereo = value; | 2318 _this->gl_config.stereo = value; |
2319 break; | 2319 break; |
2320 case SDL_GL_MULTISAMPLEBUFFERS: | 2320 case SDL_GL_MULTISAMPLEBUFFERS: |
2321 _this->gl_config.multisamplebuffers = value; | 2321 _this->gl_config.multisamplebuffers = value; |
2322 break; | 2322 break; |
2323 case SDL_GL_MULTISAMPLESAMPLES: | 2323 case SDL_GL_MULTISAMPLESAMPLES: |
2324 _this->gl_config.multisamplesamples = value; | 2324 _this->gl_config.multisamplesamples = value; |
2325 break; | 2325 break; |
2326 case SDL_GL_ACCELERATED_VISUAL: | 2326 case SDL_GL_ACCELERATED_VISUAL: |
2327 _this->gl_config.accelerated = value; | 2327 _this->gl_config.accelerated = value; |
2328 break; | 2328 break; |
2329 case SDL_GL_RETAINED_BACKING: | 2329 case SDL_GL_RETAINED_BACKING: |
2330 _this->gl_config.retained_backing = value; | 2330 _this->gl_config.retained_backing = value; |
2331 break; | 2331 break; |
2332 default: | 2332 default: |
2333 SDL_SetError("Unknown OpenGL attribute"); | 2333 SDL_SetError("Unknown OpenGL attribute"); |
2334 retval = -1; | 2334 retval = -1; |
2335 break; | 2335 break; |
2336 } | 2336 } |
2337 return retval; | 2337 return retval; |
2338 #else | 2338 #else |
2339 SDL_Unsupported(); | 2339 SDL_Unsupported(); |
2340 return -1; | 2340 return -1; |
2341 #endif /* SDL_VIDEO_OPENGL */ | 2341 #endif /* SDL_VIDEO_OPENGL */ |
2342 } | 2342 } |
2343 | 2343 |
2344 int | 2344 int |
2345 SDL_GL_GetAttribute(SDL_GLattr attr, int *value) | 2345 SDL_GL_GetAttribute(SDL_GLattr attr, int *value) |
2346 { | 2346 { |
2347 #if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES | 2347 #if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES |
2348 void (APIENTRY * glGetIntegervFunc) (GLenum pname, GLint * params); | 2348 void (APIENTRY * glGetIntegervFunc) (GLenum pname, GLint * params); |
2349 GLenum attrib = 0; | 2349 GLenum attrib = 0; |
2350 | 2350 |
2351 glGetIntegervFunc = SDL_GL_GetProcAddress("glGetIntegerv"); | 2351 glGetIntegervFunc = SDL_GL_GetProcAddress("glGetIntegerv"); |
2352 if (!glGetIntegervFunc) { | 2352 if (!glGetIntegervFunc) { |
2353 return -1; | 2353 return -1; |
2354 } | 2354 } |
2355 switch (attr) { | 2355 switch (attr) { |
2356 case SDL_GL_RETAINED_BACKING: | 2356 case SDL_GL_RETAINED_BACKING: |
2357 *value = _this->gl_config.retained_backing; | 2357 *value = _this->gl_config.retained_backing; |
2358 return 0; | 2358 return 0; |
2359 case SDL_GL_RED_SIZE: | 2359 case SDL_GL_RED_SIZE: |
2360 attrib = GL_RED_BITS; | 2360 attrib = GL_RED_BITS; |
2361 break; | 2361 break; |
2362 case SDL_GL_BLUE_SIZE: | 2362 case SDL_GL_BLUE_SIZE: |
2363 attrib = GL_BLUE_BITS; | 2363 attrib = GL_BLUE_BITS; |
2364 break; | 2364 break; |
2365 case SDL_GL_GREEN_SIZE: | 2365 case SDL_GL_GREEN_SIZE: |
2366 attrib = GL_GREEN_BITS; | 2366 attrib = GL_GREEN_BITS; |
2367 break; | 2367 break; |
2368 case SDL_GL_ALPHA_SIZE: | 2368 case SDL_GL_ALPHA_SIZE: |
2369 attrib = GL_ALPHA_BITS; | 2369 attrib = GL_ALPHA_BITS; |
2370 break; | 2370 break; |
2371 case SDL_GL_DOUBLEBUFFER: | 2371 case SDL_GL_DOUBLEBUFFER: |
2372 #ifndef SDL_VIDEO_OPENGL_ES | 2372 #ifndef SDL_VIDEO_OPENGL_ES |
2373 attrib = GL_DOUBLEBUFFER; | 2373 attrib = GL_DOUBLEBUFFER; |
2374 break; | 2374 break; |
2375 #else | 2375 #else |
2376 /* | 2376 /* |
2377 * I believe double buffering is the only option in OpenGL ES | 2377 * I believe double buffering is the only option in OpenGL ES |
2378 * -- in any case, GL_DOUBLEBUFFER doesn't exist | 2378 * -- in any case, GL_DOUBLEBUFFER doesn't exist |
2379 */ | 2379 */ |
2380 *value = 1; | 2380 *value = 1; |
2381 return 0; | 2381 return 0; |
2382 #endif | 2382 #endif |
2383 case SDL_GL_DEPTH_SIZE: | 2383 case SDL_GL_DEPTH_SIZE: |
2384 attrib = GL_DEPTH_BITS; | 2384 attrib = GL_DEPTH_BITS; |
2385 break; | 2385 break; |
2386 case SDL_GL_STENCIL_SIZE: | 2386 case SDL_GL_STENCIL_SIZE: |
2387 attrib = GL_STENCIL_BITS; | 2387 attrib = GL_STENCIL_BITS; |
2388 break; | 2388 break; |
2389 #ifndef SDL_VIDEO_OPENGL_ES | 2389 #ifndef SDL_VIDEO_OPENGL_ES |
2390 case SDL_GL_ACCUM_RED_SIZE: | 2390 case SDL_GL_ACCUM_RED_SIZE: |
2391 attrib = GL_ACCUM_RED_BITS; | 2391 attrib = GL_ACCUM_RED_BITS; |
2392 break; | 2392 break; |
2393 case SDL_GL_ACCUM_GREEN_SIZE: | 2393 case SDL_GL_ACCUM_GREEN_SIZE: |
2394 attrib = GL_ACCUM_GREEN_BITS; | 2394 attrib = GL_ACCUM_GREEN_BITS; |
2395 break; | 2395 break; |
2396 case SDL_GL_ACCUM_BLUE_SIZE: | 2396 case SDL_GL_ACCUM_BLUE_SIZE: |
2397 attrib = GL_ACCUM_BLUE_BITS; | 2397 attrib = GL_ACCUM_BLUE_BITS; |
2398 break; | 2398 break; |
2399 case SDL_GL_ACCUM_ALPHA_SIZE: | 2399 case SDL_GL_ACCUM_ALPHA_SIZE: |
2400 attrib = GL_ACCUM_ALPHA_BITS; | 2400 attrib = GL_ACCUM_ALPHA_BITS; |
2401 break; | 2401 break; |
2402 case SDL_GL_STEREO: | 2402 case SDL_GL_STEREO: |
2403 attrib = GL_STEREO; | 2403 attrib = GL_STEREO; |
2404 break; | 2404 break; |
2405 #else | 2405 #else |
2406 case SDL_GL_ACCUM_RED_SIZE: | 2406 case SDL_GL_ACCUM_RED_SIZE: |
2407 case SDL_GL_ACCUM_GREEN_SIZE: | 2407 case SDL_GL_ACCUM_GREEN_SIZE: |
2408 case SDL_GL_ACCUM_BLUE_SIZE: | 2408 case SDL_GL_ACCUM_BLUE_SIZE: |
2409 case SDL_GL_ACCUM_ALPHA_SIZE: | 2409 case SDL_GL_ACCUM_ALPHA_SIZE: |
2410 case SDL_GL_STEREO: | 2410 case SDL_GL_STEREO: |
2411 /* none of these are supported in OpenGL ES */ | 2411 /* none of these are supported in OpenGL ES */ |
2412 *value = 0; | 2412 *value = 0; |
2413 return 0; | 2413 return 0; |
2414 #endif | 2414 #endif |
2415 case SDL_GL_MULTISAMPLEBUFFERS: | 2415 case SDL_GL_MULTISAMPLEBUFFERS: |
2416 #ifndef SDL_VIDEO_OPENGL_ES | 2416 #ifndef SDL_VIDEO_OPENGL_ES |
2417 attrib = GL_SAMPLE_BUFFERS_ARB; | 2417 attrib = GL_SAMPLE_BUFFERS_ARB; |
2418 #else | 2418 #else |
2419 attrib = GL_SAMPLE_BUFFERS; | 2419 attrib = GL_SAMPLE_BUFFERS; |
2420 #endif | 2420 #endif |
2421 break; | 2421 break; |
2422 case SDL_GL_MULTISAMPLESAMPLES: | 2422 case SDL_GL_MULTISAMPLESAMPLES: |
2423 #ifndef SDL_VIDEO_OPENGL_ES | 2423 #ifndef SDL_VIDEO_OPENGL_ES |
2424 attrib = GL_SAMPLES_ARB; | 2424 attrib = GL_SAMPLES_ARB; |
2425 #else | 2425 #else |
2426 attrib = GL_SAMPLES; | 2426 attrib = GL_SAMPLES; |
2427 #endif | 2427 #endif |
2428 break; | 2428 break; |
2429 case SDL_GL_BUFFER_SIZE: | 2429 case SDL_GL_BUFFER_SIZE: |
2430 { | 2430 { |
2431 GLint bits = 0; | 2431 GLint bits = 0; |
2432 GLint component; | 2432 GLint component; |
2433 | 2433 |
2434 /* | 2434 /* |
2435 * there doesn't seem to be a single flag in OpenGL | 2435 * there doesn't seem to be a single flag in OpenGL |
2436 * for this! | 2436 * for this! |
2437 */ | 2437 */ |
2438 glGetIntegervFunc(GL_RED_BITS, &component); | 2438 glGetIntegervFunc(GL_RED_BITS, &component); |
2439 bits += component; | 2439 bits += component; |
2440 glGetIntegervFunc(GL_GREEN_BITS, &component); | 2440 glGetIntegervFunc(GL_GREEN_BITS, &component); |
2441 bits += component; | 2441 bits += component; |
2442 glGetIntegervFunc(GL_BLUE_BITS, &component); | 2442 glGetIntegervFunc(GL_BLUE_BITS, &component); |
2443 bits += component; | 2443 bits += component; |
2444 glGetIntegervFunc(GL_ALPHA_BITS, &component); | 2444 glGetIntegervFunc(GL_ALPHA_BITS, &component); |
2445 bits += component; | 2445 bits += component; |
2446 | 2446 |
2447 *value = bits; | 2447 *value = bits; |
2448 return 0; | 2448 return 0; |
2449 } | 2449 } |
2450 case SDL_GL_ACCELERATED_VISUAL: | 2450 case SDL_GL_ACCELERATED_VISUAL: |
2451 { | 2451 { |
2452 /* FIXME: How do we get this information? */ | 2452 /* FIXME: How do we get this information? */ |
2453 *value = (_this->gl_config.accelerated != 0); | 2453 *value = (_this->gl_config.accelerated != 0); |
2454 return 0; | 2454 return 0; |
2455 } | 2455 } |
2456 default: | 2456 default: |
2457 SDL_SetError("Unknown OpenGL attribute"); | 2457 SDL_SetError("Unknown OpenGL attribute"); |
2458 return -1; | 2458 return -1; |
2459 } | 2459 } |
2460 | 2460 |
2461 glGetIntegervFunc(attrib, (GLint *) value); | 2461 glGetIntegervFunc(attrib, (GLint *) value); |
2462 return 0; | 2462 return 0; |
2463 #else | 2463 #else |
2464 SDL_Unsupported(); | 2464 SDL_Unsupported(); |
2465 return -1; | 2465 return -1; |
2466 #endif /* SDL_VIDEO_OPENGL */ | 2466 #endif /* SDL_VIDEO_OPENGL */ |
2467 } | 2467 } |
2468 | 2468 |
2469 SDL_GLContext | 2469 SDL_GLContext |
2470 SDL_GL_CreateContext(SDL_WindowID windowID) | 2470 SDL_GL_CreateContext(SDL_WindowID windowID) |
2471 { | 2471 { |
2472 SDL_Window *window = SDL_GetWindowFromID(windowID); | 2472 SDL_Window *window = SDL_GetWindowFromID(windowID); |
2473 | 2473 |
2474 if (!window) { | 2474 if (!window) { |
2475 return NULL; | 2475 return NULL; |
2476 } | 2476 } |
2477 if (!(window->flags & SDL_WINDOW_OPENGL)) { | 2477 if (!(window->flags & SDL_WINDOW_OPENGL)) { |
2478 SDL_SetError("The specified window isn't an OpenGL window"); | 2478 SDL_SetError("The specified window isn't an OpenGL window"); |
2479 return NULL; | 2479 return NULL; |
2480 } | 2480 } |
2481 return _this->GL_CreateContext(_this, window); | 2481 return _this->GL_CreateContext(_this, window); |
2482 } | 2482 } |
2483 | 2483 |
2484 int | 2484 int |
2485 SDL_GL_MakeCurrent(SDL_WindowID windowID, SDL_GLContext context) | 2485 SDL_GL_MakeCurrent(SDL_WindowID windowID, SDL_GLContext context) |
2486 { | 2486 { |
2487 SDL_Window *window = SDL_GetWindowFromID(windowID); | 2487 SDL_Window *window = SDL_GetWindowFromID(windowID); |
2488 | 2488 |
2489 if (window && !(window->flags & SDL_WINDOW_OPENGL)) { | 2489 if (window && !(window->flags & SDL_WINDOW_OPENGL)) { |
2490 SDL_SetError("The specified window isn't an OpenGL window"); | 2490 SDL_SetError("The specified window isn't an OpenGL window"); |
2491 return -1; | 2491 return -1; |
2492 } | 2492 } |
2493 if (!context) { | 2493 if (!context) { |
2494 window = NULL; | 2494 window = NULL; |
2495 } | 2495 } |
2496 return _this->GL_MakeCurrent(_this, window, context); | 2496 return _this->GL_MakeCurrent(_this, window, context); |
2497 } | 2497 } |
2498 | 2498 |
2499 int | 2499 int |
2500 SDL_GL_SetSwapInterval(int interval) | 2500 SDL_GL_SetSwapInterval(int interval) |
2501 { | 2501 { |
2502 if (!_this) { | 2502 if (!_this) { |
2503 SDL_UninitializedVideo(); | 2503 SDL_UninitializedVideo(); |
2504 return -1; | 2504 return -1; |
2505 } | 2505 } |
2506 if (_this->GL_SetSwapInterval) { | 2506 if (_this->GL_SetSwapInterval) { |
2507 return _this->GL_SetSwapInterval(_this, interval); | 2507 return _this->GL_SetSwapInterval(_this, interval); |
2508 } else { | 2508 } else { |
2509 SDL_SetError("Setting the swap interval is not supported"); | 2509 SDL_SetError("Setting the swap interval is not supported"); |
2510 return -1; | 2510 return -1; |
2511 } | 2511 } |
2512 } | 2512 } |
2513 | 2513 |
2514 int | 2514 int |
2515 SDL_GL_GetSwapInterval(void) | 2515 SDL_GL_GetSwapInterval(void) |
2516 { | 2516 { |
2517 if (!_this) { | 2517 if (!_this) { |
2518 SDL_UninitializedVideo(); | 2518 SDL_UninitializedVideo(); |
2519 return -1; | 2519 return -1; |
2520 } | 2520 } |
2521 if (_this->GL_GetSwapInterval) { | 2521 if (_this->GL_GetSwapInterval) { |
2522 return _this->GL_GetSwapInterval(_this); | 2522 return _this->GL_GetSwapInterval(_this); |
2523 } else { | 2523 } else { |
2524 SDL_SetError("Getting the swap interval is not supported"); | 2524 SDL_SetError("Getting the swap interval is not supported"); |
2525 return -1; | 2525 return -1; |
2526 } | 2526 } |
2527 } | 2527 } |
2528 | 2528 |
2529 void | 2529 void |
2530 SDL_GL_SwapWindow(SDL_WindowID windowID) | 2530 SDL_GL_SwapWindow(SDL_WindowID windowID) |
2531 { | 2531 { |
2532 SDL_Window *window = SDL_GetWindowFromID(windowID); | 2532 SDL_Window *window = SDL_GetWindowFromID(windowID); |
2533 | 2533 |
2534 if (!window) { | 2534 if (!window) { |
2535 return; | 2535 return; |
2536 } | 2536 } |
2537 if (!(window->flags & SDL_WINDOW_OPENGL)) { | 2537 if (!(window->flags & SDL_WINDOW_OPENGL)) { |
2538 SDL_SetError("The specified window isn't an OpenGL window"); | 2538 SDL_SetError("The specified window isn't an OpenGL window"); |
2539 return; | 2539 return; |
2540 } | 2540 } |
2541 _this->GL_SwapWindow(_this, window); | 2541 _this->GL_SwapWindow(_this, window); |
2542 } | 2542 } |
2543 | 2543 |
2544 void | 2544 void |
2545 SDL_GL_DeleteContext(SDL_GLContext context) | 2545 SDL_GL_DeleteContext(SDL_GLContext context) |
2546 { | 2546 { |
2547 if (!_this || !context) { | 2547 if (!_this || !context) { |
2548 return; | 2548 return; |
2549 } | 2549 } |
2550 _this->GL_MakeCurrent(_this, NULL, NULL); | 2550 _this->GL_MakeCurrent(_this, NULL, NULL); |
2551 _this->GL_DeleteContext(_this, context); | 2551 _this->GL_DeleteContext(_this, context); |
2552 } | 2552 } |
2553 | 2553 |
2554 #if 0 // FIXME | 2554 #if 0 // FIXME |
2555 /* | 2555 /* |
2556 * Utility function used by SDL_WM_SetIcon(); flags & 1 for color key, flags | 2556 * Utility function used by SDL_WM_SetIcon(); flags & 1 for color key, flags |
2557 * & 2 for alpha channel. | 2557 * & 2 for alpha channel. |
2558 */ | 2558 */ |
2559 static void | 2559 static void |
2560 CreateMaskFromColorKeyOrAlpha(SDL_Surface * icon, Uint8 * mask, int flags) | 2560 CreateMaskFromColorKeyOrAlpha(SDL_Surface * icon, Uint8 * mask, int flags) |
2561 { | 2561 { |
2562 int x, y; | 2562 int x, y; |
2563 Uint32 colorkey; | 2563 Uint32 colorkey; |
2564 #define SET_MASKBIT(icon, x, y, mask) \ | 2564 #define SET_MASKBIT(icon, x, y, mask) \ |
2565 mask[(y*((icon->w+7)/8))+(x/8)] &= ~(0x01<<(7-(x%8))) | 2565 mask[(y*((icon->w+7)/8))+(x/8)] &= ~(0x01<<(7-(x%8))) |
2566 | 2566 |
2567 colorkey = icon->format->colorkey; | 2567 colorkey = icon->format->colorkey; |
2568 switch (icon->format->BytesPerPixel) { | 2568 switch (icon->format->BytesPerPixel) { |
2569 case 1: | 2569 case 1: |
2570 { | 2570 { |
2571 Uint8 *pixels; | 2571 Uint8 *pixels; |
2572 for (y = 0; y < icon->h; ++y) { | 2572 for (y = 0; y < icon->h; ++y) { |
2573 pixels = (Uint8 *) icon->pixels + y * icon->pitch; | 2573 pixels = (Uint8 *) icon->pixels + y * icon->pitch; |
2574 for (x = 0; x < icon->w; ++x) { | 2574 for (x = 0; x < icon->w; ++x) { |
2575 if (*pixels++ == colorkey) { | 2575 if (*pixels++ == colorkey) { |
2576 SET_MASKBIT(icon, x, y, mask); | 2576 SET_MASKBIT(icon, x, y, mask); |
2577 } | 2577 } |
2578 } | 2578 } |
2579 } | 2579 } |
2580 } | 2580 } |
2581 break; | 2581 break; |
2582 | 2582 |
2583 case 2: | 2583 case 2: |
2584 { | 2584 { |
2585 Uint16 *pixels; | 2585 Uint16 *pixels; |
2586 for (y = 0; y < icon->h; ++y) { | 2586 for (y = 0; y < icon->h; ++y) { |
2587 pixels = (Uint16 *) icon->pixels + y * icon->pitch / 2; | 2587 pixels = (Uint16 *) icon->pixels + y * icon->pitch / 2; |
2588 for (x = 0; x < icon->w; ++x) { | 2588 for (x = 0; x < icon->w; ++x) { |
2589 if ((flags & 1) && *pixels == colorkey) { | 2589 if ((flags & 1) && *pixels == colorkey) { |
2590 SET_MASKBIT(icon, x, y, mask); | 2590 SET_MASKBIT(icon, x, y, mask); |
2591 } else if ((flags & 2) | 2591 } else if ((flags & 2) |
2592 && (*pixels & icon->format->Amask) == 0) { | 2592 && (*pixels & icon->format->Amask) == 0) { |
2593 SET_MASKBIT(icon, x, y, mask); | 2593 SET_MASKBIT(icon, x, y, mask); |
2594 } | 2594 } |
2595 pixels++; | 2595 pixels++; |
2596 } | 2596 } |
2597 } | 2597 } |
2598 } | 2598 } |
2599 break; | 2599 break; |
2600 | 2600 |
2601 case 4: | 2601 case 4: |
2602 { | 2602 { |
2603 Uint32 *pixels; | 2603 Uint32 *pixels; |
2604 for (y = 0; y < icon->h; ++y) { | 2604 for (y = 0; y < icon->h; ++y) { |
2605 pixels = (Uint32 *) icon->pixels + y * icon->pitch / 4; | 2605 pixels = (Uint32 *) icon->pixels + y * icon->pitch / 4; |
2606 for (x = 0; x < icon->w; ++x) { | 2606 for (x = 0; x < icon->w; ++x) { |
2607 if ((flags & 1) && *pixels == colorkey) { | 2607 if ((flags & 1) && *pixels == colorkey) { |
2608 SET_MASKBIT(icon, x, y, mask); | 2608 SET_MASKBIT(icon, x, y, mask); |
2609 } else if ((flags & 2) | 2609 } else if ((flags & 2) |
2610 && (*pixels & icon->format->Amask) == 0) { | 2610 && (*pixels & icon->format->Amask) == 0) { |
2611 SET_MASKBIT(icon, x, y, mask); | 2611 SET_MASKBIT(icon, x, y, mask); |
2612 } | 2612 } |
2613 pixels++; | 2613 pixels++; |
2614 } | 2614 } |
2615 } | 2615 } |
2616 } | 2616 } |
2617 break; | 2617 break; |
2618 } | 2618 } |
2619 } | 2619 } |
2620 | 2620 |
2621 /* | 2621 /* |
2622 * Sets the window manager icon for the display window. | 2622 * Sets the window manager icon for the display window. |
2623 */ | 2623 */ |
2624 void | 2624 void |
2625 SDL_WM_SetIcon(SDL_Surface * icon, Uint8 * mask) | 2625 SDL_WM_SetIcon(SDL_Surface * icon, Uint8 * mask) |
2626 { | 2626 { |
2627 if (icon && _this->SetIcon) { | 2627 if (icon && _this->SetIcon) { |
2628 /* Generate a mask if necessary, and create the icon! */ | 2628 /* Generate a mask if necessary, and create the icon! */ |
2629 if (mask == NULL) { | 2629 if (mask == NULL) { |
2630 int mask_len = icon->h * (icon->w + 7) / 8; | 2630 int mask_len = icon->h * (icon->w + 7) / 8; |
2631 int flags = 0; | 2631 int flags = 0; |
2632 mask = (Uint8 *) SDL_malloc(mask_len); | 2632 mask = (Uint8 *) SDL_malloc(mask_len); |
2633 if (mask == NULL) { | 2633 if (mask == NULL) { |
2634 return; | 2634 return; |
2635 } | 2635 } |
2636 SDL_memset(mask, ~0, mask_len); | 2636 SDL_memset(mask, ~0, mask_len); |
2637 if (icon->flags & SDL_SRCCOLORKEY) | 2637 if (icon->flags & SDL_SRCCOLORKEY) |
2638 flags |= 1; | 2638 flags |= 1; |
2639 if (icon->flags & SDL_SRCALPHA) | 2639 if (icon->flags & SDL_SRCALPHA) |
2640 flags |= 2; | 2640 flags |= 2; |
2641 if (flags) { | 2641 if (flags) { |
2642 CreateMaskFromColorKeyOrAlpha(icon, mask, flags); | 2642 CreateMaskFromColorKeyOrAlpha(icon, mask, flags); |
2643 } | 2643 } |
2644 _this->SetIcon(_this, icon, mask); | 2644 _this->SetIcon(_this, icon, mask); |
2645 SDL_free(mask); | 2645 SDL_free(mask); |
2646 } else { | 2646 } else { |
2647 _this->SetIcon(_this, icon, mask); | 2647 _this->SetIcon(_this, icon, mask); |
2648 } | 2648 } |
2649 } | 2649 } |
2650 } | 2650 } |
2651 #endif | 2651 #endif |
2652 | 2652 |
2653 SDL_bool | 2653 SDL_bool |
2654 SDL_GetWindowWMInfo(SDL_WindowID windowID, struct SDL_SysWMinfo * info) | 2654 SDL_GetWindowWMInfo(SDL_WindowID windowID, struct SDL_SysWMinfo *info) |
2655 { | 2655 { |
2656 SDL_Window *window = SDL_GetWindowFromID(windowID); | 2656 SDL_Window *window = SDL_GetWindowFromID(windowID); |
2657 | 2657 |
2658 if (!window || !_this->GetWindowWMInfo) { | 2658 if (!window || !_this->GetWindowWMInfo) { |
2659 return SDL_FALSE; | 2659 return SDL_FALSE; |
2660 } | 2660 } |
2661 return (_this->GetWindowWMInfo(_this, window, info)); | 2661 return (_this->GetWindowWMInfo(_this, window, info)); |
2662 } | 2662 } |
2663 | 2663 |
2664 /* vi: set ts=4 sw=4 expandtab: */ | 2664 /* vi: set ts=4 sw=4 expandtab: */ |