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(&current_mode); 594 SDL_GetCurrentDisplayMode(&current_mode);
595 if (SDL_memcmp(&display_mode, &current_mode, sizeof(display_mode)) == 0) { 595 if (SDL_memcmp(&display_mode, &current_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: */