src/test/SDL_test_common.c
author Sam Lantinga <slouken@libsdl.org>
Wed, 29 May 2013 03:22:19 -0700
changeset 7240 39eb4958950a
parent 7194 987fb567bba9
child 7249 606c8fcfef2f
permissions -rw-r--r--
When the window is resized, the viewport is automatically reset.
This resolves lots of confusion around resizable windows. Most people don't expect a viewport to be implicitly set when the renderer is created and then not to be reset to the window size if the window is resized.

Added common test command line parameters --logical WxH and --scale N to test the render logical size and scaling APIs.
aschiffler@6727
     1
/*
aschiffler@6727
     2
  Simple DirectMedia Layer
slouken@6885
     3
  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
aschiffler@6727
     4
aschiffler@6727
     5
  This software is provided 'as-is', without any express or implied
aschiffler@6727
     6
  warranty.  In no event will the authors be held liable for any damages
aschiffler@6727
     7
  arising from the use of this software.
aschiffler@6727
     8
aschiffler@6727
     9
  Permission is granted to anyone to use this software for any purpose,
aschiffler@6727
    10
  including commercial applications, and to alter it and redistribute it
aschiffler@6727
    11
  freely, subject to the following restrictions:
aschiffler@6727
    12
aschiffler@6727
    13
  1. The origin of this software must not be misrepresented; you must not
aschiffler@6727
    14
     claim that you wrote the original software. If you use this software
aschiffler@6727
    15
     in a product, an acknowledgment in the product documentation would be
aschiffler@6727
    16
     appreciated but is not required.
aschiffler@6727
    17
  2. Altered source versions must be plainly marked as such, and must not be
aschiffler@6727
    18
     misrepresented as being the original software.
aschiffler@6727
    19
  3. This notice may not be removed or altered from any source distribution.
aschiffler@6727
    20
*/
aschiffler@6727
    21
aschiffler@6727
    22
/* Ported from original test\common.c file. */
aschiffler@6727
    23
aschiffler@6727
    24
#include "SDL_config.h"
aschiffler@6727
    25
#include "SDL_test.h"
aschiffler@6727
    26
aschiffler@6727
    27
#include <stdio.h>
aschiffler@6727
    28
aschiffler@6727
    29
#define VIDEO_USAGE \
slouken@7240
    30
"[--video driver] [--renderer driver] [--gldebug] [--info all|video|modes|render|event] [--log all|error|system|audio|video|render|input] [--display N] [--fullscreen | --fullscreen-desktop | --windows N] [--title title] [--icon icon.bmp] [--center | --position X,Y] [--geometry WxH] [--min-geometry WxH] [--max-geometry WxH] [--logical WxH] [--scale N] [--depth N] [--refresh R] [--vsync] [--noframe] [--resize] [--minimize] [--maximize] [--grab]"
aschiffler@6727
    31
aschiffler@6727
    32
#define AUDIO_USAGE \
aschiffler@6727
    33
"[--rate N] [--format U8|S8|U16|U16LE|U16BE|S16|S16LE|S16BE] [--channels N] [--samples N]"
aschiffler@6727
    34
aschiffler@6727
    35
SDLTest_CommonState *
aschiffler@6727
    36
SDLTest_CommonCreateState(char **argv, Uint32 flags)
aschiffler@6727
    37
{
aschiffler@6727
    38
    SDLTest_CommonState *state = (SDLTest_CommonState *)SDL_calloc(1, sizeof(*state));
aschiffler@6727
    39
    if (!state) {
aschiffler@6727
    40
        SDL_OutOfMemory();
aschiffler@6727
    41
        return NULL;
aschiffler@6727
    42
    }
aschiffler@6727
    43
aschiffler@6727
    44
    /* Initialize some defaults */
aschiffler@6727
    45
    state->argv = argv;
aschiffler@6727
    46
    state->flags = flags;
aschiffler@6727
    47
    state->window_title = argv[0];
aschiffler@6727
    48
    state->window_flags = 0;
aschiffler@6727
    49
    state->window_x = SDL_WINDOWPOS_UNDEFINED;
aschiffler@6727
    50
    state->window_y = SDL_WINDOWPOS_UNDEFINED;
aschiffler@6727
    51
    state->window_w = DEFAULT_WINDOW_WIDTH;
aschiffler@6727
    52
    state->window_h = DEFAULT_WINDOW_HEIGHT;
aschiffler@6727
    53
    state->num_windows = 1;
aschiffler@6727
    54
    state->audiospec.freq = 22050;
aschiffler@6727
    55
    state->audiospec.format = AUDIO_S16;
aschiffler@6727
    56
    state->audiospec.channels = 2;
aschiffler@6727
    57
    state->audiospec.samples = 2048;
aschiffler@6727
    58
aschiffler@6727
    59
    /* Set some very sane GL defaults */
aschiffler@6727
    60
    state->gl_red_size = 3;
aschiffler@6727
    61
    state->gl_green_size = 3;
aschiffler@6727
    62
    state->gl_blue_size = 2;
aschiffler@6727
    63
    state->gl_alpha_size = 0;
aschiffler@6727
    64
    state->gl_buffer_size = 0;
aschiffler@6727
    65
    state->gl_depth_size = 16;
aschiffler@6727
    66
    state->gl_stencil_size = 0;
aschiffler@6727
    67
    state->gl_double_buffer = 1;
aschiffler@6727
    68
    state->gl_accum_red_size = 0;
aschiffler@6727
    69
    state->gl_accum_green_size = 0;
aschiffler@6727
    70
    state->gl_accum_blue_size = 0;
aschiffler@6727
    71
    state->gl_accum_alpha_size = 0;
aschiffler@6727
    72
    state->gl_stereo = 0;
aschiffler@6727
    73
    state->gl_multisamplebuffers = 0;
aschiffler@6727
    74
    state->gl_multisamplesamples = 0;
aschiffler@6727
    75
    state->gl_retained_backing = 1;
aschiffler@6727
    76
    state->gl_accelerated = -1;
slouken@7194
    77
    state->gl_debug = 0;
aschiffler@6727
    78
aschiffler@6727
    79
    return state;
aschiffler@6727
    80
}
aschiffler@6727
    81
aschiffler@6727
    82
int
aschiffler@6727
    83
