comparison test/nds-test-progs/sprite2/source/common.c @ 2735:204be4fc2726

Final merge of Google Summer of Code 2008 work... Port SDL 1.3 to the Nintendo DS by Darren Alton, mentored by Sam Lantinga
author Sam Lantinga <slouken@libsdl.org>
date Wed, 27 Aug 2008 15:10:03 +0000
parents
children 9dde605c7540
comparison
equal deleted inserted replaced
2734:dd25eabe441c 2735:204be4fc2726
1
2 /* A simple test program framework */
3
4 #include <stdio.h>
5
6 #include "common.h"
7
8 #define VIDEO_USAGE \
9 "[--video driver] [--renderer driver] [--info all|video|modes|render|event] [--display %d] [--fullscreen | --windows N] [--title title] [--center | --position X,Y] [--geometry WxH] [--depth N] [--refresh R] [--vsync] [--noframe] [--resize] [--minimize] [--maximize] [--grab]"
10
11 #define AUDIO_USAGE \
12 "[--rate N] [--format U8|S8|U16|U16LE|U16BE|S16|S16LE|S16BE] [--channels N] [--samples N]"
13
14 CommonState *
15 CommonCreateState(char **argv, Uint32 flags)
16 {
17 CommonState *state = SDL_calloc(1, sizeof(*state));
18 if (!state) {
19 SDL_OutOfMemory();
20 return NULL;
21 }
22
23 /* Initialize some defaults */
24 state->argv = argv;
25 state->flags = flags;
26 state->window_title = argv[0];
27 state->window_flags = SDL_WINDOW_SHOWN;
28 state->window_x = SDL_WINDOWPOS_UNDEFINED;
29 state->window_y = SDL_WINDOWPOS_UNDEFINED;
30 state->window_w = 256;
31 state->window_h = 192;
32 state->num_windows = 1;
33 state->audiospec.freq = 22050;
34 state->audiospec.format = AUDIO_S16;
35 state->audiospec.channels = 2;
36 state->audiospec.samples = 2048;
37 return state;
38 }
39
40 int
41 CommonArg(CommonState * state, int index)
42 {
43 char **argv = state->argv;
44
45 if (SDL_strcasecmp(argv[index], "--video") == 0) {
46 ++index;
47 if (!argv[index]) {
48 return -1;
49 }
50 state->videodriver = argv[index];
51 return 2;
52 }
53 if (SDL_strcasecmp(argv[index], "--renderer") == 0) {
54 ++index;
55 if (!argv[index]) {
56 return -1;
57 }
58 state->renderdriver = argv[index];
59 return 2;
60 }
61 if (SDL_strcasecmp(argv[index], "--info") == 0) {
62 ++index;
63 if (!argv[index]) {
64 return -1;
65 }
66 if (SDL_strcasecmp(argv[index], "all") == 0) {
67 state->verbose |=
68 (VERBOSE_VIDEO | VERBOSE_MODES | VERBOSE_RENDER |
69 VERBOSE_EVENT);
70 return 2;
71 }
72 if (SDL_strcasecmp(argv[index], "video") == 0) {
73 state->verbose |= VERBOSE_VIDEO;
74 return 2;
75 }
76 if (SDL_strcasecmp(argv[index], "modes") == 0) {
77 state->verbose |= VERBOSE_MODES;
78 return 2;
79 }
80 if (SDL_strcasecmp(argv[index], "render") == 0) {
81 state->verbose |= VERBOSE_RENDER;
82 return 2;
83 }
84 if (SDL_strcasecmp(argv[index], "event") == 0) {
85 state->verbose |= VERBOSE_EVENT;
86 return 2;
87 }
88 return -1;
89 }
90 if (SDL_strcasecmp(argv[index], "--display") == 0) {
91 ++index;
92 if (!argv[index]) {
93 return -1;
94 }
95 state->display = SDL_atoi(argv[index]);
96 return 2;
97 }
98 if (SDL_strcasecmp(argv[index], "--fullscreen") == 0) {
99 state->window_flags |= SDL_WINDOW_FULLSCREEN;
100 state->num_windows = 1;
101 return 1;
102 }
103 if (SDL_strcasecmp(argv[index], "--windows") == 0) {
104 ++index;
105 if (!argv[index] || !SDL_isdigit(*argv[index])) {
106 return -1;
107 }
108 if (!(state->window_flags & SDL_WINDOW_FULLSCREEN)) {
109 state->num_windows = SDL_atoi(argv[index]);
110 }
111 return 2;
112 }
113 if (SDL_strcasecmp(argv[index], "--title") == 0) {
114 ++index;
115 if (!argv[index]) {
116 return -1;
117 }
118 state->window_title = argv[index];
119 return 2;
120 }
121 if (SDL_strcasecmp(argv[index], "--center") == 0) {
122 state->window_x = SDL_WINDOWPOS_CENTERED;
123 state->window_y = SDL_WINDOWPOS_CENTERED;
124 return 1;
125 }
126 if (SDL_strcasecmp(argv[index], "--position") == 0) {
127 char *x, *y;
128 ++index;
129 if (!argv[index]) {
130 return -1;
131 }
132 x = argv[index];
133 y = argv[index];
134 while (*y && *y != ',') {
135 ++y;
136 }
137 if (!*y) {
138 return -1;
139 }
140 *y++ = '\0';
141 state->window_x = SDL_atoi(x);
142 state->window_y = SDL_atoi(y);
143 return 2;
144 }
145 if (SDL_strcasecmp(argv[index], "--geometry") == 0) {
146 char *w, *h;
147 ++index;
148 if (!argv[index]) {
149 return -1;
150 }
151 w = argv[index];
152 h = argv[index];
153 while (*h && *h != 'x') {
154 ++h;
155 }
156 if (!*h) {
157 return -1;
158 }
159 *h++ = '\0';
160 state->window_w = SDL_atoi(w);
161 state->window_h = SDL_atoi(h);
162 return 2;
163 }
164 if (SDL_strcasecmp(argv[index], "--depth") == 0) {
165 ++index;
166 if (!argv[index]) {
167 return -1;
168 }
169 state->depth = SDL_atoi(argv[index]);
170 return 2;
171 }
172 if (SDL_strcasecmp(argv[index], "--refresh") == 0) {
173 ++index;
174 if (!argv[index]) {
175 return -1;
176 }
177 state->refresh_rate = SDL_atoi(argv[index]);
178 return 2;
179 }
180 if (SDL_strcasecmp(argv[index], "--vsync") == 0) {
181 state->render_flags |= SDL_RENDERER_PRESENTVSYNC;
182 return 1;
183 }
184 if (SDL_strcasecmp(argv[index], "--noframe") == 0) {
185 state->window_flags |= SDL_WINDOW_BORDERLESS;
186 return 1;
187 }
188 if (SDL_strcasecmp(argv[index], "--resize") == 0) {
189 state->window_flags |= SDL_WINDOW_RESIZABLE;
190 return 1;
191 }
192 if (SDL_strcasecmp(argv[index], "--minimize") == 0) {
193 state->window_flags |= SDL_WINDOW_MINIMIZED;
194 return 1;
195 }
196 if (SDL_strcasecmp(argv[index], "--maximize") == 0) {
197 state->window_flags |= SDL_WINDOW_MAXIMIZED;
198 return 1;
199 }
200 if (SDL_strcasecmp(argv[index], "--grab") == 0) {
201 state->window_flags |= SDL_WINDOW_INPUT_GRABBED;
202 return 1;
203 }
204 if (SDL_strcasecmp(argv[index], "--rate") == 0) {
205 ++index;
206 if (!argv[index]) {
207 return -1;
208 }
209 state->audiospec.freq = SDL_atoi(argv[index]);
210 return 2;
211 }
212 if (SDL_strcasecmp(argv[index], "--format") == 0) {
213 ++index;
214 if (!argv[index]) {
215 return -1;
216 }
217 if (SDL_strcasecmp(argv[index], "U8") == 0) {
218 state->audiospec.format = AUDIO_U8;
219 return 2;
220 }
221 if (SDL_strcasecmp(argv[index], "S8") == 0) {
222 state->audiospec.format = AUDIO_S8;
223 return 2;
224 }
225 if (SDL_strcasecmp(argv[index], "U16") == 0) {
226 state->audiospec.format = AUDIO_U16;
227 return 2;
228 }
229 if (SDL_strcasecmp(argv[index], "U16LE") == 0) {
230 state->audiospec.format = AUDIO_U16LSB;
231 return 2;
232 }
233 if (SDL_strcasecmp(argv[index], "U16BE") == 0) {
234 state->audiospec.format = AUDIO_U16MSB;
235 return 2;
236 }
237 if (SDL_strcasecmp(argv[index], "S16") == 0) {
238 state->audiospec.format = AUDIO_S16;
239 return 2;
240 }
241 if (SDL_strcasecmp(argv[index], "S16LE") == 0) {
242 state->audiospec.format = AUDIO_S16LSB;
243 return 2;
244 }
245 if (SDL_strcasecmp(argv[index], "S16BE") == 0) {
246 state->audiospec.format = AUDIO_S16MSB;
247 return 2;
248 }
249 return -1;
250 }
251 if (SDL_strcasecmp(argv[index], "--channels") == 0) {
252 ++index;
253 if (!argv[index]) {
254 return -1;
255 }
256 state->audiospec.channels = (Uint8) SDL_atoi(argv[index]);
257 return 2;
258 }
259 if (SDL_strcasecmp(argv[index], "--samples") == 0) {
260 ++index;
261 if (!argv[index]) {
262 return -1;
263 }
264 state->audiospec.samples = (Uint16) SDL_atoi(argv[index]);
265 return 2;
266 }
267 if ((SDL_strcasecmp(argv[index], "-h") == 0)
268 || (SDL_strcasecmp(argv[index], "--help") == 0)) {
269 /* Print the usage message */
270 return -1;
271 }
272 return 0;
273 }
274
275 const char *
276 CommonUsage(CommonState * state)
277 {
278 switch (state->flags & (SDL_INIT_VIDEO | SDL_INIT_AUDIO)) {
279 case SDL_INIT_VIDEO:
280 return VIDEO_USAGE;
281 case SDL_INIT_AUDIO:
282 return AUDIO_USAGE;
283 case (SDL_INIT_VIDEO | SDL_INIT_AUDIO):
284 return VIDEO_USAGE " " AUDIO_USAGE;
285 default:
286 return "";
287 }
288 }
289
290 static void
291 PrintRendererFlag(Uint32 flag)
292 {
293 switch (flag) {
294 case SDL_RENDERER_SINGLEBUFFER:
295 fprintf(stderr, "SingleBuffer");
296 break;
297 case SDL_RENDERER_PRESENTCOPY:
298 fprintf(stderr, "PresentCopy");
299 break;
300 case SDL_RENDERER_PRESENTFLIP2:
301 fprintf(stderr, "PresentFlip2");
302 break;
303 case SDL_RENDERER_PRESENTFLIP3:
304 fprintf(stderr, "PresentFlip3");
305 break;
306 case SDL_RENDERER_PRESENTDISCARD:
307 fprintf(stderr, "PresentDiscard");
308 break;
309 case SDL_RENDERER_PRESENTVSYNC:
310 fprintf(stderr, "PresentVSync");
311 break;
312 case SDL_RENDERER_ACCELERATED:
313 fprintf(stderr, "Accelerated");
314 break;
315 default:
316 fprintf(stderr, "0x%8.8x", flag);
317 break;
318 }
319 }
320
321 static void
322 PrintBlendMode(Uint32 flag)
323 {
324 switch (flag) {
325 case SDL_TEXTUREBLENDMODE_NONE:
326 fprintf(stderr, "None");
327 break;
328 case SDL_TEXTUREBLENDMODE_MASK:
329 fprintf(stderr, "Mask");
330 break;
331 case SDL_TEXTUREBLENDMODE_BLEND:
332 fprintf(stderr, "Blend");
333 break;
334 case SDL_TEXTUREBLENDMODE_ADD:
335 fprintf(stderr, "Add");
336 break;
337 case SDL_TEXTUREBLENDMODE_MOD:
338 fprintf(stderr, "Mod");
339 break;
340 default:
341 fprintf(stderr, "0x%8.8x", flag);
342 break;
343 }
344 }
345
346 static void
347 PrintScaleMode(Uint32 flag)
348 {
349 switch (flag) {
350 case SDL_TEXTURESCALEMODE_NONE:
351 fprintf(stderr, "None");
352 break;
353 case SDL_TEXTURESCALEMODE_FAST:
354 fprintf(stderr, "Fast");
355 break;
356 case SDL_TEXTURESCALEMODE_SLOW:
357 fprintf(stderr, "Slow");
358 break;
359 case SDL_TEXTURESCALEMODE_BEST:
360 fprintf(stderr, "Best");
361 break;
362 default:
363 fprintf(stderr, "0x%8.8x", flag);
364 break;
365 }
366 }
367
368 static void
369 PrintPixelFormat(Uint32 format)
370 {
371 switch (format) {
372 case SDL_PIXELFORMAT_UNKNOWN:
373 fprintf(stderr, "Unknwon");
374 break;
375 case SDL_PIXELFORMAT_INDEX1LSB:
376 fprintf(stderr, "Index1LSB");
377 break;
378 case SDL_PIXELFORMAT_INDEX1MSB:
379 fprintf(stderr, "Index1MSB");
380 break;
381 case SDL_PIXELFORMAT_INDEX4LSB:
382 fprintf(stderr, "Index4LSB");
383 break;
384 case SDL_PIXELFORMAT_INDEX4MSB:
385 fprintf(stderr, "Index4MSB");
386 break;
387 case SDL_PIXELFORMAT_INDEX8:
388 fprintf(stderr, "Index8");
389 break;
390 case SDL_PIXELFORMAT_RGB332:
391 fprintf(stderr, "RGB332");
392 break;
393 case SDL_PIXELFORMAT_RGB444:
394 fprintf(stderr, "RGB444");
395 break;
396 case SDL_PIXELFORMAT_RGB555:
397 fprintf(stderr, "RGB555");
398 break;
399 case SDL_PIXELFORMAT_ARGB4444:
400 fprintf(stderr, "ARGB4444");
401 break;
402 case SDL_PIXELFORMAT_ARGB1555:
403 fprintf(stderr, "ARGB1555");
404 break;
405 case SDL_PIXELFORMAT_RGB565:
406 fprintf(stderr, "RGB565");
407 break;
408 case SDL_PIXELFORMAT_RGB24:
409 fprintf(stderr, "RGB24");
410 break;
411 case SDL_PIXELFORMAT_BGR24:
412 fprintf(stderr, "BGR24");
413 break;
414 case SDL_PIXELFORMAT_RGB888:
415 fprintf(stderr, "RGB888");
416 break;
417 case SDL_PIXELFORMAT_BGR888:
418 fprintf(stderr, "BGR888");
419 break;
420 case SDL_PIXELFORMAT_ARGB8888:
421 fprintf(stderr, "ARGB8888");
422 break;
423 case SDL_PIXELFORMAT_RGBA8888:
424 fprintf(stderr, "RGBA8888");
425 break;
426 case SDL_PIXELFORMAT_ABGR8888:
427 fprintf(stderr, "ABGR8888");
428 break;
429 case SDL_PIXELFORMAT_BGRA8888:
430 fprintf(stderr, "BGRA8888");
431 break;
432 case SDL_PIXELFORMAT_ARGB2101010:
433 fprintf(stderr, "ARGB2101010");
434 break;
435 case SDL_PIXELFORMAT_YV12:
436 fprintf(stderr, "YV12");
437 break;
438 case SDL_PIXELFORMAT_IYUV:
439 fprintf(stderr, "IYUV");
440 break;
441 case SDL_PIXELFORMAT_YUY2:
442 fprintf(stderr, "YUY2");
443 break;
444 case SDL_PIXELFORMAT_UYVY:
445 fprintf(stderr, "UYVY");
446 break;
447 case SDL_PIXELFORMAT_YVYU:
448 fprintf(stderr, "YVYU");
449 break;
450 case SDL_PIXELFORMAT_ABGR1555:
451 fprintf(stderr, "ABGR1555");
452 break;
453 case SDL_PIXELFORMAT_BGR555:
454 fprintf(stderr, "BGR555");
455 break;
456 default:
457 fprintf(stderr, "0x%8.8x", format);
458 break;
459 }
460 }
461
462 static void
463 PrintRenderer(SDL_RendererInfo * info)
464 {
465 int i, count;
466
467 fprintf(stderr, " Renderer %s:\n", info->name);
468
469 fprintf(stderr, " Flags: 0x%8.8X", info->flags);
470 fprintf(stderr, " (");
471 count = 0;
472 for (i = 0; i < sizeof(info->flags) * 8; ++i) {
473 Uint32 flag = (1 << i);
474 if (info->flags & flag) {
475 if (count > 0) {
476 fprintf(stderr, " | ");
477 }
478 PrintRendererFlag(flag);
479 ++count;
480 }
481 }
482 fprintf(stderr, ")\n");
483
484 fprintf(stderr, " Blend: 0x%8.8X", info->blend_modes);
485 fprintf(stderr, " (");
486 count = 0;
487 for (i = 0; i < sizeof(info->blend_modes) * 8; ++i) {
488 Uint32 flag = (1 << i);
489 if (info->blend_modes & flag) {
490 if (count > 0) {
491 fprintf(stderr, " | ");
492 }
493 PrintBlendMode(flag);
494 ++count;
495 }
496 }
497 fprintf(stderr, ")\n");
498
499 fprintf(stderr, " Scale: 0x%8.8X", info->scale_modes);
500 fprintf(stderr, " (");
501 count = 0;
502 for (i = 0; i < sizeof(info->scale_modes) * 8; ++i) {
503 Uint32 flag = (1 << i);
504 if (info->scale_modes & flag) {
505 if (count > 0) {
506 fprintf(stderr, " | ");
507 }
508 PrintScaleMode(flag);
509 ++count;
510 }
511 }
512 fprintf(stderr, ")\n");
513
514 fprintf(stderr, " Texture formats (%d): ", info->num_texture_formats);
515 for (i = 0; i < (int) info->num_texture_formats; ++i) {
516 if (i > 0) {
517 fprintf(stderr, ", ");
518 }
519 PrintPixelFormat(info->texture_formats[i]);
520 }
521 fprintf(stderr, "\n");
522
523 if (info->max_texture_width || info->max_texture_height) {
524 fprintf(stderr, " Max Texture Size: %dx%d\n",
525 info->max_texture_width, info->max_texture_height);
526 }
527 }
528
529 SDL_bool
530 CommonInit(CommonState * state)
531 {
532 int i, j, m, n;
533 SDL_DisplayMode fullscreen_mode;
534
535 if (state->flags & SDL_INIT_VIDEO) {
536 if (state->verbose & VERBOSE_VIDEO) {
537 n = SDL_GetNumVideoDrivers();
538 if (n == 0) {
539 fprintf(stderr, "No built-in video drivers\n");
540 } else {
541 fprintf(stderr, "Built-in video drivers:");
542 for (i = 0; i < n; ++i) {
543 if (i > 0) {
544 fprintf(stderr, ",");
545 }
546 fprintf(stderr, " %s", SDL_GetVideoDriver(i));
547 }
548 fprintf(stderr, "\n");
549 }
550 }
551 if (SDL_VideoInit(state->videodriver, 0) < 0) {
552 fprintf(stderr, "Couldn't initialize video driver: %s\n",
553 SDL_GetError());
554 return SDL_FALSE;
555 }
556 if (state->verbose & VERBOSE_VIDEO) {
557 fprintf(stderr, "Video driver: %s\n",
558 SDL_GetCurrentVideoDriver());
559 }
560
561 if (state->verbose & VERBOSE_MODES) {
562 SDL_DisplayMode mode;
563 int bpp;
564 Uint32 Rmask, Gmask, Bmask, Amask;
565
566 n = SDL_GetNumVideoDisplays();
567 fprintf(stderr, "Number of displays: %d\n", n);
568 for (i = 0; i < n; ++i) {
569 fprintf(stderr, "Display %d:\n", i);
570 SDL_SelectVideoDisplay(i);
571
572 SDL_GetDesktopDisplayMode(&mode);
573 SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask, &Gmask,
574 &Bmask, &Amask);
575 fprintf(stderr,
576 " Current mode: %dx%d@%dHz, %d bits-per-pixel\n",
577 mode.w, mode.h, mode.refresh_rate, bpp);
578 if (Rmask || Gmask || Bmask) {
579 fprintf(stderr, " Red Mask = 0x%.8x\n", Rmask);
580 fprintf(stderr, " Green Mask = 0x%.8x\n", Gmask);
581 fprintf(stderr, " Blue Mask = 0x%.8x\n", Bmask);
582 if (Amask)
583 fprintf(stderr, " Alpha Mask = 0x%.8x\n", Amask);
584 }
585
586 /* Print available fullscreen video modes */
587 m = SDL_GetNumDisplayModes();
588 if (m == 0) {
589 fprintf(stderr, "No available fullscreen video modes\n");
590 } else {
591 fprintf(stderr, " Fullscreen video modes:\n");
592 for (j = 0; j < m; ++j) {
593 SDL_GetDisplayMode(j, &mode);
594 SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask,
595 &Gmask, &Bmask, &Amask);
596 fprintf(stderr,
597 " Mode %d: %dx%d@%dHz, %d bits-per-pixel\n",
598 j, mode.w, mode.h, mode.refresh_rate, bpp);
599 if (Rmask || Gmask || Bmask) {
600 fprintf(stderr, " Red Mask = 0x%.8x\n",
601 Rmask);
602 fprintf(stderr, " Green Mask = 0x%.8x\n",
603 Gmask);
604 fprintf(stderr, " Blue Mask = 0x%.8x\n",
605 Bmask);
606 if (Amask)
607 fprintf(stderr,
608 " Alpha Mask = 0x%.8x\n",
609 Amask);
610 }
611 }
612 }
613 }
614 }
615
616 SDL_SelectVideoDisplay(state->display);
617 if (state->verbose & VERBOSE_RENDER) {
618 SDL_RendererInfo info;
619
620 n = SDL_GetNumRenderDrivers();
621 if (n == 0) {
622 fprintf(stderr, "No built-in render drivers\n");
623 } else {
624 fprintf(stderr, "Built-in render drivers:\n");
625 for (i = 0; i < n; ++i) {
626 SDL_GetRenderDriverInfo(i, &info);
627 PrintRenderer(&info);
628 }
629 }
630 }
631
632 switch (state->depth) {
633 case 8:
634 fullscreen_mode.format = SDL_PIXELFORMAT_INDEX8;
635 break;
636 case 15:
637 fullscreen_mode.format = SDL_PIXELFORMAT_BGR555;
638 break;
639 case 16:
640 default:
641 fullscreen_mode.format = SDL_PIXELFORMAT_ABGR1555;
642 break;
643 /* NDS default:
644 fullscreen_mode.format = SDL_PIXELFORMAT_RGB888;
645 break;*/
646 }
647 fullscreen_mode.w = state->window_w;
648 fullscreen_mode.h = state->window_h;
649 fullscreen_mode.refresh_rate = state->refresh_rate;
650 SDL_SetFullscreenDisplayMode(&fullscreen_mode);
651
652 state->windows =
653 (SDL_WindowID *) SDL_malloc(state->num_windows *
654 sizeof(*state->windows));
655 if (!state->windows) {
656 fprintf(stderr, "Out of memory!\n");
657 return SDL_FALSE;
658 }
659 for (i = 0; i < state->num_windows; ++i) {
660 char title[1024];
661
662 if (state->num_windows > 1) {
663 SDL_snprintf(title, SDL_arraysize(title), "%s %d",
664 state->window_title, i + 1);
665 } else {
666 SDL_strlcpy(title, state->window_title, SDL_arraysize(title));
667 }
668 state->windows[i] =
669 SDL_CreateWindow(title, state->window_x, state->window_y,
670 state->window_w, state->window_h,
671 state->window_flags);
672 if (!state->windows[i]) {
673 fprintf(stderr, "Couldn't create window: %s\n",
674 SDL_GetError());
675 return SDL_FALSE;
676 }
677
678 if (!state->skip_renderer
679 && (state->renderdriver
680 || !(state->window_flags & SDL_WINDOW_OPENGL))) {
681 m = -1;
682 if (state->renderdriver) {
683 SDL_RendererInfo info;
684 n = SDL_GetNumRenderDrivers();
685 for (j = 0; j < n; ++j) {
686 SDL_GetRenderDriverInfo(j, &info);
687 if (SDL_strcasecmp(info.name, state->renderdriver) ==
688 0) {
689 m = j;
690 break;
691 }
692 }
693 if (m == n) {
694 fprintf(stderr,
695 "Couldn't find render driver named %s",
696 state->renderdriver);
697 return SDL_FALSE;
698 }
699 }
700 if (SDL_CreateRenderer
701 (state->windows[i], m, state->render_flags) < 0) {
702 fprintf(stderr, "Couldn't create renderer: %s\n",
703 SDL_GetError());
704 return SDL_FALSE;
705 }
706 if (state->verbose & VERBOSE_RENDER) {
707 SDL_RendererInfo info;
708
709 fprintf(stderr, "Current renderer:\n");
710 SDL_GetRendererInfo(&info);
711 PrintRenderer(&info);
712 }
713 }
714 }
715 SDL_SelectRenderer(state->windows[0]);
716 }
717
718 if (state->flags & SDL_INIT_AUDIO) {
719 if (state->verbose & VERBOSE_AUDIO) {
720 n = SDL_GetNumAudioDrivers();
721 if (n == 0) {
722 fprintf(stderr, "No built-in audio drivers\n");
723 } else {
724 fprintf(stderr, "Built-in audio drivers:");
725 for (i = 0; i < n; ++i) {
726 if (i > 0) {
727 fprintf(stderr, ",");
728 }
729 fprintf(stderr, " %s", SDL_GetAudioDriver(i));
730 }
731 fprintf(stderr, "\n");
732 }
733 }
734 if (SDL_AudioInit(state->audiodriver) < 0) {
735 fprintf(stderr, "Couldn't initialize audio driver: %s\n",
736 SDL_GetError());
737 return SDL_FALSE;
738 }
739 if (state->verbose & VERBOSE_VIDEO) {
740 fprintf(stderr, "Audio driver: %s\n",
741 SDL_GetCurrentAudioDriver());
742 }
743
744 if (SDL_OpenAudio(&state->audiospec, NULL) < 0) {
745 fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
746 return SDL_FALSE;
747 }
748 }
749
750 return SDL_TRUE;
751 }
752
753 static void
754 PrintEvent(SDL_Event * event)
755 {
756 fprintf(stderr, "SDL EVENT: ");
757 switch (event->type) {
758 case SDL_WINDOWEVENT:
759 switch (event->window.event) {
760 case SDL_WINDOWEVENT_SHOWN:
761 fprintf(stderr, "Window %d shown", event->window.windowID);
762 break;
763 case SDL_WINDOWEVENT_HIDDEN:
764 fprintf(stderr, "Window %d hidden", event->window.windowID);
765 break;
766 case SDL_WINDOWEVENT_EXPOSED:
767 fprintf(stderr, "Window %d exposed", event->window.windowID);
768 break;
769 case SDL_WINDOWEVENT_MOVED:
770 fprintf(stderr, "Window %d moved to %d,%d",
771 event->window.windowID, event->window.data1,
772 event->window.data2);
773 break;
774 case SDL_WINDOWEVENT_RESIZED:
775 fprintf(stderr, "Window %d resized to %dx%d",
776 event->window.windowID, event->window.data1,
777 event->window.data2);
778 break;
779 case SDL_WINDOWEVENT_MINIMIZED:
780 fprintf(stderr, "Window %d minimized", event->window.windowID);
781 break;
782 case SDL_WINDOWEVENT_MAXIMIZED:
783 fprintf(stderr, "Window %d maximized", event->window.windowID);
784 break;
785 case SDL_WINDOWEVENT_RESTORED:
786 fprintf(stderr, "Window %d restored", event->window.windowID);
787 break;
788 case SDL_WINDOWEVENT_ENTER:
789 fprintf(stderr, "Mouse entered window %d",
790 event->window.windowID);
791 break;
792 case SDL_WINDOWEVENT_LEAVE:
793 fprintf(stderr, "Mouse left window %d", event->window.windowID);
794 break;
795 case SDL_WINDOWEVENT_FOCUS_GAINED:
796 fprintf(stderr, "Window %d gained keyboard focus",
797 event->window.windowID);
798 break;
799 case SDL_WINDOWEVENT_FOCUS_LOST:
800 fprintf(stderr, "Window %d lost keyboard focus",
801 event->window.windowID);
802 break;
803 case SDL_WINDOWEVENT_CLOSE:
804 fprintf(stderr, "Window %d closed", event->window.windowID);
805 break;
806 default:
807 fprintf(stderr, "Window %d got unknown event %d",
808 event->window.windowID, event->window.event);
809 break;
810 }
811 break;
812 case SDL_KEYDOWN:
813 fprintf(stderr,
814 "Keyboard %d: key pressed in window %d: scancode 0x%08X = %s, keycode 0x%08X = %s",
815 event->key.which, event->key.windowID,
816 event->key.keysym.scancode,
817 SDL_GetScancodeName(event->key.keysym.scancode),
818 event->key.keysym.sym, SDL_GetKeyName(event->key.keysym.sym));
819 break;
820 case SDL_KEYUP:
821 fprintf(stderr,
822 "Keyboard %d: key released in window %d: scancode 0x%08X = %s, keycode 0x%08X = %s",
823 event->key.which, event->key.windowID,
824 event->key.keysym.scancode,
825 SDL_GetScancodeName(event->key.keysym.scancode),
826 event->key.keysym.sym, SDL_GetKeyName(event->key.keysym.sym));
827 break;
828 case SDL_TEXTINPUT:
829 fprintf(stderr, "Keyboard %d: text input \"%s\" in window %d",
830 event->text.which, event->text.text, event->text.windowID);
831 break;
832 case SDL_MOUSEMOTION:
833 fprintf(stderr, "Mouse %d: moved to %d,%d (%d,%d) in window %d",
834 event->motion.which, event->motion.x, event->motion.y,
835 event->motion.xrel, event->motion.yrel,
836 event->motion.windowID);
837 break;
838 case SDL_MOUSEBUTTONDOWN:
839 fprintf(stderr, "Mouse %d: button %d pressed at %d,%d in window %d",
840 event->button.which, event->button.button, event->button.x,
841 event->button.y, event->button.windowID);
842 break;
843 case SDL_MOUSEBUTTONUP:
844 fprintf(stderr, "Mouse %d: button %d released at %d,%d in window %d",
845 event->button.which, event->button.button, event->button.x,
846 event->button.y, event->button.windowID);
847 break;
848 case SDL_MOUSEWHEEL:
849 fprintf(stderr,
850 "Mouse %d: wheel scrolled %d in x and %d in y in window %d",
851 event->wheel.which, event->wheel.x, event->wheel.y,
852 event->wheel.windowID);
853 break;
854 case SDL_JOYBALLMOTION:
855 fprintf(stderr, "Joystick %d: ball %d moved by %d,%d",
856 event->jball.which, event->jball.ball, event->jball.xrel,
857 event->jball.yrel);
858 break;
859 case SDL_JOYHATMOTION:
860 fprintf(stderr, "Joystick %d: hat %d moved to ", event->jhat.which,
861 event->jhat.hat);
862 switch (event->jhat.value) {
863 case SDL_HAT_CENTERED:
864 fprintf(stderr, "CENTER");
865 break;
866 case SDL_HAT_UP:
867 fprintf(stderr, "UP");
868 break;
869 case SDL_HAT_RIGHTUP:
870 fprintf(stderr, "RIGHTUP");
871 break;
872 case SDL_HAT_RIGHT:
873 fprintf(stderr, "RIGHT");
874 break;
875 case SDL_HAT_RIGHTDOWN:
876 fprintf(stderr, "RIGHTDOWN");
877 break;
878 case SDL_HAT_DOWN:
879 fprintf(stderr, "DOWN");
880 break;
881 case SDL_HAT_LEFTDOWN:
882 fprintf(stderr, "LEFTDOWN");
883 break;
884 case SDL_HAT_LEFT:
885 fprintf(stderr, "LEFT");
886 break;
887 case SDL_HAT_LEFTUP:
888 fprintf(stderr, "LEFTUP");
889 break;
890 default:
891 fprintf(stderr, "UNKNOWN");
892 break;
893 }
894 break;
895 case SDL_JOYBUTTONDOWN:
896 fprintf(stderr, "Joystick %d: button %d pressed",
897 event->jbutton.which, event->jbutton.button);
898 break;
899 case SDL_JOYBUTTONUP:
900 fprintf(stderr, "Joystick %d: button %d released",
901 event->jbutton.which, event->jbutton.button);
902 break;
903 case SDL_QUIT:
904 fprintf(stderr, "Quit requested");
905 break;
906 case SDL_USEREVENT:
907 fprintf(stderr, "User event %d", event->user.code);
908 break;
909 default:
910 fprintf(stderr, "Unknown event %d", event->type);
911 break;
912 }
913 fprintf(stderr, "\n");
914 }
915
916 void
917 CommonEvent(CommonState * state, SDL_Event * event, int *done)
918 {
919 if (state->verbose & VERBOSE_EVENT) {
920 PrintEvent(event);
921 }
922
923 switch (event->type) {
924 case SDL_WINDOWEVENT:
925 switch (event->window.event) {
926 case SDL_WINDOWEVENT_CLOSE:
927 *done = 1;
928 break;
929 }
930 break;
931 case SDL_KEYDOWN:
932 switch (event->key.keysym.sym) {
933 /* Add hotkeys here */
934 case SDLK_g:
935 if (event->key.keysym.mod & KMOD_CTRL) {
936 /* Ctrl-G toggle grab */
937 }
938 break;
939 case SDLK_ESCAPE:
940 *done = 1;
941 break;
942 default:
943 break;
944 }
945 break;
946 case SDL_QUIT:
947 *done = 1;
948 break;
949 }
950 }
951
952 void
953 CommonQuit(CommonState * state)
954 {
955 if (state->flags & SDL_INIT_VIDEO) {
956 SDL_VideoQuit();
957 }
958 if (state->flags & SDL_INIT_AUDIO) {
959 SDL_AudioQuit();
960 }
961 if (state->windows) {
962 SDL_free(state->windows);
963 }
964 SDL_free(state);
965 }