SDLTest_CommonArg(SDLTest_CommonState * state, int index)
aschiffler@6727
    84
{
aschiffler@6727
    85
    char **argv = state->argv;
aschiffler@6727
    86
aschiffler@6727
    87
    if (SDL_strcasecmp(argv[index], "--video") == 0) {
aschiffler@6727
    88
        ++index;
aschiffler@6727
    89
        if (!argv[index]) {
aschiffler@6727
    90
            return -1;
aschiffler@6727
    91
        }
aschiffler@6727
    92
        state->videodriver = argv[index];
aschiffler@6727
    93
        return 2;
aschiffler@6727
    94
    }
aschiffler@6727
    95
    if (SDL_strcasecmp(argv[index], "--renderer") == 0) {
aschiffler@6727
    96
        ++index;
aschiffler@6727
    97
        if (!argv[index]) {
aschiffler@6727
    98
            return -1;
aschiffler@6727
    99
        }
aschiffler@6727
   100
        state->renderdriver = argv[index];
aschiffler@6727
   101
        return 2;
aschiffler@6727
   102
    }
slouken@7194
   103
    if (SDL_strcasecmp(argv[index], "--gldebug") == 0) {
slouken@7194
   104
        state->gl_debug = 1;
slouken@7194
   105
        return 1;
slouken@7194
   106
    }
aschiffler@6727
   107
    if (SDL_strcasecmp(argv[index], "--info") == 0) {
aschiffler@6727
   108
        ++index;
aschiffler@6727
   109
        if (!argv[index]) {
aschiffler@6727
   110
            return -1;
aschiffler@6727
   111
        }
aschiffler@6727
   112
        if (SDL_strcasecmp(argv[index], "all") == 0) {
aschiffler@6727
   113
            state->verbose |=
aschiffler@6727
   114
                (VERBOSE_VIDEO | VERBOSE_MODES | VERBOSE_RENDER |
aschiffler@6727
   115
                 VERBOSE_EVENT);
aschiffler@6727
   116
            return 2;
aschiffler@6727
   117
        }
aschiffler@6727
   118
        if (SDL_strcasecmp(argv[index], "video") == 0) {
aschiffler@6727
   119
            state->verbose |= VERBOSE_VIDEO;
aschiffler@6727
   120
            return 2;
aschiffler@6727
   121
        }
aschiffler@6727
   122
        if (SDL_strcasecmp(argv[index], "modes") == 0) {
aschiffler@6727
   123
            state->verbose |= VERBOSE_MODES;
aschiffler@6727
   124
            return 2;
aschiffler@6727
   125
        }
aschiffler@6727
   126
        if (SDL_strcasecmp(argv[index], "render") == 0) {
aschiffler@6727
   127
            state->verbose |= VERBOSE_RENDER;
aschiffler@6727
   128
            return 2;
aschiffler@6727
   129
        }
aschiffler@6727
   130
        if (SDL_strcasecmp(argv[index], "event") == 0) {
aschiffler@6727
   131
            state->verbose |= VERBOSE_EVENT;
aschiffler@6727
   132
            return 2;
aschiffler@6727
   133
        }
aschiffler@6727
   134
        return -1;
aschiffler@6727
   135
    }
aschiffler@6727
   136
    if (SDL_strcasecmp(argv[index], "--log") == 0) {
aschiffler@6727
   137
        ++index;
aschiffler@6727
   138
        if (!argv[index]) {
aschiffler@6727
   139
            return -1;
aschiffler@6727
   140
        }
aschiffler@6727
   141
        if (SDL_strcasecmp(argv[index], "all") == 0) {
aschiffler@6727
   142
            SDL_LogSetAllPriority(SDL_LOG_PRIORITY_VERBOSE);
aschiffler@6727
   143
            return 2;
aschiffler@6727
   144
        }
aschiffler@6727
   145
        if (SDL_strcasecmp(argv[index], "error") == 0) {
aschiffler@6727
   146
            SDL_LogSetPriority(SDL_LOG_CATEGORY_ERROR, SDL_LOG_PRIORITY_VERBOSE);
aschiffler@6727
   147
            return 2;
aschiffler@6727
   148
        }
aschiffler@6727
   149
        if (SDL_strcasecmp(argv[index], "system") == 0) {
aschiffler@6727
   150
            SDL_LogSetPriority(SDL_LOG_CATEGORY_SYSTEM, SDL_LOG_PRIORITY_VERBOSE);
aschiffler@6727
   151
            return 2;
aschiffler@6727
   152
        }
aschiffler@6727
   153
        if (SDL_strcasecmp(argv[index], "audio") == 0) {
aschiffler@6727
   154
            SDL_LogSetPriority(SDL_LOG_CATEGORY_AUDIO, SDL_LOG_PRIORITY_VERBOSE);
aschiffler@6727
   155
            return 2;
aschiffler@6727
   156
        }
aschiffler@6727
   157
        if (SDL_strcasecmp(argv[index], "video") == 0) {
aschiffler@6727
   158
            SDL_LogSetPriority(SDL_LOG_CATEGORY_VIDEO, SDL_LOG_PRIORITY_VERBOSE);
aschiffler@6727
   159
            return 2;
aschiffler@6727
   160
        }
aschiffler@6727
   161
        if (SDL_strcasecmp(argv[index], "render") == 0) {
aschiffler@6727
   162
            SDL_LogSetPriority(SDL_LOG_CATEGORY_RENDER, SDL_LOG_PRIORITY_VERBOSE);
aschiffler@6727
   163
            return 2;
aschiffler@6727
   164
        }
aschiffler@6727
   165
        if (SDL_strcasecmp(argv[index], "input") == 0) {
aschiffler@6727
   166
            SDL_LogSetPriority(SDL_LOG_CATEGORY_INPUT, SDL_LOG_PRIORITY_VERBOSE);
aschiffler@6727
   167
            return 2;
aschiffler@6727
   168
        }
aschiffler@6727
   169
        return -1;
aschiffler@6727
   170
    }
aschiffler@6727
   171
    if (SDL_strcasecmp(argv[index], "--display") == 0) {
aschiffler@6727
   172
        ++index;
aschiffler@6727
   173
        if (!argv[index]) {
aschiffler@6727
   174
            return -1;
aschiffler@6727
   175
        }
aschiffler@6727
   176
        state->display = SDL_atoi(argv[index]);
aschiffler@6727
   177
        if (SDL_WINDOWPOS_ISUNDEFINED(state->window_x)) {
aschiffler@6727
   178
            state->window_x = SDL_WINDOWPOS_UNDEFINED_DISPLAY(state->display);
aschiffler@6727
   179
            state->window_y = SDL_WINDOWPOS_UNDEFINED_DISPLAY(state->display);
aschiffler@6727
   180
        }
aschiffler@6727
   181
        if (SDL_WINDOWPOS_ISCENTERED(state->window_x)) {
aschiffler@6727
   182
            state->window_x = SDL_WINDOWPOS_CENTERED_DISPLAY(state->display);
aschiffler@6727
   183
            state->window_y = SDL_WINDOWPOS_CENTERED_DISPLAY(state->display);
aschiffler@6727
   184
        }
aschiffler@6727
   185
        return 2;
aschiffler@6727
   186
    }
aschiffler@6727
   187
    if (SDL_strcasecmp(argv[index], "--fullscreen") == 0) {
aschiffler@6727
   188
        state->window_flags |= SDL_WINDOW_FULLSCREEN;
aschiffler@6727
   189
        state->num_windows = 1;
aschiffler@6727
   190
        return 1;
aschiffler@6727
   191
    }
slouken@6783
   192
    if (SDL_strcasecmp(argv[index], "--fullscreen-desktop") == 0) {
slouken@6783
   193
        state->window_flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
slouken@6783
   194
        state->num_windows = 1;
slouken@6783
   195
        return 1;
slouken@6783
   196
    }
aschiffler@6727
   197
    if (SDL_strcasecmp(argv[index], "--windows") == 0) {
aschiffler@6727
   198
        ++index;
aschiffler@6727
   199
        if (!argv[index] || !SDL_isdigit(*argv[index])) {
aschiffler@6727
   200
            return -1;
aschiffler@6727
   201
        }
aschiffler@6727
   202
        if (!(state->window_flags & SDL_WINDOW_FULLSCREEN)) {
aschiffler@6727
   203
            state->num_windows = SDL_atoi(argv[index]);
aschiffler@6727
   204
        }
aschiffler@6727
   205
        return 2;
aschiffler@6727
   206
    }
aschiffler@6727
   207
    if (SDL_strcasecmp(argv[index], "--title") == 0) {
aschiffler@6727
   208
        ++index;
aschiffler@6727
   209
        if (!argv[index]) {
aschiffler@6727
   210
            return -1;
aschiffler@6727
   211
        }
aschiffler@6727
   212
        state->window_title = argv[index];
aschiffler@6727
   213
        return 2;
aschiffler@6727
   214
    }
aschiffler@6727
   215
    if (SDL_strcasecmp(argv[index], "--icon") == 0) {
aschiffler@6727
   216
        ++index;
aschiffler@6727
   217
        if (!argv[index]) {
aschiffler@6727
   218
            return -1;
aschiffler@6727
   219
        }
aschiffler@6727
   220
        state->window_icon = argv[index];
aschiffler@6727
   221
        return 2;
aschiffler@6727
   222
    }
aschiffler@6727
   223
    if (SDL_strcasecmp(argv[index], "--center") == 0) {
aschiffler@6727
   224
        state->window_x = SDL_WINDOWPOS_CENTERED;
aschiffler@6727
   225
        state->window_y = SDL_WINDOWPOS_CENTERED;
aschiffler@6727
   226
        return 1;
aschiffler@6727
   227
    }
aschiffler@6727
   228
    if (SDL_strcasecmp(argv[index], "--position") == 0) {
aschiffler@6727
   229
        char *x, *y;
aschiffler@6727
   230
        ++index;
aschiffler@6727
   231
        if (!argv[index]) {
aschiffler@6727
   232
            return -1;
aschiffler@6727
   233
        }
aschiffler@6727
   234
        x = argv[index];
aschiffler@6727
   235
        y = argv[index];
aschiffler@6727
   236
        while (*y && *y != ',') {
aschiffler@6727
   237
            ++y;
aschiffler@6727
   238
        }
aschiffler@6727
   239
        if (!*y) {
aschiffler@6727
   240
            return -1;
aschiffler@6727
   241
        }
aschiffler@6727
   242
        *y++ = '\0';
aschiffler@6727
   243
        state->window_x = SDL_atoi(x);
aschiffler@6727
   244
        state->window_y = SDL_atoi(y);
aschiffler@6727
   245
        return 2;
aschiffler@6727
   246
    }
aschiffler@6727
   247
    if (SDL_strcasecmp(argv[index], "--geometry") == 0) {
aschiffler@6727
   248
        char *w, *h;
aschiffler@6727
   249
        ++index;
aschiffler@6727
   250
        if (!argv[index]) {
aschiffler@6727
   251
            return -1;
aschiffler@6727
   252
        }
aschiffler@6727
   253
        w = argv[index];
aschiffler@6727
   254
        h = argv[index];
aschiffler@6727
   255
        while (*h && *h != 'x') {
aschiffler@6727
   256
            ++h;
aschiffler@6727
   257
        }
aschiffler@6727
   258
        if (!*h) {
aschiffler@6727
   259
            return -1;
aschiffler@6727
   260
        }
aschiffler@6727
   261
        *h++ = '\0';
aschiffler@6727
   262
        state->window_w = SDL_atoi(w);
aschiffler@6727
   263
        state->window_h = SDL_atoi(h);
aschiffler@6727
   264
        return 2;
aschiffler@6727
   265
    }
slouken@6788
   266
    if (SDL_strcasecmp(argv[index], "--min-geometry") == 0) {
slouken@6788
   267
        char *w, *h;
slouken@6788
   268
        ++index;
slouken@6788
   269
        if (!argv[index]) {
slouken@6788
   270
            return -1;
slouken@6788
   271
        }
slouken@6788
   272
        w = argv[index];
slouken@6788
   273
        h = argv[index];
slouken@6788
   274
        while (*h && *h != 'x') {
slouken@6788
   275
            ++h;
slouken@6788
   276
        }
slouken@6788
   277
        if (!*h) {
slouken@6788
   278
            return -1;
slouken@6788
   279
        }
slouken@6788
   280
        *h++ = '\0';
slouken@6788
   281
        state->window_minW = SDL_atoi(w);
slouken@6788
   282
        state->window_minH = SDL_atoi(h);
slouken@6788
   283
        return 2;
slouken@6788
   284
    }
slouken@6788
   285
    if (SDL_strcasecmp(argv[index], "--max-geometry") == 0) {
slouken@6788
   286
        char *w, *h;
slouken@6788
   287
        ++index;
slouken@6788
   288
        if (!argv[index]) {
slouken@6788
   289
            return -1;
slouken@6788
   290
        }
slouken@6788
   291
        w = argv[index];
slouken@6788
   292
        h = argv[index];
slouken@6788
   293
        while (*h && *h != 'x') {
slouken@6788
   294
            ++h;
slouken@6788
   295
        }
slouken@6788
   296
        if (!*h) {
slouken@6788
   297
            return -1;
slouken@6788
   298
        }
slouken@6788
   299
        *h++ = '\0';
slouken@6788
   300
        state->window_maxW = SDL_atoi(w);
slouken@6788
   301
        state->window_maxH = SDL_atoi(h);
slouken@6788
   302
        return 2;
slouken@6788
   303
    }
slouken@7240
   304
    if (SDL_strcasecmp(argv[index], "--logical") == 0) {
slouken@7240
   305
        char *w, *h;
slouken@7240
   306
        ++index;
slouken@7240
   307
        if (!argv[index]) {
slouken@7240
   308
            return -1;
slouken@7240
   309
        }
slouken@7240
   310
        w = argv[index];
slouken@7240
   311
        h = argv[index];
slouken@7240
   312
        while (*h && *h != 'x') {
slouken@7240
   313
            ++h;
slouken@7240
   314
        }
slouken@7240
   315
        if (!*h) {
slouken@7240
   316
            return -1;
slouken@7240
   317
        }
slouken@7240
   318
        *h++ = '\0';
slouken@7240
   319
        state->logical_w = SDL_atoi(w);
slouken@7240
   320
        state->logical_h = SDL_atoi(h);
slouken@7240
   321
        return 2;
slouken@7240
   322
    }
slouken@7240
   323
    if (SDL_strcasecmp(argv[index], "--scale") == 0) {
slouken@7240
   324
        ++index;
slouken@7240
   325
        if (!argv[index]) {
slouken@7240
   326
            return -1;
slouken@7240
   327
        }
slouken@7240
   328
        state->scale = SDL_atof(argv[index]);
slouken@7240
   329
        return 2;
slouken@7240
   330
    }
aschiffler@6727
   331
    if (SDL_strcasecmp(argv[index], "--depth") == 0) {
aschiffler@6727
   332
        ++index;
aschiffler@6727
   333
        if (!argv[index]) {
aschiffler@6727
   334
            return -1;
aschiffler@6727
   335
        }
aschiffler@6727
   336
        state->depth = SDL_atoi(argv[index]);
aschiffler@6727
   337
        return 2;
aschiffler@6727
   338
    }
aschiffler@6727
   339
    if (SDL_strcasecmp(argv[index], "--refresh") == 0) {
aschiffler@6727
   340
        ++index;
aschiffler@6727
   341
        if (!argv[index]) {
aschiffler@6727
   342
            return -1;
aschiffler@6727
   343
        }
aschiffler@6727
   344
        state->refresh_rate = SDL_atoi(argv[index]);
aschiffler@6727
   345
        return 2;
aschiffler@6727
   346
    }
aschiffler@6727
   347
    if (SDL_strcasecmp(argv[index], "--vsync") == 0) {
aschiffler@6727
   348
        state->render_flags |= SDL_RENDERER_PRESENTVSYNC;
aschiffler@6727
   349
        return 1;
aschiffler@6727
   350
    }
aschiffler@6727
   351
    if (SDL_strcasecmp(argv[index], "--noframe") == 0) {
aschiffler@6727
   352
        state->window_flags |= SDL_WINDOW_BORDERLESS;
aschiffler@6727
   353
        return 1;
aschiffler@6727
   354
    }
aschiffler@6727
   355
    if (SDL_strcasecmp(argv[index], "--resize") == 0) {
aschiffler@6727
   356
        state->window_flags |= SDL_WINDOW_RESIZABLE;
aschiffler@6727
   357
        return 1;
aschiffler@6727
   358
    }
aschiffler@6727
   359
    if (SDL_strcasecmp(argv[index], "--minimize") == 0) {
aschiffler@6727
   360
        state->window_flags |= SDL_WINDOW_MINIMIZED;
aschiffler@6727
   361
        return 1;
aschiffler@6727
   362
    }
aschiffler@6727
   363
    if (SDL_strcasecmp(argv[index], "--maximize") == 0) {
aschiffler@6727
   364
        state->window_flags |= SDL_WINDOW_MAXIMIZED;
aschiffler@6727
   365
        return 1;
aschiffler@6727
   366
    }
aschiffler@6727
   367
    if (SDL_strcasecmp(argv[index], "--grab") == 0) {
aschiffler@6727
   368
        state->window_flags |= SDL_WINDOW_INPUT_GRABBED;
aschiffler@6727
   369
        return 1;
aschiffler@6727
   370
    }
aschiffler@6727
   371
    if (SDL_strcasecmp(argv[index], "--rate") == 0) {
aschiffler@6727
   372
        ++index;
aschiffler@6727
   373
        if (!argv[index]) {
aschiffler@6727
   374
            return -1;
aschiffler@6727
   375
        }
aschiffler@6727
   376
        state->audiospec.freq = SDL_atoi(argv[index]);
aschiffler@6727
   377
        return 2;
aschiffler@6727
   378
    }
aschiffler@6727
   379
    if (SDL_strcasecmp(argv[index], "--format") == 0) {
aschiffler@6727
   380
        ++index;
aschiffler@6727
   381
        if (!argv[index]) {
aschiffler@6727
   382
            return -1;
aschiffler@6727
   383
        }
aschiffler@6727
   384
        if (SDL_strcasecmp(argv[index], "U8") == 0) {
aschiffler@6727
   385
            state->audiospec.format = AUDIO_U8;
aschiffler@6727
   386
            return 2;
aschiffler@6727
   387
        }
aschiffler@6727
   388
        if (SDL_strcasecmp(argv[index], "S8") == 0) {
aschiffler@6727
   389
            state->audiospec.format = AUDIO_S8;
aschiffler@6727
   390
            return 2;
aschiffler@6727
   391
        }
aschiffler@6727
   392
        if (SDL_strcasecmp(argv[index], "U16") == 0) {
aschiffler@6727
   393
            state->audiospec.format = AUDIO_U16;
aschiffler@6727
   394
            return 2;
aschiffler@6727
   395
        }
aschiffler@6727
   396
        if (SDL_strcasecmp(argv[index], "U16LE") == 0) {
aschiffler@6727
   397
            state->audiospec.format = AUDIO_U16LSB;
aschiffler@6727
   398
            return 2;
aschiffler@6727
   399
        }
aschiffler@6727
   400
        if (SDL_strcasecmp(argv[index], "U16BE") == 0) {
aschiffler@6727
   401
            state->audiospec.format = AUDIO_U16MSB;
aschiffler@6727
   402
            return 2;
aschiffler@6727
   403
        }
aschiffler@6727
   404
        if (SDL_strcasecmp(argv[index], "S16") == 0) {
aschiffler@6727
   405
            state->audiospec.format = AUDIO_S16;
aschiffler@6727
   406
            return 2;
aschiffler@6727
   407
        }
aschiffler@6727
   408
        if (SDL_strcasecmp(argv[index], "S16LE") == 0) {
aschiffler@6727
   409
            state->audiospec.format = AUDIO_S16LSB;
aschiffler@6727
   410
            return 2;
aschiffler@6727
   411
        }
aschiffler@6727
   412
        if (SDL_strcasecmp(argv[index], "S16BE") == 0) {
aschiffler@6727
   413
            state->audiospec.format = AUDIO_S16MSB;
aschiffler@6727
   414
            return 2;
aschiffler@6727
   415
        }
aschiffler@6727
   416
        return -1;
aschiffler@6727
   417
    }
aschiffler@6727
   418
    if (SDL_strcasecmp(argv[index], "--channels") == 0) {
aschiffler@6727
   419
        ++index;
aschiffler@6727
   420
        if (!argv[index]) {
aschiffler@6727
   421
            return -1;
aschiffler@6727
   422
        }
aschiffler@6727
   423
        state->audiospec.channels = (Uint8) SDL_atoi(argv[index]);
aschiffler@6727
   424
        return 2;
aschiffler@6727
   425
    }
aschiffler@6727
   426
    if (SDL_strcasecmp(argv[index], "--samples") == 0) {
aschiffler@6727
   427
        ++index;
aschiffler@6727
   428
        if (!argv[index]) {
aschiffler@6727
   429
            return -1;
aschiffler@6727
   430
        }
aschiffler@6727
   431
        state->audiospec.samples = (Uint16) SDL_atoi(argv[index]);
aschiffler@6727
   432
        return 2;
aschiffler@6727
   433
    }
aschiffler@6727
   434
    if ((SDL_strcasecmp(argv[index], "-h") == 0)
aschiffler@6727
   435
        || (SDL_strcasecmp(argv[index], "--help") == 0)) {
aschiffler@6727
   436
        /* Print the usage message */
aschiffler@6727
   437
        return -1;
aschiffler@6727
   438
    }
aschiffler@6727
   439
    if (SDL_strcmp(argv[index], "-NSDocumentRevisionsDebugMode") == 0) {
slouken@7191
   440
    /* Debug flag sent by Xcode */
aschiffler@6727
   441
        return 2;
aschiffler@6727
   442
    }
aschiffler@6727
   443
    return 0;
aschiffler@6727
   444
}
aschiffler@6727
   445
aschiffler@6727
   446
const char *
aschiffler@6727
   447
SDLTest_CommonUsage(SDLTest_CommonState * state)
aschiffler@6727
   448
{
aschiffler@6727
   449
    switch (state->flags & (SDL_INIT_VIDEO | SDL_INIT_AUDIO)) {
aschiffler@6727
   450
    case SDL_INIT_VIDEO:
aschiffler@6727
   451
        return VIDEO_USAGE;
aschiffler@6727
   452
    case SDL_INIT_AUDIO:
aschiffler@6727
   453
        return AUDIO_USAGE;
aschiffler@6727
   454
    case (SDL_INIT_VIDEO | SDL_INIT_AUDIO):
aschiffler@6727
   455
        return VIDEO_USAGE " " AUDIO_USAGE;
aschiffler@6727
   456
    default:
aschiffler@6727
   457
        return "";
aschiffler@6727
   458
    }
aschiffler@6727
   459
}
aschiffler@6727
   460
aschiffler@6727
   461
static void
aschiffler@6727
   462
SDLTest_PrintRendererFlag(Uint32 flag)
aschiffler@6727
   463
{
aschiffler@6727
   464
    switch (flag) {
aschiffler@6727
   465
    case SDL_RENDERER_PRESENTVSYNC:
aschiffler@6727
   466
        fprintf(stderr, "PresentVSync");
aschiffler@6727
   467
        break;
aschiffler@6727
   468
    case SDL_RENDERER_ACCELERATED:
aschiffler@6727
   469
        fprintf(stderr, "Accelerated");
aschiffler@6727
   470
        break;
aschiffler@6727
   471
    default:
aschiffler@6727
   472
        fprintf(stderr, "0x%8.8x", flag);
aschiffler@6727
   473
        break;
aschiffler@6727
   474
    }
aschiffler@6727
   475
}
aschiffler@6727
   476
aschiffler@6727
   477
static void
aschiffler@6727
   478
SDLTest_PrintPixelFormat(Uint32 format)
aschiffler@6727
   479
{
aschiffler@6727
   480
    switch (format) {
aschiffler@6727
   481
    case SDL_PIXELFORMAT_UNKNOWN:
aschiffler@6727
   482
        fprintf(stderr, "Unknwon");
aschiffler@6727
   483
        break;
aschiffler@6727
   484
    case SDL_PIXELFORMAT_INDEX1LSB:
aschiffler@6727
   485
        fprintf(stderr, "Index1LSB");
aschiffler@6727
   486
        break;
aschiffler@6727
   487
    case SDL_PIXELFORMAT_INDEX1MSB:
aschiffler@6727
   488
        fprintf(stderr, "Index1MSB");
aschiffler@6727
   489
        break;
aschiffler@6727
   490
    case SDL_PIXELFORMAT_INDEX4LSB:
aschiffler@6727
   491
        fprintf(stderr, "Index4LSB");
aschiffler@6727
   492
        break;
aschiffler@6727
   493
    case SDL_PIXELFORMAT_INDEX4MSB:
aschiffler@6727
   494
        fprintf(stderr, "Index4MSB");
aschiffler@6727
   495
        break;
aschiffler@6727
   496
    case SDL_PIXELFORMAT_INDEX8:
aschiffler@6727
   497
        fprintf(stderr, "Index8");
aschiffler@6727
   498
        break;
aschiffler@6727
   499
    case SDL_PIXELFORMAT_RGB332:
aschiffler@6727
   500
        fprintf(stderr, "RGB332");
aschiffler@6727
   501
        break;
aschiffler@6727
   502
    case SDL_PIXELFORMAT_RGB444:
aschiffler@6727
   503
        fprintf(stderr, "RGB444");
aschiffler@6727
   504
        break;
aschiffler@6727
   505
    case SDL_PIXELFORMAT_RGB555:
aschiffler@6727
   506
        fprintf(stderr, "RGB555");
aschiffler@6727
   507
        break;
aschiffler@6727
   508
    case SDL_PIXELFORMAT_BGR555:
aschiffler@6727
   509
        fprintf(stderr, "BGR555");
aschiffler@6727
   510
        break;
aschiffler@6727
   511
    case SDL_PIXELFORMAT_ARGB4444:
aschiffler@6727
   512
        fprintf(stderr, "ARGB4444");
aschiffler@6727
   513
        break;
aschiffler@6727
   514
    case SDL_PIXELFORMAT_ABGR4444:
aschiffler@6727
   515
        fprintf(stderr, "ABGR4444");
aschiffler@6727
   516
        break;
aschiffler@6727
   517
    case SDL_PIXELFORMAT_ARGB1555:
aschiffler@6727
   518
        fprintf(stderr, "ARGB1555");
aschiffler@6727
   519
        break;
aschiffler@6727
   520
    case SDL_PIXELFORMAT_ABGR1555:
aschiffler@6727
   521
        fprintf(stderr, "ABGR1555");
aschiffler@6727
   522
        break;
aschiffler@6727
   523
    case SDL_PIXELFORMAT_RGB565:
aschiffler@6727
   524
        fprintf(stderr, "RGB565");
aschiffler@6727
   525
        break;
aschiffler@6727
   526
    case SDL_PIXELFORMAT_BGR565:
aschiffler@6727
   527
        fprintf(stderr, "BGR565");
aschiffler@6727
   528
        break;
aschiffler@6727
   529
    case SDL_PIXELFORMAT_RGB24:
aschiffler@6727
   530
        fprintf(stderr, "RGB24");
aschiffler@6727
   531
        break;
aschiffler@6727
   532
    case SDL_PIXELFORMAT_BGR24:
aschiffler@6727
   533
        fprintf(stderr, "BGR24");
aschiffler@6727
   534
        break;
aschiffler@6727
   535
    case SDL_PIXELFORMAT_RGB888:
aschiffler@6727
   536
        fprintf(stderr, "RGB888");
aschiffler@6727
   537
        break;
aschiffler@6727
   538
    case SDL_PIXELFORMAT_BGR888:
aschiffler@6727
   539
        fprintf(stderr, "BGR888");
aschiffler@6727
   540
        break;
aschiffler@6727
   541
    case SDL_PIXELFORMAT_ARGB8888:
aschiffler@6727
   542
        fprintf(stderr, "ARGB8888");
aschiffler@6727
   543
        break;
aschiffler@6727
   544
    case SDL_PIXELFORMAT_RGBA8888:
aschiffler@6727
   545
        fprintf(stderr, "RGBA8888");
aschiffler@6727
   546
        break;
aschiffler@6727
   547
    case SDL_PIXELFORMAT_ABGR8888:
aschiffler@6727
   548
        fprintf(stderr, "ABGR8888");
aschiffler@6727
   549
        break;
aschiffler@6727
   550
    case SDL_PIXELFORMAT_BGRA8888:
aschiffler@6727
   551
        fprintf(stderr, "BGRA8888");
aschiffler@6727
   552
        break;
aschiffler@6727
   553
    case SDL_PIXELFORMAT_ARGB2101010:
aschiffler@6727
   554
        fprintf(stderr, "ARGB2101010");
aschiffler@6727
   555
        break;
aschiffler@6727
   556
    case SDL_PIXELFORMAT_YV12:
aschiffler@6727
   557
        fprintf(stderr, "YV12");
aschiffler@6727
   558
        break;
aschiffler@6727
   559
    case SDL_PIXELFORMAT_IYUV:
aschiffler@6727
   560
        fprintf(stderr, "IYUV");
aschiffler@6727
   561
        break;
aschiffler@6727
   562
    case SDL_PIXELFORMAT_YUY2:
aschiffler@6727
   563
        fprintf(stderr, "YUY2");
aschiffler@6727
   564
        break;
aschiffler@6727
   565
    case SDL_PIXELFORMAT_UYVY:
aschiffler@6727
   566
        fprintf(stderr, "UYVY");
aschiffler@6727
   567
        break;
aschiffler@6727
   568
    case SDL_PIXELFORMAT_YVYU:
aschiffler@6727
   569
        fprintf(stderr, "YVYU");
aschiffler@6727
   570
        break;
aschiffler@6727
   571
    default:
aschiffler@6727
   572
        fprintf(stderr, "0x%8.8x", format);
aschiffler@6727
   573
        break;
aschiffler@6727
   574
    }
aschiffler@6727
   575
}
aschiffler@6727
   576
aschiffler@6727
   577
static void
aschiffler@6727
   578
SDLTest_PrintRenderer(SDL_RendererInfo * info)
aschiffler@6727
   579
{
aschiffler@6727
   580
    int i, count;
aschiffler@6727
   581
aschiffler@6727
   582
    fprintf(stderr, "  Renderer %s:\n", info->name);
aschiffler@6727
   583
aschiffler@6727
   584
    fprintf(stderr, "    Flags: 0x%8.8X", info->flags);
aschiffler@6727
   585
    fprintf(stderr, " (");
aschiffler@6727
   586
    count = 0;
aschiffler@6727
   587
    for (i = 0; i < sizeof(info->flags) * 8; ++i) {
aschiffler@6727
   588
        Uint32 flag = (1 << i);
aschiffler@6727
   589
        if (info->flags & flag) {
aschiffler@6727
   590
            if (count > 0) {
aschiffler@6727
   591
                fprintf(stderr, " | ");
aschiffler@6727
   592
            }
aschiffler@6727
   593
            SDLTest_PrintRendererFlag(flag);
aschiffler@6727
   594
            ++count;
aschiffler@6727
   595
        }
aschiffler@6727
   596
    }
aschiffler@6727
   597
    fprintf(stderr, ")\n");
aschiffler@6727
   598
aschiffler@6727
   599
    fprintf(stderr, "    Texture formats (%d): ", info->num_texture_formats);
aschiffler@6727
   600
    for (i = 0; i < (int) info->num_texture_formats; ++i) {
aschiffler@6727
   601
        if (i > 0) {
aschiffler@6727
   602
            fprintf(stderr, ", ");
aschiffler@6727
   603
        }
aschiffler@6727
   604
        SDLTest_PrintPixelFormat(info->texture_formats[i]);
aschiffler@6727
   605
    }
aschiffler@6727
   606
    fprintf(stderr, "\n");
aschiffler@6727
   607
aschiffler@6727
   608
    if (info->max_texture_width || info->max_texture_height) {
aschiffler@6727
   609
        fprintf(stderr, "    Max Texture Size: %dx%d\n",
aschiffler@6727
   610
                info->max_texture_width, info->max_texture_height);
aschiffler@6727
   611
    }
aschiffler@6727
   612
}
aschiffler@6727
   613
aschiffler@6727
   614
static SDL_Surface *
aschiffler@6727
   615
SDLTest_LoadIcon(const char *file)
aschiffler@6727
   616
{
aschiffler@6727
   617
    SDL_Surface *icon;
aschiffler@6727
   618
aschiffler@6727
   619
    /* Load the icon surface */
aschiffler@6727
   620
    icon = SDL_LoadBMP(file);
aschiffler@6727
   621
    if (icon == NULL) {
aschiffler@6727
   622
        fprintf(stderr, "Couldn't load %s: %s\n", file, SDL_GetError());
aschiffler@6727
   623
        return (NULL);
aschiffler@6727
   624
    }
aschiffler@6727
   625
aschiffler@6727
   626
    if (icon->format->palette) {
aschiffler@6727
   627
        /* Set the colorkey */
aschiffler@6727
   628
        SDL_SetColorKey(icon, 1, *((Uint8 *) icon->pixels));
aschiffler@6727
   629
    }
aschiffler@6727
   630
aschiffler@6727
   631
    return (icon);
aschiffler@6727
   632
}
aschiffler@6727
   633
aschiffler@6727
   634
SDL_bool
aschiffler@6727
   635
SDLTest_CommonInit(SDLTest_CommonState * state)
aschiffler@6727
   636
{
aschiffler@6727
   637
    int i, j, m, n, w, h;
aschiffler@6727
   638
    SDL_DisplayMode fullscreen_mode;
aschiffler@6727
   639
aschiffler@6727
   640
    if (state->flags & SDL_INIT_VIDEO) {
aschiffler@6727
   641
        if (state->verbose & VERBOSE_VIDEO) {
aschiffler@6727
   642
            n = SDL_GetNumVideoDrivers();
aschiffler@6727
   643
            if (n == 0) {
aschiffler@6727
   644
                fprintf(stderr, "No built-in video drivers\n");
aschiffler@6727
   645
            } else {
aschiffler@6727
   646
                fprintf(stderr, "Built-in video drivers:");
aschiffler@6727
   647
                for (i = 0; i < n; ++i) {
aschiffler@6727
   648
                    if (i > 0) {
aschiffler@6727
   649
                        fprintf(stderr, ",");
aschiffler@6727
   650
                    }
aschiffler@6727
   651
                    fprintf(stderr, " %s", SDL_GetVideoDriver(i));
aschiffler@6727
   652
                }
aschiffler@6727
   653
                fprintf(stderr, "\n");
aschiffler@6727
   654
            }
aschiffler@6727
   655
        }
aschiffler@6727
   656
        if (SDL_VideoInit(state->videodriver) < 0) {
aschiffler@6727
   657
            fprintf(stderr, "Couldn't initialize video driver: %s\n",
aschiffler@6727
   658
                    SDL_GetError());
aschiffler@6727
   659
            return SDL_FALSE;
aschiffler@6727
   660
        }
aschiffler@6727
   661
        if (state->verbose & VERBOSE_VIDEO) {
aschiffler@6727
   662
            fprintf(stderr, "Video driver: %s\n",
aschiffler@6727
   663
                    SDL_GetCurrentVideoDriver());
aschiffler@6727
   664
        }
aschiffler@6727
   665
aschiffler@6727
   666
        /* Upload GL settings */
aschiffler@6727
   667
        SDL_GL_SetAttribute(SDL_GL_RED_SIZE, state->gl_red_size);
aschiffler@6727
   668
        SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, state->gl_green_size);
aschiffler@6727
   669
        SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, state->gl_blue_size);
aschiffler@6727
   670
        SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, state->gl_alpha_size);
aschiffler@6727
   671
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, state->gl_double_buffer);
aschiffler@6727
   672
        SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, state->gl_buffer_size);
aschiffler@6727
   673
        SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, state->gl_depth_size);
aschiffler@6727
   674
        SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, state->gl_stencil_size);
aschiffler@6727
   675
        SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, state->gl_accum_red_size);
aschiffler@6727
   676
        SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, state->gl_accum_green_size);
aschiffler@6727
   677
        SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, state->gl_accum_blue_size);
aschiffler@6727
   678
        SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, state->gl_accum_alpha_size);
aschiffler@6727
   679
        SDL_GL_SetAttribute(SDL_GL_STEREO, state->gl_stereo);
aschiffler@6727
   680
        SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, state->gl_multisamplebuffers);
aschiffler@6727
   681
        SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, state->gl_multisamplesamples);
aschiffler@6727
   682
        if (state->gl_accelerated >= 0) {
aschiffler@6727
   683
            SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL,
aschiffler@6727
   684
                                state->gl_accelerated);
aschiffler@6727
   685
        }
aschiffler@6727
   686
        SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, state->gl_retained_backing);
aschiffler@6727
   687
        if (state->gl_major_version) {
aschiffler@6727
   688
            SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, state->gl_major_version);
aschiffler@6727
   689
            SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, state->gl_minor_version);
aschiffler@6727
   690
        }
slouken@7194
   691
        if (state->gl_debug) {
slouken@7194
   692
            SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG);
slouken@7194
   693
        }
aschiffler@6727
   694
aschiffler@6727
   695
        if (state->verbose & VERBOSE_MODES) {
aschiffler@6727
   696
            SDL_Rect bounds;
aschiffler@6727
   697
            SDL_DisplayMode mode;
aschiffler@6727
   698
            int bpp;
aschiffler@6727
   699
            Uint32 Rmask, Gmask, Bmask, Amask;
aschiffler@6727
   700
aschiffler@6727
   701
            n = SDL_GetNumVideoDisplays();
aschiffler@6727
   702
            fprintf(stderr, "Number of displays: %d\n", n);
aschiffler@6727
   703
            for (i = 0; i < n; ++i) {
slouken@6796
   704
                fprintf(stderr, "Display %d: %s\n", i, SDL_GetDisplayName(i));
aschiffler@6727
   705
aschiffler@6727
   706
                SDL_zero(bounds);
aschiffler@6727
   707
                SDL_GetDisplayBounds(i, &bounds);
aschiffler@6727
   708
                fprintf(stderr, "Bounds: %dx%d at %d,%d\n", bounds.w, bounds.h, bounds.x, bounds.y);
aschiffler@6727
   709
aschiffler@6727
   710
                SDL_GetDesktopDisplayMode(i, &mode);
aschiffler@6727
   711
                SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask, &Gmask,
aschiffler@6727
   712
                                           &Bmask, &Amask);
aschiffler@6727
   713
                fprintf(stderr,
aschiffler@6727
   714
                        "  Current mode: %dx%d@%dHz, %d bits-per-pixel (%s)\n",
aschiffler@6727
   715
                        mode.w, mode.h, mode.refresh_rate, bpp,
aschiffler@6727
   716
                        SDL_GetPixelFormatName(mode.format));
aschiffler@6727
   717
                if (Rmask || Gmask || Bmask) {
aschiffler@6727
   718
                    fprintf(stderr, "      Red Mask   = 0x%.8x\n", Rmask);
aschiffler@6727
   719
                    fprintf(stderr, "      Green Mask = 0x%.8x\n", Gmask);
aschiffler@6727
   720
                    fprintf(stderr, "      Blue Mask  = 0x%.8x\n", Bmask);
aschiffler@6727
   721
                    if (Amask)
aschiffler@6727
   722
                        fprintf(stderr, "      Alpha Mask = 0x%.8x\n", Amask);
aschiffler@6727
   723
                }
aschiffler@6727
   724
aschiffler@6727
   725
                /* Print available fullscreen video modes */
aschiffler@6727
   726
                m = SDL_GetNumDisplayModes(i);
aschiffler@6727
   727
                if (m == 0) {
aschiffler@6727
   728
                    fprintf(stderr, "No available fullscreen video modes\n");
aschiffler@6727
   729
                } else {
aschiffler@6727
   730
                    fprintf(stderr, "  Fullscreen video modes:\n");
aschiffler@6727
   731
                    for (j = 0; j < m; ++j) {
aschiffler@6727
   732
                        SDL_GetDisplayMode(i, j, &mode);
aschiffler@6727
   733
                        SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask,
aschiffler@6727
   734
                                                   &Gmask, &Bmask, &Amask);
aschiffler@6727
   735
                        fprintf(stderr,
aschiffler@6727
   736
                                "    Mode %d: %dx%d@%dHz, %d bits-per-pixel (%s)\n",
aschiffler@6727
   737
                                j, mode.w, mode.h, mode.refresh_rate, bpp,
aschiffler@6727
   738
                                SDL_GetPixelFormatName(mode.format));
aschiffler@6727
   739
                        if (Rmask || Gmask || Bmask) {
aschiffler@6727
   740
                            fprintf(stderr, "        Red Mask   = 0x%.8x\n",
aschiffler@6727
   741
                                    Rmask);
aschiffler@6727
   742
                            fprintf(stderr, "        Green Mask = 0x%.8x\n",
aschiffler@6727
   743
                                    Gmask);
aschiffler@6727
   744
                            fprintf(stderr, "        Blue Mask  = 0x%.8x\n",
aschiffler@6727
   745
                                    Bmask);
aschiffler@6727
   746
                            if (Amask)
aschiffler@6727
   747
                                fprintf(stderr,
aschiffler@6727
   748
                                        "        Alpha Mask = 0x%.8x\n",
aschiffler@6727
   749
                                        Amask);
aschiffler@6727
   750
                        }
aschiffler@6727
   751
                    }
aschiffler@6727
   752
                }
aschiffler@6727
   753
            }
aschiffler@6727
   754
        }
aschiffler@6727
   755
aschiffler@6727
   756
        if (state->verbose & VERBOSE_RENDER) {
aschiffler@6727
   757
            SDL_RendererInfo info;
aschiffler@6727
   758
aschiffler@6727
   759
            n = SDL_GetNumRenderDrivers();
aschiffler@6727
   760
            if (n == 0) {
aschiffler@6727
   761
                fprintf(stderr, "No built-in render drivers\n");
aschiffler@6727
   762
            } else {
aschiffler@6727
   763
                fprintf(stderr, "Built-in render drivers:\n");
aschiffler@6727
   764
                for (i = 0; i < n; ++i) {
aschiffler@6727
   765
                    SDL_GetRenderDriverInfo(i, &info);
aschiffler@6727
   766
                    SDLTest_PrintRenderer(&info);
aschiffler@6727
   767
                }
aschiffler@6727
   768
            }
aschiffler@6727
   769
        }
aschiffler@6727
   770
aschiffler@6727
   771
        SDL_zero(fullscreen_mode);
aschiffler@6727
   772
        switch (state->depth) {
aschiffler@6727
   773
        case 8:
aschiffler@6727
   774
            fullscreen_mode.format = SDL_PIXELFORMAT_INDEX8;
aschiffler@6727
   775
            break;
aschiffler@6727
   776
        case 15:
aschiffler@6727
   777
            fullscreen_mode.format = SDL_PIXELFORMAT_RGB555;
aschiffler@6727
   778
            break;
aschiffler@6727
   779
        case 16:
aschiffler@6727
   780
            fullscreen_mode.format = SDL_PIXELFORMAT_RGB565;
aschiffler@6727
   781
            break;
aschiffler@6727
   782
        case 24:
aschiffler@6727
   783
            fullscreen_mode.format = SDL_PIXELFORMAT_RGB24;
aschiffler@6727
   784
            break;
aschiffler@6727
   785
        default:
aschiffler@6727
   786
            fullscreen_mode.format = SDL_PIXELFORMAT_RGB888;
aschiffler@6727
   787
            break;
aschiffler@6727
   788
        }
aschiffler@6727
   789
        fullscreen_mode.refresh_rate = state->refresh_rate;
aschiffler@6727
   790
aschiffler@6727
   791
        state->windows =
aschiffler@6727
   792
            (SDL_Window **) SDL_malloc(state->num_windows *
aschiffler@6727
   793
                                        sizeof(*state->windows));
aschiffler@6727
   794
        state->renderers =
aschiffler@6727
   795
            (SDL_Renderer **) SDL_malloc(state->num_windows *
aschiffler@6727
   796
                                        sizeof(*state->renderers));
aschiffler@6727
   797
        if (!state->windows || !state->renderers) {
aschiffler@6727
   798
            fprintf(stderr, "Out of memory!\n");
aschiffler@6727
   799
            return SDL_FALSE;
aschiffler@6727
   800
        }
aschiffler@6727
   801
        for (i = 0; i < state->num_windows; ++i) {
aschiffler@6727
   802
            char title[1024];
aschiffler@6727
   803
aschiffler@6727
   804
            if (state->num_windows > 1) {
aschiffler@6727
   805
                SDL_snprintf(title, SDL_arraysize(title), "%s %d",
aschiffler@6727
   806
                             state->window_title, i + 1);
aschiffler@6727
   807
            } else {
aschiffler@6727
   808
                SDL_strlcpy(title, state->window_title, SDL_arraysize(title));
aschiffler@6727
   809
            }
aschiffler@6727
   810
            state->windows[i] =
aschiffler@6727
   811
                SDL_CreateWindow(title, state->window_x, state->window_y,
aschiffler@6727
   812
                                 state->window_w, state->window_h,
aschiffler@6727
   813
                                 state->window_flags);
aschiffler@6727
   814
            if (!state->windows[i]) {
aschiffler@6727
   815
                fprintf(stderr, "Couldn't create window: %s\n",
aschiffler@6727
   816
                        SDL_GetError());
aschiffler@6727
   817
                return SDL_FALSE;
aschiffler@6727
   818
            }
slouken@6788
   819
            if (state->window_minW || state->window_minH) {
slouken@6788
   820
                SDL_SetWindowMinimumSize(state->windows[i], state->window_minW, state->window_minH);
slouken@6788
   821
            }
slouken@6788
   822
            if (state->window_maxW || state->window_maxH) {
slouken@6788
   823
                SDL_SetWindowMaximumSize(state->windows[i], state->window_maxW, state->window_maxH);
slouken@6788
   824
            }
aschiffler@6727
   825
            SDL_GetWindowSize(state->windows[i], &w, &h);
aschiffler@6727
   826
            if (!(state->window_flags & SDL_WINDOW_RESIZABLE) &&
aschiffler@6727
   827
                (w != state->window_w || h != state->window_h)) {
aschiffler@6727
   828
                printf("Window requested size %dx%d, got %dx%d\n", state->window_w, state->window_h, w, h);
aschiffler@6727
   829
                state->window_w = w;
aschiffler@6727
   830
                state->window_h = h;
aschiffler@6727
   831
            }
aschiffler@6727
   832
            if (SDL_SetWindowDisplayMode(state->windows[i], &fullscreen_mode) < 0) {
aschiffler@6727
   833
                fprintf(stderr, "Can't set up fullscreen display mode: %s\n",
aschiffler@6727
   834
                        SDL_GetError());
aschiffler@6727
   835
                return SDL_FALSE;
aschiffler@6727
   836
            }
aschiffler@6727
   837
aschiffler@6727
   838
            if (state->window_icon) {
aschiffler@6727
   839
                SDL_Surface *icon = SDLTest_LoadIcon(state->window_icon);
aschiffler@6727
   840
                if (icon) {
aschiffler@6727
   841
                    SDL_SetWindowIcon(state->windows[i], icon);
aschiffler@6727
   842
                    SDL_FreeSurface(icon);
aschiffler@6727
   843
                }
aschiffler@6727
   844
            }
aschiffler@6727
   845
aschiffler@6727
   846
            SDL_ShowWindow(state->windows[i]);
aschiffler@6727
   847
aschiffler@6727
   848
            state->renderers[i] = NULL;
aschiffler@6727
   849
aschiffler@6727
   850
            if (!state->skip_renderer
aschiffler@6727
   851
                && (state->renderdriver
aschiffler@6727
   852
                    || !(state->window_flags & SDL_WINDOW_OPENGL))) {
aschiffler@6727
   853
                m = -1;
aschiffler@6727
   854
                if (state->renderdriver) {
aschiffler@6727
   855
                    SDL_RendererInfo info;
aschiffler@6727
   856
                    n = SDL_GetNumRenderDrivers();
aschiffler@6727
   857
                    for (j = 0; j < n; ++j) {
aschiffler@6727
   858
                        SDL_GetRenderDriverInfo(j, &info);
aschiffler@6727
   859
                        if (SDL_strcasecmp(info.name, state->renderdriver) ==
aschiffler@6727
   860
                            0) {
aschiffler@6727
   861
                            m = j;
aschiffler@6727
   862
                            break;
aschiffler@6727
   863
                        }
aschiffler@6727
   864
                    }
aschiffler@6727
   865
                    if (m == n) {
aschiffler@6727
   866
                        fprintf(stderr,
aschiffler@6727
   867
                                "Couldn't find render driver named %s",
aschiffler@6727
   868
                                state->renderdriver);
aschiffler@6727
   869
                        return SDL_FALSE;
aschiffler@6727
   870
                    }
aschiffler@6727
   871
                }
aschiffler@6727
   872
                state->renderers[i] = SDL_CreateRenderer(state->windows[i],
aschiffler@6727
   873
                                            m, state->render_flags);
aschiffler@6727
   874
                if (!state->renderers[i]) {
aschiffler@6727
   875
                    fprintf(stderr, "Couldn't create renderer: %s\n",
aschiffler@6727
   876
                            SDL_GetError());
aschiffler@6727
   877
                    return SDL_FALSE;
aschiffler@6727
   878
                }
slouken@7240
   879
                if (state->logical_w && state->logical_h) {
slouken@7240
   880
                    SDL_RenderSetLogicalSize(state->renderers[i], state->logical_w, state->logical_h);
slouken@7240
   881
                } else if (state->scale) {
slouken@7240
   882
                    SDL_RenderSetScale(state->renderers[i], state->scale, state->scale);
slouken@7240
   883
                }
aschiffler@6727
   884
                if (state->verbose & VERBOSE_RENDER) {
aschiffler@6727
   885
                    SDL_RendererInfo info;
aschiffler@6727
   886
aschiffler@6727
   887
                    fprintf(stderr, "Current renderer:\n");
aschiffler@6727
   888
                    SDL_GetRendererInfo(state->renderers[i], &info);
aschiffler@6727
   889
                    SDLTest_PrintRenderer(&info);
aschiffler@6727
   890
                }
aschiffler@6727
   891
            }
aschiffler@6727
   892
        }
aschiffler@6727
   893
    }
aschiffler@6727
   894
aschiffler@6727
   895
    if (state->flags & SDL_INIT_AUDIO) {
aschiffler@6727
   896
        if (state->verbose & VERBOSE_AUDIO) {
aschiffler@6727
   897
            n = SDL_GetNumAudioDrivers();
aschiffler@6727
   898
            if (n == 0) {
aschiffler@6727
   899
                fprintf(stderr, "No built-in audio drivers\n");
aschiffler@6727
   900
            } else {
aschiffler@6727
   901
                fprintf(stderr, "Built-in audio drivers:");
aschiffler@6727
   902
                for (i = 0; i < n; ++i) {
aschiffler@6727
   903
                    if (i > 0) {
aschiffler@6727
   904
                        fprintf(stderr, ",");
aschiffler@6727
   905
                    }
aschiffler@6727
   906
                    fprintf(stderr, " %s", SDL_GetAudioDriver(i));
aschiffler@6727
   907
                }
aschiffler@6727
   908
                fprintf(stderr, "\n");
aschiffler@6727
   909
            }
aschiffler@6727
   910
        }
aschiffler@6727
   911
        if (SDL_AudioInit(state->audiodriver) < 0) {
aschiffler@6727
   912
            fprintf(stderr, "Couldn't initialize audio driver: %s\n",
aschiffler@6727
   913
                    SDL_GetError());
aschiffler@6727
   914
            return SDL_FALSE;
aschiffler@6727
   915
        }
aschiffler@6727
   916
        if (state->verbose & VERBOSE_VIDEO) {
aschiffler@6727
   917
            fprintf(stderr, "Audio driver: %s\n",
aschiffler@6727
   918
                    SDL_GetCurrentAudioDriver());
aschiffler@6727
   919
        }
aschiffler@6727
   920
aschiffler@6727
   921
        if (SDL_OpenAudio(&state->audiospec, NULL) < 0) {
aschiffler@6727
   922
            fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
aschiffler@6727
   923
            return SDL_FALSE;
aschiffler@6727
   924
        }
aschiffler@6727
   925
    }
aschiffler@6727
   926
aschiffler@6727
   927
    return SDL_TRUE;
aschiffler@6727
   928
}
aschiffler@6727
   929
aschiffler@6727
   930
static void
aschiffler@6727
   931
SDLTest_PrintEvent(SDL_Event * event)
aschiffler@6727
   932
{
aschiffler@6727
   933
    if (event->type == SDL_MOUSEMOTION) {
aschiffler@6727
   934
        /* Mouse motion is really spammy */
slouken@7191
   935
        return;
aschiffler@6727
   936
    }
aschiffler@6727
   937
aschiffler@6727
   938
    fprintf(stderr, "SDL EVENT: ");
aschiffler@6727
   939
    switch (event->type) {
aschiffler@6727
   940
    case SDL_WINDOWEVENT:
aschiffler@6727
   941
        switch (event->window.event) {
aschiffler@6727
   942
        case SDL_WINDOWEVENT_SHOWN:
aschiffler@6727
   943
            fprintf(stderr, "Window %d shown", event->window.windowID);
aschiffler@6727
   944
            break;
aschiffler@6727
   945
        case SDL_WINDOWEVENT_HIDDEN:
aschiffler@6727
   946
            fprintf(stderr, "Window %d hidden", event->window.windowID);
aschiffler@6727
   947
            break;
aschiffler@6727
   948
        case SDL_WINDOWEVENT_EXPOSED:
aschiffler@6727
   949
            fprintf(stderr, "Window %d exposed", event->window.windowID);
aschiffler@6727
   950
            break;
aschiffler@6727
   951
        case SDL_WINDOWEVENT_MOVED:
aschiffler@6727
   952
            fprintf(stderr, "Window %d moved to %d,%d",
aschiffler@6727
   953
                    event->window.windowID, event->window.data1,
aschiffler@6727
   954
                    event->window.data2);
aschiffler@6727
   955
            break;
aschiffler@6727
   956
        case SDL_WINDOWEVENT_RESIZED:
aschiffler@6727
   957
            fprintf(stderr, "Window %d resized to %dx%d",
aschiffler@6727
   958
                    event->window.windowID, event->window.data1,
aschiffler@6727
   959
                    event->window.data2);
aschiffler@6727
   960
            break;
aschiffler@6727
   961
        case SDL_WINDOWEVENT_SIZE_CHANGED:
aschiffler@6727
   962
            fprintf(stderr, "Window %d changed size to %dx%d",
aschiffler@6727
   963
                    event->window.windowID, event->window.data1,
aschiffler@6727
   964
                    event->window.data2);
aschiffler@6727
   965
            break;
aschiffler@6727
   966
        case SDL_WINDOWEVENT_MINIMIZED:
aschiffler@6727
   967
            fprintf(stderr, "Window %d minimized", event->window.windowID);
aschiffler@6727
   968
            break;
aschiffler@6727
   969
        case SDL_WINDOWEVENT_MAXIMIZED:
aschiffler@6727
   970
            fprintf(stderr, "Window %d maximized", event->window.windowID);
aschiffler@6727
   971
            break;
aschiffler@6727
   972
        case SDL_WINDOWEVENT_RESTORED:
aschiffler@6727
   973
            fprintf(stderr, "Window %d restored", event->window.windowID);
aschiffler@6727
   974
            break;
aschiffler@6727
   975
        case SDL_WINDOWEVENT_ENTER:
aschiffler@6727
   976
            fprintf(stderr, "Mouse entered window %d",
aschiffler@6727
   977
                    event->window.windowID);
aschiffler@6727
   978
            break;
aschiffler@6727
   979
        case SDL_WINDOWEVENT_LEAVE:
aschiffler@6727
   980
            fprintf(stderr, "Mouse left window %d", event->window.windowID);
aschiffler@6727
   981
            break;
aschiffler@6727
   982
        case SDL_WINDOWEVENT_FOCUS_GAINED:
aschiffler@6727
   983
            fprintf(stderr, "Window %d gained keyboard focus",
aschiffler@6727
   984
                    event->window.windowID);
aschiffler@6727
   985
            break;
aschiffler@6727
   986
        case SDL_WINDOWEVENT_FOCUS_LOST:
aschiffler@6727
   987
            fprintf(stderr, "Window %d lost keyboard focus",
aschiffler@6727
   988
                    event->window.windowID);
aschiffler@6727
   989
            break;
aschiffler@6727
   990
        case SDL_WINDOWEVENT_CLOSE:
aschiffler@6727
   991
            fprintf(stderr, "Window %d closed", event->window.windowID);
aschiffler@6727
   992
            break;
aschiffler@6727
   993
        default:
aschiffler@6727
   994
            fprintf(stderr, "Window %d got unknown event %d",
aschiffler@6727
   995
                    event->window.windowID, event->window.event);
aschiffler@6727
   996
            break;
aschiffler@6727
   997
        }
aschiffler@6727
   998
        break;
aschiffler@6727
   999
    case SDL_KEYDOWN:
aschiffler@6727
  1000
        fprintf(stderr,
aschiffler@6727
  1001
                "Keyboard: key pressed  in window %d: scancode 0x%08X = %s, keycode 0x%08X = %s",
aschiffler@6727
  1002
                event->key.windowID,
aschiffler@6727
  1003
                event->key.keysym.scancode,
aschiffler@6727
  1004
                SDL_GetScancodeName(event->key.keysym.scancode),
aschiffler@6727
  1005
                event->key.keysym.sym, SDL_GetKeyName(event->key.keysym.sym));
aschiffler@6727
  1006
        break;
aschiffler@6727
  1007
    case SDL_KEYUP:
aschiffler@6727
  1008
        fprintf(stderr,
aschiffler@6727
  1009
                "Keyboard: key released in window %d: scancode 0x%08X = %s, keycode 0x%08X = %s",
aschiffler@6727
  1010
                event->key.windowID,
aschiffler@6727
  1011
                event->key.keysym.scancode,
aschiffler@6727
  1012
                SDL_GetScancodeName(event->key.keysym.scancode),
aschiffler@6727
  1013
                event->key.keysym.sym, SDL_GetKeyName(event->key.keysym.sym));
aschiffler@6727
  1014
        break;
aschiffler@6727
  1015
    case SDL_TEXTINPUT:
aschiffler@6727
  1016
        fprintf(stderr, "Keyboard: text input \"%s\" in window %d",
aschiffler@6727
  1017
                event->text.text, event->text.windowID);
aschiffler@6727
  1018
        break;
aschiffler@6727
  1019
    case SDL_MOUSEMOTION:
aschiffler@6727
  1020
        fprintf(stderr, "Mouse: moved to %d,%d (%d,%d) in window %d",
aschiffler@6727
  1021
                event->motion.x, event->motion.y,
aschiffler@6727
  1022
                event->motion.xrel, event->motion.yrel,
aschiffler@6727
  1023
                event->motion.windowID);
aschiffler@6727
  1024
        break;
aschiffler@6727
  1025
    case SDL_MOUSEBUTTONDOWN:
aschiffler@6727
  1026
        fprintf(stderr, "Mouse: button %d pressed at %d,%d in window %d",
aschiffler@6727
  1027
                event->button.button, event->button.x, event->button.y,
aschiffler@6727
  1028
                event->button.windowID);
aschiffler@6727
  1029
        break;
aschiffler@6727
  1030
    case SDL_MOUSEBUTTONUP:
aschiffler@6727
  1031
        fprintf(stderr, "Mouse: button %d released at %d,%d in window %d",
aschiffler@6727
  1032
                event->button.button, event->button.x, event->button.y,
aschiffler@6727
  1033
                event->button.windowID);
aschiffler@6727
  1034
        break;
aschiffler@6727
  1035
    case SDL_MOUSEWHEEL:
aschiffler@6727
  1036
        fprintf(stderr,
aschiffler@6727
  1037
                "Mouse: wheel scrolled %d in x and %d in y in window %d",
aschiffler@6727
  1038
                event->wheel.x, event->wheel.y, event->wheel.windowID);
aschiffler@6727
  1039
        break;
aschiffler@6727
  1040
    case SDL_JOYBALLMOTION:
aschiffler@6727
  1041
        fprintf(stderr, "Joystick %d: ball %d moved by %d,%d",
aschiffler@6727
  1042
                event->jball.which, event->jball.ball, event->jball.xrel,
aschiffler@6727
  1043
                event->jball.yrel);
aschiffler@6727
  1044
        break;
aschiffler@6727
  1045
    case SDL_JOYHATMOTION:
aschiffler@6727
  1046
        fprintf(stderr, "Joystick %d: hat %d moved to ", event->jhat.which,
aschiffler@6727
  1047
                event->jhat.hat);
aschiffler@6727
  1048
        switch (event->jhat.value) {
aschiffler@6727
  1049
        case SDL_HAT_CENTERED:
aschiffler@6727
  1050
            fprintf(stderr, "CENTER");
aschiffler@6727
  1051
            break;
aschiffler@6727
  1052
        case SDL_HAT_UP:
aschiffler@6727
  1053
            fprintf(stderr, "UP");
aschiffler@6727
  1054
            break;
aschiffler@6727
  1055
        case SDL_HAT_RIGHTUP:
aschiffler@6727
  1056
            fprintf(stderr, "RIGHTUP");
aschiffler@6727
  1057
            break;
aschiffler@6727
  1058
        case SDL_HAT_RIGHT:
aschiffler@6727
  1059
            fprintf(stderr, "RIGHT");
aschiffler@6727
  1060
            break;
aschiffler@6727
  1061
        case SDL_HAT_RIGHTDOWN:
aschiffler@6727
  1062
            fprintf(stderr, "RIGHTDOWN");
aschiffler@6727
  1063
            break;
aschiffler@6727
  1064
        case SDL_HAT_DOWN:
aschiffler@6727
  1065
            fprintf(stderr, "DOWN");
aschiffler@6727
  1066
            break;
aschiffler@6727
  1067
        case SDL_HAT_LEFTDOWN:
aschiffler@6727
  1068
            fprintf(stderr, "LEFTDOWN");
aschiffler@6727
  1069
            break;
aschiffler@6727
  1070
        case SDL_HAT_LEFT:
aschiffler@6727
  1071
            fprintf(stderr, "LEFT");
aschiffler@6727
  1072
            break;
aschiffler@6727
  1073
        case SDL_HAT_LEFTUP:
aschiffler@6727
  1074
            fprintf(stderr, "LEFTUP");
aschiffler@6727
  1075
            break;
aschiffler@6727
  1076
        default:
aschiffler@6727
  1077
            fprintf(stderr, "UNKNOWN");
aschiffler@6727
  1078
            break;
aschiffler@6727
  1079
        }
aschiffler@6727
  1080
        break;
aschiffler@6727
  1081
    case SDL_JOYBUTTONDOWN:
aschiffler@6727
  1082
        fprintf(stderr, "Joystick %d: button %d pressed",
aschiffler@6727
  1083
                event->jbutton.which, event->jbutton.button);
aschiffler@6727
  1084
        break;
aschiffler@6727
  1085
    case SDL_JOYBUTTONUP:
aschiffler@6727
  1086
        fprintf(stderr, "Joystick %d: button %d released",
aschiffler@6727
  1087
                event->jbutton.which, event->jbutton.button);
aschiffler@6727
  1088
        break;
aschiffler@6727
  1089
    case SDL_CLIPBOARDUPDATE:
aschiffler@6727
  1090
        fprintf(stderr, "Clipboard updated");
aschiffler@6727
  1091
        break;
aschiffler@6727
  1092
    case SDL_QUIT:
aschiffler@6727
  1093
        fprintf(stderr, "Quit requested");
aschiffler@6727
  1094
        break;
aschiffler@6727
  1095
    case SDL_USEREVENT:
aschiffler@6727
  1096
        fprintf(stderr, "User event %d", event->user.code);
aschiffler@6727
  1097
        break;
aschiffler@6727
  1098
    default:
aschiffler@6727
  1099
        fprintf(stderr, "Unknown event %d", event->type);
aschiffler@6727
  1100
        break;
aschiffler@6727
  1101
    }
aschiffler@6727
  1102
    fprintf(stderr, "\n");
aschiffler@6727
  1103
}
aschiffler@6727
  1104
aschiffler@6727
  1105
static void
aschiffler@6727
  1106
SDLTest_ScreenShot(SDL_Renderer *renderer)
aschiffler@6727
  1107
{
aschiffler@6727
  1108
    SDL_Rect viewport;
aschiffler@6727
  1109
    SDL_Surface *surface;
aschiffler@6727
  1110
aschiffler@6727
  1111
    if (!renderer) {
aschiffler@6727
  1112
        return;
aschiffler@6727
  1113
    }
aschiffler@6727
  1114
aschiffler@6727
  1115
    SDL_RenderGetViewport(renderer, &viewport);
aschiffler@6727
  1116
    surface = SDL_CreateRGBSurface(0, viewport.w, viewport.h, 24,
aschiffler@6727
  1117
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
aschiffler@6727
  1118
                    0x00FF0000, 0x0000FF00, 0x000000FF,
aschiffler@6727
  1119
#else
aschiffler@6727
  1120
                    0x000000FF, 0x0000FF00, 0x00FF0000,
aschiffler@6727
  1121
#endif
aschiffler@6727
  1122
                    0x00000000);
aschiffler@6727
  1123
    if (!surface) {
aschiffler@6727
  1124
        fprintf(stderr, "Couldn't create surface: %s\n", SDL_GetError());
aschiffler@6727
  1125
        return;
aschiffler@6727
  1126
    }
aschiffler@6727
  1127
aschiffler@6727
  1128
    if (SDL_RenderReadPixels(renderer, NULL, surface->format->format,
aschiffler@6727
  1129
                             surface->pixels, surface->pitch) < 0) {
aschiffler@6727
  1130
        fprintf(stderr, "Couldn't read screen: %s\n", SDL_GetError());
aschiffler@6727
  1131
        return;
aschiffler@6727
  1132
    }
aschiffler@6727
  1133
aschiffler@6727
  1134
    if (SDL_SaveBMP(surface, "screenshot.bmp") < 0) {
aschiffler@6727
  1135
        fprintf(stderr, "Couldn't save screenshot.bmp: %s\n", SDL_GetError());
aschiffler@6727
  1136
        return;
aschiffler@6727
  1137
    }
aschiffler@6727
  1138
}
aschiffler@6727
  1139
slouken@7191
  1140
static void
jorgen@7092
  1141
FullscreenTo(int index, int windowId)
jorgen@7092
  1142
{
jorgen@7092
  1143
    Uint32 flags;
jorgen@7092
  1144
    struct SDL_Rect rect = { 0, 0, 0, 0 };
jorgen@7092
  1145
    SDL_Window *window = SDL_GetWindowFromID(windowId);
jorgen@7092
  1146
    if (!window) {
jorgen@7092
  1147
        return;
jorgen@7092
  1148
    }
jorgen@7092
  1149
jorgen@7092
  1150
    SDL_GetDisplayBounds( index, &rect );
jorgen@7092
  1151
jorgen@7092
  1152
    flags = SDL_GetWindowFlags(window);
jorgen@7092
  1153
    if (flags & SDL_WINDOW_FULLSCREEN) {
jorgen@7092
  1154
        SDL_SetWindowFullscreen( window, SDL_FALSE );
jorgen@7092
  1155
        SDL_Delay( 15 );
jorgen@7092
  1156
    }
jorgen@7092
  1157
jorgen@7092
  1158
    SDL_SetWindowPosition( window, rect.x, rect.y );
jorgen@7092
  1159
    SDL_SetWindowFullscreen( window, SDL_TRUE );
jorgen@7092
  1160
}
jorgen@7092
  1161
aschiffler@6727
  1162
void
aschiffler@6727
  1163
SDLTest_CommonEvent(SDLTest_CommonState * state, SDL_Event * event, int *done)
aschiffler@6727
  1164
{
aschiffler@6727
  1165
    int i;
jorgen@7092
  1166
    static SDL_MouseMotionEvent lastEvent;
aschiffler@6727
  1167
aschiffler@6727
  1168
    if (state->verbose & VERBOSE_EVENT) {
aschiffler@6727
  1169
        SDLTest_PrintEvent(event);
aschiffler@6727
  1170
    }
aschiffler@6727
  1171
aschiffler@6727
  1172
    switch (event->type) {
aschiffler@6727
  1173
    case SDL_WINDOWEVENT:
aschiffler@6727
  1174
        switch (event->window.event) {
aschiffler@6727
  1175
        case SDL_WINDOWEVENT_CLOSE:
slouken@7191
  1176
            {
aschiffler@6727
  1177
                SDL_Window *window = SDL_GetWindowFromID(event->window.windowID);
aschiffler@6727
  1178
                if (window) {
slouken@7191
  1179
                    SDL_DestroyWindow(window);
slouken@7191
  1180
                }
slouken@7191
  1181
            }
aschiffler@6727
  1182
            break;
aschiffler@6727
  1183
        }
aschiffler@6727
  1184
        break;
aschiffler@6727
  1185
    case SDL_KEYDOWN:
aschiffler@6727
  1186
        switch (event->key.keysym.sym) {
aschiffler@6727
  1187
            /* Add hotkeys here */
aschiffler@6727
  1188
        case SDLK_PRINTSCREEN: {
aschiffler@6727
  1189
                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
aschiffler@6727
  1190
                if (window) {
aschiffler@6727
  1191
                    for (i = 0; i < state->num_windows; ++i) {
aschiffler@6727
  1192
                        if (window == state->windows[i]) {
aschiffler@6727
  1193
                            SDLTest_ScreenShot(state->renderers[i]);
aschiffler@6727
  1194
                        }
aschiffler@6727
  1195
                    }
aschiffler@6727
  1196
                }
aschiffler@6727
  1197
            }
aschiffler@6727
  1198
            break;
aschiffler@6727
  1199
        case SDLK_EQUALS:
aschiffler@6727
  1200
            if (event->key.keysym.mod & KMOD_CTRL) {
aschiffler@6727
  1201
                /* Ctrt-+ double the size of the window */
aschiffler@6727
  1202
                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
aschiffler@6727
  1203
                if (window) {
aschiffler@6727
  1204
                    int w, h;
aschiffler@6727
  1205
                    SDL_GetWindowSize(window, &w, &h);
aschiffler@6727
  1206
                    SDL_SetWindowSize(window, w*2, h*2);
aschiffler@6727
  1207
                }
aschiffler@6727
  1208
            }
aschiffler@6727
  1209
            break;
aschiffler@6727
  1210
        case SDLK_MINUS:
aschiffler@6727
  1211
            if (event->key.keysym.mod & KMOD_CTRL) {
aschiffler@6727
  1212
                /* Ctrt-- double the size of the window */
aschiffler@6727
  1213
                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
aschiffler@6727
  1214
                if (window) {
aschiffler@6727
  1215
                    int w, h;
aschiffler@6727
  1216
                    SDL_GetWindowSize(window, &w, &h);
aschiffler@6727
  1217
                    SDL_SetWindowSize(window, w/2, h/2);
aschiffler@6727
  1218
                }
aschiffler@6727
  1219
            }
aschiffler@6727
  1220
            break;
aschiffler@6727
  1221
        case SDLK_c:
aschiffler@6727
  1222
            if (event->key.keysym.mod & KMOD_CTRL) {
aschiffler@6727
  1223
                /* Ctrl-C copy awesome text! */
aschiffler@6727
  1224
                SDL_SetClipboardText("SDL rocks!\nYou know it!");
aschiffler@6727
  1225
                printf("Copied text to clipboard\n");
aschiffler@6727
  1226
            }
slouken@7141
  1227
            if (event->key.keysym.mod & KMOD_ALT) {
slouken@7141
  1228
                /* Alt-C toggle a render clip rectangle */
slouken@7141
  1229
                for (i = 0; i < state->num_windows; ++i) {
slouken@7141
  1230
                    int w, h;
slouken@7141
  1231
                    if (state->renderers[i]) {
slouken@7141
  1232
                        SDL_Rect clip;
slouken@7141
  1233
                        SDL_GetWindowSize(state->windows[i], &w, &h);
slouken@7141
  1234
                        SDL_RenderGetClipRect(state->renderers[i], &clip);
slouken@7141
  1235
                        if (SDL_RectEmpty(&clip)) {
slouken@7141
  1236
                            clip.x = w/4;
slouken@7141
  1237
                            clip.y = h/4;
slouken@7141
  1238
                            clip.w = w/2;
slouken@7141
  1239
                            clip.h = h/2;
slouken@7141
  1240
                            SDL_RenderSetClipRect(state->renderers[i], &clip);
slouken@7141
  1241
                        } else {
slouken@7141
  1242
                            SDL_RenderSetClipRect(state->renderers[i], NULL);
slouken@7141
  1243
                        }
slouken@7141
  1244
                    }
slouken@7141
  1245
                }
slouken@7141
  1246
            }
aschiffler@6727
  1247
            break;
aschiffler@6727
  1248
        case SDLK_v:
aschiffler@6727
  1249
            if (event->key.keysym.mod & KMOD_CTRL) {
aschiffler@6727
  1250
                /* Ctrl-V paste awesome text! */
aschiffler@6727
  1251
                char *text = SDL_GetClipboardText();
aschiffler@6727
  1252
                if (*text) {
aschiffler@6727
  1253
                    printf("Clipboard: %s\n", text);
aschiffler@6727
  1254
                } else {
aschiffler@6727
  1255
                    printf("Clipboard is empty\n");
aschiffler@6727
  1256
                }
aschiffler@6727
  1257
                SDL_free(text);
aschiffler@6727
  1258
            }
aschiffler@6727
  1259
            break;
aschiffler@6727
  1260
        case SDLK_g:
aschiffler@6727
  1261
            if (event->key.keysym.mod & KMOD_CTRL) {
aschiffler@6727
  1262
                /* Ctrl-G toggle grab */
aschiffler@6727
  1263
                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
aschiffler@6727
  1264
                if (window) {
aschiffler@6727
  1265
                    SDL_SetWindowGrab(window, !SDL_GetWindowGrab(window));
aschiffler@6727
  1266
                }
aschiffler@6727
  1267
            }
aschiffler@6727
  1268
            break;
aschiffler@6727
  1269
        case SDLK_m:
aschiffler@6727
  1270
            if (event->key.keysym.mod & KMOD_CTRL) {
aschiffler@6727
  1271
                /* Ctrl-M maximize */
aschiffler@6727
  1272
                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
aschiffler@6727
  1273
                if (window) {
aschiffler@6727
  1274
                    Uint32 flags = SDL_GetWindowFlags(window);
aschiffler@6727
  1275
                    if (flags & SDL_WINDOW_MAXIMIZED) {
aschiffler@6727
  1276
                        SDL_RestoreWindow(window);
aschiffler@6727
  1277
                    } else {
aschiffler@6727
  1278
                        SDL_MaximizeWindow(window);
aschiffler@6727
  1279
                    }
aschiffler@6727
  1280
                }
aschiffler@6727
  1281
            }
aschiffler@6727
  1282
            break;
aschiffler@6727
  1283
        case SDLK_r:
aschiffler@6727
  1284
            if (event->key.keysym.mod & KMOD_CTRL) {
aschiffler@6727
  1285
                /* Ctrl-R toggle mouse relative mode */
aschiffler@6727
  1286
                SDL_SetRelativeMouseMode(!SDL_GetRelativeMouseMode());
aschiffler@6727
  1287
            }
aschiffler@6727
  1288
            break;
aschiffler@6727
  1289
        case SDLK_z:
aschiffler@6727
  1290
            if (event->key.keysym.mod & KMOD_CTRL) {
aschiffler@6727
  1291
                /* Ctrl-Z minimize */
aschiffler@6727
  1292
                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
aschiffler@6727
  1293
                if (window) {
aschiffler@6727
  1294
                    SDL_MinimizeWindow(window);
aschiffler@6727
  1295
                }
aschiffler@6727
  1296
            }
aschiffler@6727
  1297
            break;
aschiffler@6727
  1298
        case SDLK_RETURN:
aschiffler@6727
  1299
            if (event->key.keysym.mod & KMOD_CTRL) {
aschiffler@6727
  1300
                /* Ctrl-Enter toggle fullscreen */
aschiffler@6727
  1301
                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
aschiffler@6727
  1302
                if (window) {
aschiffler@6727
  1303
                    Uint32 flags = SDL_GetWindowFlags(window);
aschiffler@6727
  1304
                    if (flags & SDL_WINDOW_FULLSCREEN) {
aschiffler@6727
  1305
                        SDL_SetWindowFullscreen(window, SDL_FALSE);
aschiffler@6727
  1306
                    } else {
aschiffler@6727
  1307
                        SDL_SetWindowFullscreen(window, SDL_TRUE);
aschiffler@6727
  1308
                    }
aschiffler@6727
  1309
                }
aschiffler@6727
  1310
            }
aschiffler@6727
  1311
            break;
aschiffler@6727
  1312
        case SDLK_b:
aschiffler@6727
  1313
            if (event->key.keysym.mod & KMOD_CTRL) {
aschiffler@6727
  1314
                /* Ctrl-B toggle window border */
aschiffler@6727
  1315
                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
aschiffler@6727
  1316
                if (window) {
aschiffler@6727
  1317
                    const Uint32 flags = SDL_GetWindowFlags(window);
aschiffler@6727
  1318
                    const SDL_bool b = ((flags & SDL_WINDOW_BORDERLESS) != 0);
aschiffler@6727
  1319
                    SDL_SetWindowBordered(window, b);
aschiffler@6727
  1320
                }
aschiffler@6727
  1321
            }
aschiffler@6727
  1322
            break;
slouken@7191
  1323
        case SDLK_0:
aschiffler@6727
  1324
            if (event->key.keysym.mod & KMOD_CTRL) {
aschiffler@6727
  1325
                SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
aschiffler@6727
  1326
                SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "Test Message", "You're awesome!", window);
aschiffler@6727
  1327
            }
aschiffler@6727
  1328
            break;
jorgen@7092
  1329
        case SDLK_1:
jorgen@7092
  1330
            if (event->key.keysym.mod & KMOD_CTRL) {
jorgen@7092
  1331
                FullscreenTo(0, event->key.windowID);
jorgen@7092
  1332
            }
jorgen@7092
  1333
            break;
jorgen@7092
  1334
        case SDLK_2:
jorgen@7092
  1335
            if (event->key.keysym.mod & KMOD_CTRL) {
jorgen@7092
  1336
                FullscreenTo(1, event->key.windowID);
jorgen@7092
  1337
            }
jorgen@7092
  1338
            break;
aschiffler@6727
  1339
        case SDLK_ESCAPE:
aschiffler@6727
  1340
            *done = 1;
aschiffler@6727
  1341
            break;
jorgen@7092
  1342
        case SDLK_SPACE:
jorgen@7092
  1343
        {
jorgen@7092
  1344
            char message[256];
jorgen@7092
  1345
            SDL_Window *window = SDL_GetWindowFromID(event->key.windowID);
jorgen@7092
  1346
jorgen@7092
  1347
            SDL_snprintf(message, sizeof(message), "(%i, %i), rel (%i, %i)\n", lastEvent.x, lastEvent.y, lastEvent.xrel, lastEvent.yrel);
jorgen@7092
  1348
            SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "Last mouse position", message, window);
jorgen@7092
  1349
            break;
jorgen@7092
  1350
        }
aschiffler@6727
  1351
        default:
aschiffler@6727
  1352
            break;
aschiffler@6727
  1353
        }
aschiffler@6727
  1354
        break;
aschiffler@6727
  1355
    case SDL_QUIT:
aschiffler@6727
  1356
        *done = 1;
aschiffler@6727
  1357
        break;
jorgen@7092
  1358
    case SDL_MOUSEMOTION:
jorgen@7092
  1359
        lastEvent = event->motion;
slouken@7191
  1360
        break;
aschiffler@6727
  1361
    }
aschiffler@6727
  1362
}
aschiffler@6727
  1363
aschiffler@6727
  1364
void
aschiffler@6727
  1365
SDLTest_CommonQuit(SDLTest_CommonState * state)
aschiffler@6727
  1366
{
aschiffler@6727
  1367
    int i;
aschiffler@6727
  1368
aschiffler@6727
  1369
    if (state->windows) {
aschiffler@6727
  1370
        SDL_free(state->windows);
aschiffler@6727
  1371
    }
aschiffler@6727
  1372
    if (state->renderers) {
aschiffler@6727
  1373
        for (i = 0; i < state->num_windows; ++i) {
aschiffler@6727
  1374
            if (state->renderers[i]) {
aschiffler@6727
  1375
                SDL_DestroyRenderer(state->renderers[i]);
aschiffler@6727
  1376
            }
aschiffler@6727
  1377
        }
aschiffler@6727
  1378
        SDL_free(state->renderers);
aschiffler@6727
  1379
    }
aschiffler@6727
  1380
    if (state->flags & SDL_INIT_VIDEO) {
aschiffler@6727
  1381
        SDL_VideoQuit();
aschiffler@6727
  1382
    }
aschiffler@6727
  1383
    if (state->flags & SDL_INIT_AUDIO) {
aschiffler@6727
  1384
        SDL_AudioQuit();
aschiffler@6727
  1385
    }
aschiffler@6727
  1386
    SDL_free(state);
aschiffler@6727
  1387
}
aschiffler@6727
  1388
aschiffler@6727
  1389
/* vi: set ts=4 sw=4 expandtab: */