src/video/SDL_video.c
author Sam Lantinga <slouken@libsdl.org>
Wed, 10 Jul 2013 22:13:19 -0700
changeset 7399 f35ff854121a
parent 7390 e4b98404baa4
child 7412 50211a1fd557
permissions -rw-r--r--
Catch out of memory errors creating a window
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
     1
/*
5535
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5480
diff changeset
     2
  Simple DirectMedia Layer
6885
700f1b25f77f Happy New Year!
Sam Lantinga <slouken@libsdl.org>
parents: 6876
diff changeset
     3
  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
     4
5535
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5480
diff changeset
     5
  This software is provided 'as-is', without any express or implied
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5480
diff changeset
     6
  warranty.  In no event will the authors be held liable for any damages
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5480
diff changeset
     7
  arising from the use of this software.
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
     8
5535
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5480
diff changeset
     9
  Permission is granted to anyone to use this software for any purpose,
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5480
diff changeset
    10
  including commercial applications, and to alter it and redistribute it
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5480
diff changeset
    11
  freely, subject to the following restrictions:
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    12
5535
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5480
diff changeset
    13
  1. The origin of this software must not be misrepresented; you must not
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5480
diff changeset
    14
     claim that you wrote the original software. If you use this software
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5480
diff changeset
    15
     in a product, an acknowledgment in the product documentation would be
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5480
diff changeset
    16
     appreciated but is not required.
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5480
diff changeset
    17
  2. Altered source versions must be plainly marked as such, and must not be
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5480
diff changeset
    18
     misrepresented as being the original software.
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5480
diff changeset
    19
  3. This notice may not be removed or altered from any source distribution.
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    20
*/
1402
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1385
diff changeset
    21
#include "SDL_config.h"
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    22
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    23
/* The high-level video driver subsystem */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    24
2999
b2025ca5d7a5 Fixed missing include for SDL_INIT_EVENTTHREAD
Sam Lantinga <slouken@libsdl.org>
parents: 2984
diff changeset
    25
#include "SDL.h"
2984
0b160c970b7e Fixed some dependency issues with SDL_revision.h
Sam Lantinga <slouken@libsdl.org>
parents: 2967
diff changeset
    26
#include "SDL_video.h"
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    27
#include "SDL_sysvideo.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    28
#include "SDL_blit.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    29
#include "SDL_pixels_c.h"
5294
4801b8bede31 Center the old SDL 1.2 screen in the window if we can't get the size we wanted.
Sam Lantinga <slouken@libsdl.org>
parents: 5291
diff changeset
    30
#include "SDL_rect_c.h"
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
    31
#include "../events/SDL_events_c.h"
7139
dd722e7460c5 move Ticks initialization tracking to separate function and ensure it's called with SDL_VideoInit is called to init SDL instead of SDL_Init
Edward Rudd <urkle@outoforder.cc>
parents: 7135
diff changeset
    32
#include "../timer/SDL_timer_c.h"
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    33
5209
115fff0641ee Prefer the OpenGL ES 2.0 context when it's available, make it possible to create an OpenGL 2.0 context on iPhoneOS
Sam Lantinga <slouken@libsdl.org>
parents: 5192
diff changeset
    34
#if SDL_VIDEO_OPENGL
115fff0641ee Prefer the OpenGL ES 2.0 context when it's available, make it possible to create an OpenGL 2.0 context on iPhoneOS
Sam Lantinga <slouken@libsdl.org>
parents: 5192
diff changeset
    35
#include "SDL_opengl.h"
115fff0641ee Prefer the OpenGL ES 2.0 context when it's available, make it possible to create an OpenGL 2.0 context on iPhoneOS
Sam Lantinga <slouken@libsdl.org>
parents: 5192
diff changeset
    36
#endif /* SDL_VIDEO_OPENGL */
115fff0641ee Prefer the OpenGL ES 2.0 context when it's available, make it possible to create an OpenGL 2.0 context on iPhoneOS
Sam Lantinga <slouken@libsdl.org>
parents: 5192
diff changeset
    37
2745
587d2b5fb805 Added support for OpenGL ES renderer
Holmes Futrell <hfutrell@umail.ucsb.edu>
parents: 2744
diff changeset
    38
#if SDL_VIDEO_OPENGL_ES
587d2b5fb805 Added support for OpenGL ES renderer
Holmes Futrell <hfutrell@umail.ucsb.edu>
parents: 2744
diff changeset
    39
#include "SDL_opengles.h"
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
    40
#endif /* SDL_VIDEO_OPENGL_ES */
2745
587d2b5fb805 Added support for OpenGL ES renderer
Holmes Futrell <hfutrell@umail.ucsb.edu>
parents: 2744
diff changeset
    41
5209
115fff0641ee Prefer the OpenGL ES 2.0 context when it's available, make it possible to create an OpenGL 2.0 context on iPhoneOS
Sam Lantinga <slouken@libsdl.org>
parents: 5192
diff changeset
    42
#if SDL_VIDEO_OPENGL_ES2
115fff0641ee Prefer the OpenGL ES 2.0 context when it's available, make it possible to create an OpenGL 2.0 context on iPhoneOS
Sam Lantinga <slouken@libsdl.org>
parents: 5192
diff changeset
    43
#include "SDL_opengles2.h"
115fff0641ee Prefer the OpenGL ES 2.0 context when it's available, make it possible to create an OpenGL 2.0 context on iPhoneOS
Sam Lantinga <slouken@libsdl.org>
parents: 5192
diff changeset
    44
#endif /* SDL_VIDEO_OPENGL_ES2 */
4900
69d9db65f248 Merged the Windows custom window system hooks into the union used by X11.
Sam Lantinga <slouken@libsdl.org>
parents: 4897
diff changeset
    45
69d9db65f248 Merged the Windows custom window system hooks into the union used by X11.
Sam Lantinga <slouken@libsdl.org>
parents: 4897
diff changeset
    46
#include "SDL_syswm.h"
1926
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
    47
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
    48
/* On Windows, windows.h defines CreateWindow */
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
    49
#ifdef CreateWindow
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
    50
#undef CreateWindow
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
    51
#endif
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
    52
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    53
/* Available video drivers */
3166
3a63a5824557 Best pixel formats with alpha search code has been added to function which converts surface to texture with enabled color keys. Now "testsprite2 --renderer opengl_es" works fine with all pixel formats with alpha. This affects other renderers too.
Mike Gorchak <lestat@i.com.ua>
parents: 3162
diff changeset
    54
static VideoBootStrap *bootstrap[] = {
1931
103c6fec2a60 The Mac OS X Cocoa video driver is under construction...
Sam Lantinga <slouken@libsdl.org>
parents: 1930
diff changeset
    55
#if SDL_VIDEO_DRIVER_COCOA
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
    56
    &COCOA_bootstrap,
1133
609c060fd2a2 The MacOSX Carbon/Cocoa/X11 all in one library patch. Relevant emails:
Ryan C. Gordon <icculus@icculus.org>
parents: 1076
diff changeset
    57
#endif
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
    58
#if SDL_VIDEO_DRIVER_X11
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
    59
    &X11_bootstrap,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    60
#endif
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
    61
#if SDL_VIDEO_DRIVER_DIRECTFB
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
    62
    &DirectFB_bootstrap,
167
cb384ef627f6 Added support for DirectFB video on Linux (thanks Denis!)
Sam Lantinga <slouken@libsdl.org>
parents: 125
diff changeset
    63
#endif
5062
e8916fe9cfc8 Fixed bug #925
Sam Lantinga <slouken@libsdl.org>
parents: 5048
diff changeset
    64
#if SDL_VIDEO_DRIVER_WINDOWS
e8916fe9cfc8 Fixed bug #925
Sam Lantinga <slouken@libsdl.org>
parents: 5048
diff changeset
    65
    &WINDOWS_bootstrap,
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
    66
#endif
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
    67
#if SDL_VIDEO_DRIVER_BWINDOW
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
    68
    &BWINDOW_bootstrap,
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
    69
#endif
5150
1435f8a6425c Nobody is currently maintaining the QNX code, so removing it for now.
Sam Lantinga <slouken@libsdl.org>
parents: 5149
diff changeset
    70
#if SDL_VIDEO_DRIVER_PANDORA
1435f8a6425c Nobody is currently maintaining the QNX code, so removing it for now.
Sam Lantinga <slouken@libsdl.org>
parents: 5149
diff changeset
    71
    &PND_bootstrap,
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
    72
#endif
2745
587d2b5fb805 Added support for OpenGL ES renderer
Holmes Futrell <hfutrell@umail.ucsb.edu>
parents: 2744
diff changeset
    73
#if SDL_VIDEO_DRIVER_UIKIT
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
    74
    &UIKIT_bootstrap,
2745
587d2b5fb805 Added support for OpenGL ES renderer
Holmes Futrell <hfutrell@umail.ucsb.edu>
parents: 2744
diff changeset
    75
#endif
5150
1435f8a6425c Nobody is currently maintaining the QNX code, so removing it for now.
Sam Lantinga <slouken@libsdl.org>
parents: 5149
diff changeset
    76
#if SDL_VIDEO_DRIVER_ANDROID
1435f8a6425c Nobody is currently maintaining the QNX code, so removing it for now.
Sam Lantinga <slouken@libsdl.org>
parents: 5149
diff changeset
    77
    &Android_bootstrap,
1435f8a6425c Nobody is currently maintaining the QNX code, so removing it for now.
Sam Lantinga <slouken@libsdl.org>
parents: 5149
diff changeset
    78
#endif
7009
161b7b6a5303 Add PSP support
Captain Lex <kimonline@126.com>
parents: 6984
diff changeset
    79
#if SDL_VIDEO_DRIVER_PSP
161b7b6a5303 Add PSP support
Captain Lex <kimonline@126.com>
parents: 6984
diff changeset
    80
    &PSP_bootstrap,
161b7b6a5303 Add PSP support
Captain Lex <kimonline@126.com>
parents: 6984
diff changeset
    81
#endif
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
    82
#if SDL_VIDEO_DRIVER_DUMMY
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
    83
    &DUMMY_bootstrap,
610
95433459fbd2 Date: Mon, 14 Apr 2003 22:08:27 +0100
Sam Lantinga <slouken@libsdl.org>
parents: 580
diff changeset
    84
#endif
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
    85
    NULL
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    86
};
173
83018110dce8 Added initial support for EPOC/Symbian OS (thanks Hannu!)
Sam Lantinga <slouken@libsdl.org>
parents: 167
diff changeset
    87
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
    88
static SDL_VideoDevice *_this = NULL;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    89
3695
f6a8be3fefa0 Added magic to detect already freed or otherwise invalid windows and textures.
Sam Lantinga <slouken@libsdl.org>
parents: 3694
diff changeset
    90
#define CHECK_WINDOW_MAGIC(window, retval) \
f6a8be3fefa0 Added magic to detect already freed or otherwise invalid windows and textures.
Sam Lantinga <slouken@libsdl.org>
parents: 3694
diff changeset
    91
    if (!_this) { \
f6a8be3fefa0 Added magic to detect already freed or otherwise invalid windows and textures.
Sam Lantinga <slouken@libsdl.org>
parents: 3694
diff changeset
    92
        SDL_UninitializedVideo(); \
f6a8be3fefa0 Added magic to detect already freed or otherwise invalid windows and textures.
Sam Lantinga <slouken@libsdl.org>
parents: 3694
diff changeset
    93
        return retval; \
f6a8be3fefa0 Added magic to detect already freed or otherwise invalid windows and textures.
Sam Lantinga <slouken@libsdl.org>
parents: 3694
diff changeset
    94
    } \
3701
fb905d5674cc Fixed showing and hiding fullscreen windows
Sam Lantinga <slouken@libsdl.org>
parents: 3697
diff changeset
    95
    if (!window || window->magic != &_this->window_magic) { \
3695
f6a8be3fefa0 Added magic to detect already freed or otherwise invalid windows and textures.
Sam Lantinga <slouken@libsdl.org>
parents: 3694
diff changeset
    96
        SDL_SetError("Invalid window"); \
f6a8be3fefa0 Added magic to detect already freed or otherwise invalid windows and textures.
Sam Lantinga <slouken@libsdl.org>
parents: 3694
diff changeset
    97
        return retval; \
f6a8be3fefa0 Added magic to detect already freed or otherwise invalid windows and textures.
Sam Lantinga <slouken@libsdl.org>
parents: 3694
diff changeset
    98
    }
f6a8be3fefa0 Added magic to detect already freed or otherwise invalid windows and textures.
Sam Lantinga <slouken@libsdl.org>
parents: 3694
diff changeset
    99
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   100
#define CHECK_DISPLAY_INDEX(displayIndex, retval) \
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   101
    if (!_this) { \
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   102
        SDL_UninitializedVideo(); \
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   103
        return retval; \
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   104
    } \
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   105
    if (displayIndex < 0 || displayIndex >= _this->num_displays) { \
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   106
        SDL_SetError("displayIndex must be in the range 0 - %d", \
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   107
                     _this->num_displays - 1); \
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   108
        return retval; \
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   109
    }
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   110
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   111
/* Support for framebuffer emulation using an accelerated renderer */
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   112
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   113
#define SDL_WINDOWTEXTUREDATA   "_SDL_WindowTextureData"
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   114
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   115
typedef struct {
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   116
    SDL_Renderer *renderer;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   117
    SDL_Texture *texture;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   118
    void *pixels;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   119
    int pitch;
5172
51b4cfdf7ebb Don't free the surface since the application might be still using it.
Sam Lantinga <slouken@libsdl.org>
parents: 5169
diff changeset
   120
    int bytes_per_pixel;
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   121
} SDL_WindowTextureData;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   122
5190
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   123
static SDL_bool
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   124
ShouldUseTextureFramebuffer()
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   125
{
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   126
    const char *hint;
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   127
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   128
    /* If there's no native framebuffer support then there's no option */
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   129
    if (!_this->CreateWindowFramebuffer) {
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   130
        return SDL_TRUE;
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   131
    }
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   132
5192
ef5a61ea3202 Added the SDL_HINT_RENDER_DRIVER and SDL_HINT_RENDER_VSYNC hints.
Sam Lantinga <slouken@libsdl.org>
parents: 5191
diff changeset
   133
    /* If the user has specified a software renderer we can't use a
ef5a61ea3202 Added the SDL_HINT_RENDER_DRIVER and SDL_HINT_RENDER_VSYNC hints.
Sam Lantinga <slouken@libsdl.org>
parents: 5191
diff changeset
   134
       texture framebuffer, or renderer creation will go recursive.
ef5a61ea3202 Added the SDL_HINT_RENDER_DRIVER and SDL_HINT_RENDER_VSYNC hints.
Sam Lantinga <slouken@libsdl.org>
parents: 5191
diff changeset
   135
     */
ef5a61ea3202 Added the SDL_HINT_RENDER_DRIVER and SDL_HINT_RENDER_VSYNC hints.
Sam Lantinga <slouken@libsdl.org>
parents: 5191
diff changeset
   136
    hint = SDL_GetHint(SDL_HINT_RENDER_DRIVER);
ef5a61ea3202 Added the SDL_HINT_RENDER_DRIVER and SDL_HINT_RENDER_VSYNC hints.
Sam Lantinga <slouken@libsdl.org>
parents: 5191
diff changeset
   137
    if (hint && SDL_strcasecmp(hint, "software") == 0) {
ef5a61ea3202 Added the SDL_HINT_RENDER_DRIVER and SDL_HINT_RENDER_VSYNC hints.
Sam Lantinga <slouken@libsdl.org>
parents: 5191
diff changeset
   138
        return SDL_FALSE;
ef5a61ea3202 Added the SDL_HINT_RENDER_DRIVER and SDL_HINT_RENDER_VSYNC hints.
Sam Lantinga <slouken@libsdl.org>
parents: 5191
diff changeset
   139
    }
ef5a61ea3202 Added the SDL_HINT_RENDER_DRIVER and SDL_HINT_RENDER_VSYNC hints.
Sam Lantinga <slouken@libsdl.org>
parents: 5191
diff changeset
   140
5190
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   141
    /* See if the user or application wants a specific behavior */
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   142
    hint = SDL_GetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION);
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   143
    if (hint) {
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   144
        if (*hint == '0') {
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   145
            return SDL_FALSE;
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   146
        } else {
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   147
            return SDL_TRUE;
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   148
        }
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   149
    }
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   150
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   151
    /* Each platform has different performance characteristics */
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   152
#if defined(__WIN32__)
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   153
    /* GDI BitBlt() is way faster than Direct3D dynamic textures right now.
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   154
     */
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   155
    return SDL_FALSE;
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   156
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   157
#elif defined(__MACOSX__)
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   158
    /* Mac OS X uses OpenGL as the native fast path */
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   159
    return SDL_TRUE;
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   160
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   161
#elif defined(__LINUX__)
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   162
    /* Properly configured OpenGL drivers are faster than MIT-SHM */
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   163
#if SDL_VIDEO_OPENGL
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   164
    /* Ugh, find a way to cache this value! */
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   165
    {
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   166
        SDL_Window *window;
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   167
        SDL_GLContext context;
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   168
        SDL_bool hasAcceleratedOpenGL = SDL_FALSE;
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   169
5385
5f9c2515fc08 The OpenGL test window shouldn't be visible.
Sam Lantinga <slouken@libsdl.org>
parents: 5384
diff changeset
   170
        window = SDL_CreateWindow("OpenGL test", -32, -32, 32, 32, SDL_WINDOW_OPENGL|SDL_WINDOW_HIDDEN);
5190
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   171
        if (window) {
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   172
            context = SDL_GL_CreateContext(window);
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   173
            if (context) {
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   174
                const GLubyte *(APIENTRY * glGetStringFunc) (GLenum);
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   175
                const char *vendor = NULL;
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   176
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   177
                glGetStringFunc = SDL_GL_GetProcAddress("glGetString");
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   178
                if (glGetStringFunc) {
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   179
                    vendor = (const char *) glGetStringFunc(GL_VENDOR);
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   180
                }
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   181
                /* Add more vendors here at will... */
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   182
                if (vendor &&
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   183
                    (SDL_strstr(vendor, "ATI Technologies") ||
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   184
                     SDL_strstr(vendor, "NVIDIA"))) {
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   185
                    hasAcceleratedOpenGL = SDL_TRUE;
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   186
                }
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   187
                SDL_GL_DeleteContext(context);
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   188
            }
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   189
            SDL_DestroyWindow(window);
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   190
        }
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   191
        return hasAcceleratedOpenGL;
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   192
    }
6188
e82023802002 Fixed bug 1242 - PATCH: Improve support for OpenGL ES under X11
Sam Lantinga <slouken@libsdl.org>
parents: 6174
diff changeset
   193
#elif SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
e82023802002 Fixed bug 1242 - PATCH: Improve support for OpenGL ES under X11
Sam Lantinga <slouken@libsdl.org>
parents: 6174
diff changeset
   194
    /* Let's be optimistic about this! */
e82023802002 Fixed bug 1242 - PATCH: Improve support for OpenGL ES under X11
Sam Lantinga <slouken@libsdl.org>
parents: 6174
diff changeset
   195
    return SDL_TRUE;
5190
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   196
#else
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   197
    return SDL_FALSE;
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   198
#endif
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   199
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   200
#else
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   201
    /* Play it safe, assume that if there is a framebuffer driver that it's
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   202
       optimized for the current platform.
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   203
    */
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   204
    return SDL_FALSE;
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   205
#endif
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   206
}
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   207
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   208
static int
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   209
SDL_CreateWindowTexture(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch)
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   210
{
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   211
    SDL_WindowTextureData *data;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   212
    SDL_RendererInfo info;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   213
    Uint32 i;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   214
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   215
    data = SDL_GetWindowData(window, SDL_WINDOWTEXTUREDATA);
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   216
    if (!data) {
5291
39208c821449 Fixed renderer variable scope.
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   217
        SDL_Renderer *renderer = NULL;
5168
db487f28419e Fixed recursion crash when setting SDL_VIDEO_RENDERER=software
Sam Lantinga <slouken@libsdl.org>
parents: 5166
diff changeset
   218
        SDL_RendererInfo info;
db487f28419e Fixed recursion crash when setting SDL_VIDEO_RENDERER=software
Sam Lantinga <slouken@libsdl.org>
parents: 5166
diff changeset
   219
        int i;
5191
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   220
        const char *hint = SDL_GetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION);
5168
db487f28419e Fixed recursion crash when setting SDL_VIDEO_RENDERER=software
Sam Lantinga <slouken@libsdl.org>
parents: 5166
diff changeset
   221
5191
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   222
        /* Check to see if there's a specific driver requested */
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   223
        if (hint && *hint != '0' && *hint != '1' &&
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   224
            SDL_strcasecmp(hint, "software") != 0) {
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   225
            for (i = 0; i < SDL_GetNumRenderDrivers(); ++i) {
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   226
                SDL_GetRenderDriverInfo(i, &info);
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   227
                if (SDL_strcasecmp(info.name, hint) == 0) {
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   228
                    renderer = SDL_CreateRenderer(window, i, 0);
5168
db487f28419e Fixed recursion crash when setting SDL_VIDEO_RENDERER=software
Sam Lantinga <slouken@libsdl.org>
parents: 5166
diff changeset
   229
                    break;
db487f28419e Fixed recursion crash when setting SDL_VIDEO_RENDERER=software
Sam Lantinga <slouken@libsdl.org>
parents: 5166
diff changeset
   230
                }
db487f28419e Fixed recursion crash when setting SDL_VIDEO_RENDERER=software
Sam Lantinga <slouken@libsdl.org>
parents: 5166
diff changeset
   231
            }
db487f28419e Fixed recursion crash when setting SDL_VIDEO_RENDERER=software
Sam Lantinga <slouken@libsdl.org>
parents: 5166
diff changeset
   232
        }
5191
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   233
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   234
        if (!renderer) {
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   235
            for (i = 0; i < SDL_GetNumRenderDrivers(); ++i) {
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   236
                SDL_GetRenderDriverInfo(i, &info);
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   237
                if (SDL_strcmp(info.name, "software") != 0) {
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   238
                    renderer = SDL_CreateRenderer(window, i, 0);
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   239
                    if (renderer) {
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   240
                        break;
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   241
                    }
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   242
                }
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   243
            }
93052810ceb5 Allow SDL_HINT_FRAMEBUFFER_ACCELERATION to specify the renderer to use.
Sam Lantinga <slouken@libsdl.org>
parents: 5190
diff changeset
   244
        }
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   245
        if (!renderer) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   246
            return SDL_SetError("No hardware accelerated renderers available");
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   247
        }
5275
bad04e4710f6 Fixed bug #1116
Sam Lantinga <slouken@libsdl.org>
parents: 5268
diff changeset
   248
bad04e4710f6 Fixed bug #1116
Sam Lantinga <slouken@libsdl.org>
parents: 5268
diff changeset
   249
        /* Create the data after we successfully create the renderer (bug #1116) */
bad04e4710f6 Fixed bug #1116
Sam Lantinga <slouken@libsdl.org>
parents: 5268
diff changeset
   250
        data = (SDL_WindowTextureData *)SDL_calloc(1, sizeof(*data));
bad04e4710f6 Fixed bug #1116
Sam Lantinga <slouken@libsdl.org>
parents: 5268
diff changeset
   251
        if (!data) {
bad04e4710f6 Fixed bug #1116
Sam Lantinga <slouken@libsdl.org>
parents: 5268
diff changeset
   252
            SDL_DestroyRenderer(renderer);
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   253
            return SDL_OutOfMemory();
5275
bad04e4710f6 Fixed bug #1116
Sam Lantinga <slouken@libsdl.org>
parents: 5268
diff changeset
   254
        }
bad04e4710f6 Fixed bug #1116
Sam Lantinga <slouken@libsdl.org>
parents: 5268
diff changeset
   255
        SDL_SetWindowData(window, SDL_WINDOWTEXTUREDATA, data);
bad04e4710f6 Fixed bug #1116
Sam Lantinga <slouken@libsdl.org>
parents: 5268
diff changeset
   256
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   257
        data->renderer = renderer;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   258
    }
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   259
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   260
    /* Free any old texture and pixel data */
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   261
    if (data->texture) {
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   262
        SDL_DestroyTexture(data->texture);
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   263
        data->texture = NULL;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   264
    }
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   265
    if (data->pixels) {
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   266
        SDL_free(data->pixels);
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   267
        data->pixels = NULL;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   268
    }
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   269
5291
39208c821449 Fixed renderer variable scope.
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   270
    if (SDL_GetRendererInfo(data->renderer, &info) < 0) {
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   271
        return -1;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   272
    }
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   273
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   274
    /* Find the first format without an alpha channel */
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   275
    *format = info.texture_formats[0];
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   276
    for (i = 0; i < info.num_texture_formats; ++i) {
5268
c5a04f3c3908 Fixed a crash caused by the 1.2 code path getting a YV12 texture. :)
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   277
        if (!SDL_ISPIXELFORMAT_FOURCC(info.texture_formats[i]) &&
c5a04f3c3908 Fixed a crash caused by the 1.2 code path getting a YV12 texture. :)
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   278
            !SDL_ISPIXELFORMAT_ALPHA(info.texture_formats[i])) {
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   279
            *format = info.texture_formats[i];
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   280
            break;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   281
        }
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   282
    }
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   283
5291
39208c821449 Fixed renderer variable scope.
Sam Lantinga <slouken@libsdl.org>
parents: 5288
diff changeset
   284
    data->texture = SDL_CreateTexture(data->renderer, *format,
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   285
                                      SDL_TEXTUREACCESS_STREAMING,
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   286
                                      window->w, window->h);
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   287
    if (!data->texture) {
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   288
        return -1;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   289
    }
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   290
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   291
    /* Create framebuffer data */
5172
51b4cfdf7ebb Don't free the surface since the application might be still using it.
Sam Lantinga <slouken@libsdl.org>
parents: 5169
diff changeset
   292
    data->bytes_per_pixel = SDL_BYTESPERPIXEL(*format);
51b4cfdf7ebb Don't free the surface since the application might be still using it.
Sam Lantinga <slouken@libsdl.org>
parents: 5169
diff changeset
   293
    data->pitch = (((window->w * data->bytes_per_pixel) + 3) & ~3);
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   294
    data->pixels = SDL_malloc(window->h * data->pitch);
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   295
    if (!data->pixels) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   296
        return SDL_OutOfMemory();
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   297
    }
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   298
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   299
    *pixels = data->pixels;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   300
    *pitch = data->pitch;
5297
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5294
diff changeset
   301
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5294
diff changeset
   302
    /* Make sure we're not double-scaling the viewport */
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5294
diff changeset
   303
    SDL_RenderSetViewport(data->renderer, NULL);
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5294
diff changeset
   304
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   305
    return 0;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   306
}
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   307
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   308
static int
7014
3e0d048e1c14 Fixed bug 1763 - Constify SDL_UpdateWindowSurfaceRects()
Sam Lantinga <slouken@libsdl.org>
parents: 7011
diff changeset
   309
SDL_UpdateWindowTexture(_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects)
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   310
{
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   311
    SDL_WindowTextureData *data;
5294
4801b8bede31 Center the old SDL 1.2 screen in the window if we can't get the size we wanted.
Sam Lantinga <slouken@libsdl.org>
parents: 5291
diff changeset
   312
    SDL_Rect rect;
4801b8bede31 Center the old SDL 1.2 screen in the window if we can't get the size we wanted.
Sam Lantinga <slouken@libsdl.org>
parents: 5291
diff changeset
   313
    void *src;
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   314
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   315
    data = SDL_GetWindowData(window, SDL_WINDOWTEXTUREDATA);
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   316
    if (!data || !data->texture) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   317
        return SDL_SetError("No window texture data");
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   318
    }
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   319
5294
4801b8bede31 Center the old SDL 1.2 screen in the window if we can't get the size we wanted.
Sam Lantinga <slouken@libsdl.org>
parents: 5291
diff changeset
   320
    /* Update a single rect that contains subrects for best DMA performance */
4801b8bede31 Center the old SDL 1.2 screen in the window if we can't get the size we wanted.
Sam Lantinga <slouken@libsdl.org>
parents: 5291
diff changeset
   321
    if (SDL_GetSpanEnclosingRect(window->w, window->h, numrects, rects, &rect)) {
5172
51b4cfdf7ebb Don't free the surface since the application might be still using it.
Sam Lantinga <slouken@libsdl.org>
parents: 5169
diff changeset
   322
        src = (void *)((Uint8 *)data->pixels +
5294
4801b8bede31 Center the old SDL 1.2 screen in the window if we can't get the size we wanted.
Sam Lantinga <slouken@libsdl.org>
parents: 5291
diff changeset
   323
                        rect.y * data->pitch +
4801b8bede31 Center the old SDL 1.2 screen in the window if we can't get the size we wanted.
Sam Lantinga <slouken@libsdl.org>
parents: 5291
diff changeset
   324
                        rect.x * data->bytes_per_pixel);
4801b8bede31 Center the old SDL 1.2 screen in the window if we can't get the size we wanted.
Sam Lantinga <slouken@libsdl.org>
parents: 5291
diff changeset
   325
        if (SDL_UpdateTexture(data->texture, &rect, src, data->pitch) < 0) {
5172
51b4cfdf7ebb Don't free the surface since the application might be still using it.
Sam Lantinga <slouken@libsdl.org>
parents: 5169
diff changeset
   326
            return -1;
51b4cfdf7ebb Don't free the surface since the application might be still using it.
Sam Lantinga <slouken@libsdl.org>
parents: 5169
diff changeset
   327
        }
5294
4801b8bede31 Center the old SDL 1.2 screen in the window if we can't get the size we wanted.
Sam Lantinga <slouken@libsdl.org>
parents: 5291
diff changeset
   328
4801b8bede31 Center the old SDL 1.2 screen in the window if we can't get the size we wanted.
Sam Lantinga <slouken@libsdl.org>
parents: 5291
diff changeset
   329
        if (SDL_RenderCopy(data->renderer, data->texture, NULL, NULL) < 0) {
4801b8bede31 Center the old SDL 1.2 screen in the window if we can't get the size we wanted.
Sam Lantinga <slouken@libsdl.org>
parents: 5291
diff changeset
   330
            return -1;
5172
51b4cfdf7ebb Don't free the surface since the application might be still using it.
Sam Lantinga <slouken@libsdl.org>
parents: 5169
diff changeset
   331
        }
5294
4801b8bede31 Center the old SDL 1.2 screen in the window if we can't get the size we wanted.
Sam Lantinga <slouken@libsdl.org>
parents: 5291
diff changeset
   332
4801b8bede31 Center the old SDL 1.2 screen in the window if we can't get the size we wanted.
Sam Lantinga <slouken@libsdl.org>
parents: 5291
diff changeset
   333
        SDL_RenderPresent(data->renderer);
5172
51b4cfdf7ebb Don't free the surface since the application might be still using it.
Sam Lantinga <slouken@libsdl.org>
parents: 5169
diff changeset
   334
    }
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   335
    return 0;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   336
}
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   337
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   338
static void
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   339
SDL_DestroyWindowTexture(_THIS, SDL_Window * window)
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   340
{
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   341
    SDL_WindowTextureData *data;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   342
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   343
    data = SDL_SetWindowData(window, SDL_WINDOWTEXTUREDATA, NULL);
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   344
    if (!data) {
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   345
        return;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   346
    }
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   347
    if (data->texture) {
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   348
        SDL_DestroyTexture(data->texture);
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   349
    }
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   350
    if (data->renderer) {
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   351
        SDL_DestroyRenderer(data->renderer);
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   352
    }
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   353
    if (data->pixels) {
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   354
        SDL_free(data->pixels);
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   355
    }
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   356
    SDL_free(data);
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   357
}
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   358
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   359
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   360
static int
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   361
cmpmodes(const void *A, const void *B)
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   362
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   363
    SDL_DisplayMode a = *(const SDL_DisplayMode *) A;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   364
    SDL_DisplayMode b = *(const SDL_DisplayMode *) B;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   365
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   366
    if (a.w != b.w) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   367
        return b.w - a.w;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   368
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   369
    if (a.h != b.h) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   370
        return b.h - a.h;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   371
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   372
    if (SDL_BITSPERPIXEL(a.format) != SDL_BITSPERPIXEL(b.format)) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   373
        return SDL_BITSPERPIXEL(b.format) - SDL_BITSPERPIXEL(a.format);
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   374
    }
3178
72edc980789b 1. SDL_CreateTextureFromSurface() now tries to find surface's pixel format.
Mike Gorchak <lestat@i.com.ua>
parents: 3169
diff changeset
   375
    if (SDL_PIXELLAYOUT(a.format) != SDL_PIXELLAYOUT(b.format)) {
72edc980789b 1. SDL_CreateTextureFromSurface() now tries to find surface's pixel format.
Mike Gorchak <lestat@i.com.ua>
parents: 3169
diff changeset
   376
        return SDL_PIXELLAYOUT(b.format) - SDL_PIXELLAYOUT(a.format);
72edc980789b 1. SDL_CreateTextureFromSurface() now tries to find surface's pixel format.
Mike Gorchak <lestat@i.com.ua>
parents: 3169
diff changeset
   377
    }
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   378
    if (a.refresh_rate != b.refresh_rate) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   379
        return b.refresh_rate - a.refresh_rate;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   380
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   381
    return 0;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   382
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   383
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   384
static int
1912
8d384b647307 Setting up the OpenGL support
Sam Lantinga <slouken@libsdl.org>
parents: 1909
diff changeset
   385
SDL_UninitializedVideo()
8d384b647307 Setting up the OpenGL support
Sam Lantinga <slouken@libsdl.org>
parents: 1909
diff changeset
   386
{
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   387
    return SDL_SetError("Video subsystem has not been initialized");
1912
8d384b647307 Setting up the OpenGL support
Sam Lantinga <slouken@libsdl.org>
parents: 1909
diff changeset
   388
}
8d384b647307 Setting up the OpenGL support
Sam Lantinga <slouken@libsdl.org>
parents: 1909
diff changeset
   389
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   390
int
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   391
SDL_GetNumVideoDrivers(void)
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   392
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   393
    return SDL_arraysize(bootstrap) - 1;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   394
}
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   395
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   396
const char *
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   397
SDL_GetVideoDriver(int index)
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   398
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   399
    if (index >= 0 && index < SDL_GetNumVideoDrivers()) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   400
        return bootstrap[index]->name;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   401
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   402
    return NULL;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   403
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   404
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   405
/*
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   406
 * Initialize the video and event subsystems -- determine native pixel format
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   407
 */
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   408
int
5123
dc0dfdd58f27 Removed completely non-portable event thread hack.
Sam Lantinga <slouken@libsdl.org>
parents: 5103
diff changeset
   409
SDL_VideoInit(const char *driver_name)
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   410
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   411
    SDL_VideoDevice *video;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   412
    int index;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   413
    int i;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   414
3694
b0a707f589a6 Fixed bug #916
Sam Lantinga <slouken@libsdl.org>
parents: 3693
diff changeset
   415
    /* Check to make sure we don't overwrite '_this' */
b0a707f589a6 Fixed bug #916
Sam Lantinga <slouken@libsdl.org>
parents: 3693
diff changeset
   416
    if (_this != NULL) {
b0a707f589a6 Fixed bug #916
Sam Lantinga <slouken@libsdl.org>
parents: 3693
diff changeset
   417
        SDL_VideoQuit();
b0a707f589a6 Fixed bug #916
Sam Lantinga <slouken@libsdl.org>
parents: 3693
diff changeset
   418
    }
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7178
diff changeset
   419
7139
dd722e7460c5 move Ticks initialization tracking to separate function and ensure it's called with SDL_VideoInit is called to init SDL instead of SDL_Init
Edward Rudd <urkle@outoforder.cc>
parents: 7135
diff changeset
   420
#if !SDL_TIMERS_DISABLED
dd722e7460c5 move Ticks initialization tracking to separate function and ensure it's called with SDL_VideoInit is called to init SDL instead of SDL_Init
Edward Rudd <urkle@outoforder.cc>
parents: 7135
diff changeset
   421
    SDL_InitTicks();
dd722e7460c5 move Ticks initialization tracking to separate function and ensure it's called with SDL_VideoInit is called to init SDL instead of SDL_Init
Edward Rudd <urkle@outoforder.cc>
parents: 7135
diff changeset
   422
#endif
3694
b0a707f589a6 Fixed bug #916
Sam Lantinga <slouken@libsdl.org>
parents: 3693
diff changeset
   423
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   424
    /* Start the event loop */
7360
b86947ea2749 Make it possible to use SDL events separately from the video subsystem.
Sam Lantinga <slouken@libsdl.org>
parents: 7269
diff changeset
   425
    if (SDL_InitSubSystem(SDL_INIT_EVENTS) < 0 ||
5123
dc0dfdd58f27 Removed completely non-portable event thread hack.
Sam Lantinga <slouken@libsdl.org>
parents: 5103
diff changeset
   426
        SDL_KeyboardInit() < 0 ||
dc0dfdd58f27 Removed completely non-portable event thread hack.
Sam Lantinga <slouken@libsdl.org>
parents: 5103
diff changeset
   427
        SDL_MouseInit() < 0 ||
7360
b86947ea2749 Make it possible to use SDL events separately from the video subsystem.
Sam Lantinga <slouken@libsdl.org>
parents: 7269
diff changeset
   428
        SDL_TouchInit() < 0) {
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   429
        return -1;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   430
    }
3694
b0a707f589a6 Fixed bug #916
Sam Lantinga <slouken@libsdl.org>
parents: 3693
diff changeset
   431
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   432
    /* Select the proper video driver */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   433
    index = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   434
    video = NULL;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   435
    if (driver_name == NULL) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   436
        driver_name = SDL_getenv("SDL_VIDEODRIVER");
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   437
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   438
    if (driver_name != NULL) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   439
        for (i = 0; bootstrap[i]; ++i) {
6900
767690d1c013 Allow abbreviated strings to be used for driver names.
Sam Lantinga <slouken@libsdl.org>
parents: 6885
diff changeset
   440
            if (SDL_strncasecmp(bootstrap[i]->name, driver_name, SDL_strlen(driver_name)) == 0) {
3448
bc27e1fdd3a7 If we explicitly request a driver, try to initialize it.
Sam Lantinga <slouken@libsdl.org>
parents: 3435
diff changeset
   441
                video = bootstrap[i]->create(index);
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   442
                break;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   443
            }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   444
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   445
    } else {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   446
        for (i = 0; bootstrap[i]; ++i) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   447
            if (bootstrap[i]->available()) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   448
                video = bootstrap[i]->create(index);
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   449
                if (video != NULL) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   450
                    break;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   451
                }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   452
            }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   453
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   454
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   455
    if (video == NULL) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   456
        if (driver_name) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   457
            return SDL_SetError("%s not available", driver_name);
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   458
        }
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   459
        return SDL_SetError("No available video device");
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   460
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   461
    _this = video;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   462
    _this->name = bootstrap[i]->name;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   463
    _this->next_object_id = 1;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   464
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   465
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   466
    /* Set some very sane GL defaults */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   467
    _this->gl_config.driver_loaded = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   468
    _this->gl_config.dll_handle = NULL;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   469
    _this->gl_config.red_size = 3;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   470
    _this->gl_config.green_size = 3;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   471
    _this->gl_config.blue_size = 2;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   472
    _this->gl_config.alpha_size = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   473
    _this->gl_config.buffer_size = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   474
    _this->gl_config.depth_size = 16;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   475
    _this->gl_config.stencil_size = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   476
    _this->gl_config.double_buffer = 1;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   477
    _this->gl_config.accum_red_size = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   478
    _this->gl_config.accum_green_size = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   479
    _this->gl_config.accum_blue_size = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   480
    _this->gl_config.accum_alpha_size = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   481
    _this->gl_config.stereo = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   482
    _this->gl_config.multisamplebuffers = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   483
    _this->gl_config.multisamplesamples = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   484
    _this->gl_config.retained_backing = 1;
3571
19691cebb866 Default to allow either accelerated or not
Sam Lantinga <slouken@libsdl.org>
parents: 3570
diff changeset
   485
    _this->gl_config.accelerated = -1;  /* accelerated or not, both are fine */
5209
115fff0641ee Prefer the OpenGL ES 2.0 context when it's available, make it possible to create an OpenGL 2.0 context on iPhoneOS
Sam Lantinga <slouken@libsdl.org>
parents: 5192
diff changeset
   486
#if SDL_VIDEO_OPENGL
3100
7dc982143c06 Date: Sun, 22 Mar 2009 12:52:29 +0000
Sam Lantinga <slouken@libsdl.org>
parents: 3099
diff changeset
   487
    _this->gl_config.major_version = 2;
7dc982143c06 Date: Sun, 22 Mar 2009 12:52:29 +0000
Sam Lantinga <slouken@libsdl.org>
parents: 3099
diff changeset
   488
    _this->gl_config.minor_version = 1;
6370
93187f7f7d5d Improved simultaneous support for OpenGL and OpenGL ES
Sam Lantinga <slouken@libsdl.org>
parents: 6296
diff changeset
   489
    _this->gl_config.use_egl = 0;
5217
9c0593fa27d6 Create an OpenGL 1.1 context by default, if available.
Sam Lantinga <slouken@libsdl.org>
parents: 5211
diff changeset
   490
#elif SDL_VIDEO_OPENGL_ES
9c0593fa27d6 Create an OpenGL 1.1 context by default, if available.
Sam Lantinga <slouken@libsdl.org>
parents: 5211
diff changeset
   491
    _this->gl_config.major_version = 1;
9c0593fa27d6 Create an OpenGL 1.1 context by default, if available.
Sam Lantinga <slouken@libsdl.org>
parents: 5211
diff changeset
   492
    _this->gl_config.minor_version = 1;
6370
93187f7f7d5d Improved simultaneous support for OpenGL and OpenGL ES
Sam Lantinga <slouken@libsdl.org>
parents: 6296
diff changeset
   493
    _this->gl_config.use_egl = 1;
5209
115fff0641ee Prefer the OpenGL ES 2.0 context when it's available, make it possible to create an OpenGL 2.0 context on iPhoneOS
Sam Lantinga <slouken@libsdl.org>
parents: 5192
diff changeset
   494
#elif SDL_VIDEO_OPENGL_ES2
115fff0641ee Prefer the OpenGL ES 2.0 context when it's available, make it possible to create an OpenGL 2.0 context on iPhoneOS
Sam Lantinga <slouken@libsdl.org>
parents: 5192
diff changeset
   495
    _this->gl_config.major_version = 2;
115fff0641ee Prefer the OpenGL ES 2.0 context when it's available, make it possible to create an OpenGL 2.0 context on iPhoneOS
Sam Lantinga <slouken@libsdl.org>
parents: 5192
diff changeset
   496
    _this->gl_config.minor_version = 0;
6370
93187f7f7d5d Improved simultaneous support for OpenGL and OpenGL ES
Sam Lantinga <slouken@libsdl.org>
parents: 6296
diff changeset
   497
    _this->gl_config.use_egl = 1;
5209
115fff0641ee Prefer the OpenGL ES 2.0 context when it's available, make it possible to create an OpenGL 2.0 context on iPhoneOS
Sam Lantinga <slouken@libsdl.org>
parents: 5192
diff changeset
   498
#endif
6296
b42657486c0d Add OpenGL 3.X context creation support
Sam Lantinga <slouken@libsdl.org>
parents: 6266
diff changeset
   499
    _this->gl_config.flags = 0;
b42657486c0d Add OpenGL 3.X context creation support
Sam Lantinga <slouken@libsdl.org>
parents: 6266
diff changeset
   500
    _this->gl_config.profile_mask = 0;
6393
a773384edf20 Fixed bug 1565 - some small GL context creation enhancements
Sam Lantinga <slouken@libsdl.org>
parents: 6392
diff changeset
   501
    _this->gl_config.share_with_current_context = 0;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   502
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   503
    /* Initialize the video subsystem */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   504
    if (_this->VideoInit(_this) < 0) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   505
        SDL_VideoQuit();
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   506
        return -1;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   507
    }
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   508
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   509
    /* Make sure some displays were added */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   510
    if (_this->num_displays == 0) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   511
        SDL_VideoQuit();
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   512
        return SDL_SetError("The video driver did not add any displays");
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   513
    }
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   514
5190
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   515
    /* Add the renderer framebuffer emulation if desired */
82a48f4d65f6 Added a hint to determine whether framebuffer texture acceleration should be used, and added default behaviors for the various platforms.
Sam Lantinga <slouken@libsdl.org>
parents: 5172
diff changeset
   516
    if (ShouldUseTextureFramebuffer()) {
5166
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   517
        _this->CreateWindowFramebuffer = SDL_CreateWindowTexture;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   518
        _this->UpdateWindowFramebuffer = SDL_UpdateWindowTexture;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   519
        _this->DestroyWindowFramebuffer = SDL_DestroyWindowTexture;
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   520
    }
4d39eeaad00b Added a way to get a framebuffer interface for a window, and also a way to create a software renderer for an arbitrary surface.
Sam Lantinga <slouken@libsdl.org>
parents: 5165
diff changeset
   521
6670
d4883f657288 We can't check for the screen keyboard in the event code because the video system isn't fully initialized yet.
Sam Lantinga <slouken@libsdl.org>
parents: 6662
diff changeset
   522
    /* If we don't use a screen keyboard, turn on text input by default,
d4883f657288 We can't check for the screen keyboard in the event code because the video system isn't fully initialized yet.
Sam Lantinga <slouken@libsdl.org>
parents: 6662
diff changeset
   523
       otherwise programs that expect to get text events without enabling
d4883f657288 We can't check for the screen keyboard in the event code because the video system isn't fully initialized yet.
Sam Lantinga <slouken@libsdl.org>
parents: 6662
diff changeset
   524
       UNICODE input won't get any events.
d4883f657288 We can't check for the screen keyboard in the event code because the video system isn't fully initialized yet.
Sam Lantinga <slouken@libsdl.org>
parents: 6662
diff changeset
   525
d4883f657288 We can't check for the screen keyboard in the event code because the video system isn't fully initialized yet.
Sam Lantinga <slouken@libsdl.org>
parents: 6662
diff changeset
   526
       Actually, come to think of it, you needed to call SDL_EnableUNICODE(1)
d4883f657288 We can't check for the screen keyboard in the event code because the video system isn't fully initialized yet.
Sam Lantinga <slouken@libsdl.org>
parents: 6662
diff changeset
   527
       in SDL 1.2 before you got text input events.  Hmm...
d4883f657288 We can't check for the screen keyboard in the event code because the video system isn't fully initialized yet.
Sam Lantinga <slouken@libsdl.org>
parents: 6662
diff changeset
   528
     */
d4883f657288 We can't check for the screen keyboard in the event code because the video system isn't fully initialized yet.
Sam Lantinga <slouken@libsdl.org>
parents: 6662
diff changeset
   529
    if (!SDL_HasScreenKeyboardSupport()) {
d4883f657288 We can't check for the screen keyboard in the event code because the video system isn't fully initialized yet.
Sam Lantinga <slouken@libsdl.org>
parents: 6662
diff changeset
   530
        SDL_StartTextInput();
d4883f657288 We can't check for the screen keyboard in the event code because the video system isn't fully initialized yet.
Sam Lantinga <slouken@libsdl.org>
parents: 6662
diff changeset
   531
    }
d4883f657288 We can't check for the screen keyboard in the event code because the video system isn't fully initialized yet.
Sam Lantinga <slouken@libsdl.org>
parents: 6662
diff changeset
   532
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   533
    /* We're ready to go! */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   534
    return 0;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   535
}
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   536
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   537
const char *
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   538
SDL_GetCurrentVideoDriver()
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   539
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   540
    if (!_this) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   541
        SDL_UninitializedVideo();
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   542
        return NULL;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   543
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   544
    return _this->name;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   545
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   546
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   547
SDL_VideoDevice *
4472
791b3256fb22 Mostly cleaned up warnings with -Wmissing-prototypes
Sam Lantinga <slouken@libsdl.org>
parents: 4433
diff changeset
   548
SDL_GetVideoDevice(void)
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   549
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   550
    return _this;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   551
}
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   552
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   553
int
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   554
SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode)
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   555
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   556
    SDL_VideoDisplay display;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   557
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   558
    SDL_zero(display);
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   559
    if (desktop_mode) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   560
        display.desktop_mode = *desktop_mode;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   561
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   562
    display.current_mode = display.desktop_mode;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   563
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   564
    return SDL_AddVideoDisplay(&display);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   565
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   566
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   567
int
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   568
SDL_AddVideoDisplay(const SDL_VideoDisplay * display)
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   569
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   570
    SDL_VideoDisplay *displays;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   571
    int index = -1;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   572
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   573
    displays =
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   574
        SDL_realloc(_this->displays,
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   575
                    (_this->num_displays + 1) * sizeof(*displays));
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   576
    if (displays) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   577
        index = _this->num_displays++;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   578
        displays[index] = *display;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   579
        displays[index].device = _this;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   580
        _this->displays = displays;
6787
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   581
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   582
        if (display->name) {
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   583
            displays[index].name = SDL_strdup(display->name);
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   584
        } else {
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   585
            char name[32];
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   586
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   587
            SDL_itoa(index, name, 10);
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   588
            displays[index].name = SDL_strdup(name);
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   589
        }
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   590
    } else {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   591
        SDL_OutOfMemory();
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   592
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   593
    return index;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   594
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   595
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   596
int
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   597
SDL_GetNumVideoDisplays(void)
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   598
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   599
    if (!_this) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   600
        SDL_UninitializedVideo();
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   601
        return 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   602
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   603
    return _this->num_displays;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   604
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   605
6044
35448a5ea044 Lots of fixes importing SDL source wholesale into a new iOS project
Sam Lantinga <slouken@libsdl.org>
parents: 5571
diff changeset
   606
static int
5380
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   607
SDL_GetIndexOfDisplay(SDL_VideoDisplay *display)
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   608
{
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   609
    int displayIndex;
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   610
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   611
    for (displayIndex = 0; displayIndex < _this->num_displays; ++displayIndex) {
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   612
        if (display == &_this->displays[displayIndex]) {
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   613
            return displayIndex;
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   614
        }
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   615
    }
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   616
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   617
    /* Couldn't find the display, just use index 0 */
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   618
    return 0;
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   619
}
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   620
6787
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   621
const char *
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   622
SDL_GetDisplayName(int displayIndex)
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   623
{
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   624
    CHECK_DISPLAY_INDEX(displayIndex, NULL);
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   625
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   626
    return _this->displays[displayIndex].name;
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   627
}
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   628
5380
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   629
int
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   630
SDL_GetDisplayBounds(int displayIndex, SDL_Rect * rect)
3528
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   631
{
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   632
    CHECK_DISPLAY_INDEX(displayIndex, -1);
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   633
3528
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   634
    if (rect) {
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   635
        SDL_VideoDisplay *display = &_this->displays[displayIndex];
3528
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   636
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   637
        if (_this->GetDisplayBounds) {
5249
7a963be087ef Mostly fixed fullscreen mode on Mac OS X, and you can toggle it on and off.
Sam Lantinga <slouken@libsdl.org>
parents: 5246
diff changeset
   638
            if (_this->GetDisplayBounds(_this, display, rect) == 0) {
7a963be087ef Mostly fixed fullscreen mode on Mac OS X, and you can toggle it on and off.
Sam Lantinga <slouken@libsdl.org>
parents: 5246
diff changeset
   639
                return 0;
3528
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   640
            }
5249
7a963be087ef Mostly fixed fullscreen mode on Mac OS X, and you can toggle it on and off.
Sam Lantinga <slouken@libsdl.org>
parents: 5246
diff changeset
   641
        }
7a963be087ef Mostly fixed fullscreen mode on Mac OS X, and you can toggle it on and off.
Sam Lantinga <slouken@libsdl.org>
parents: 5246
diff changeset
   642
7a963be087ef Mostly fixed fullscreen mode on Mac OS X, and you can toggle it on and off.
Sam Lantinga <slouken@libsdl.org>
parents: 5246
diff changeset
   643
        /* Assume that the displays are left to right */
7a963be087ef Mostly fixed fullscreen mode on Mac OS X, and you can toggle it on and off.
Sam Lantinga <slouken@libsdl.org>
parents: 5246
diff changeset
   644
        if (displayIndex == 0) {
7a963be087ef Mostly fixed fullscreen mode on Mac OS X, and you can toggle it on and off.
Sam Lantinga <slouken@libsdl.org>
parents: 5246
diff changeset
   645
            rect->x = 0;
7a963be087ef Mostly fixed fullscreen mode on Mac OS X, and you can toggle it on and off.
Sam Lantinga <slouken@libsdl.org>
parents: 5246
diff changeset
   646
            rect->y = 0;
3528
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   647
        } else {
5249
7a963be087ef Mostly fixed fullscreen mode on Mac OS X, and you can toggle it on and off.
Sam Lantinga <slouken@libsdl.org>
parents: 5246
diff changeset
   648
            SDL_GetDisplayBounds(displayIndex-1, rect);
7a963be087ef Mostly fixed fullscreen mode on Mac OS X, and you can toggle it on and off.
Sam Lantinga <slouken@libsdl.org>
parents: 5246
diff changeset
   649
            rect->x += rect->w;
3528
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   650
        }
6518
42948831d16e Refactored the UIKit mode code into a separate file so it's cleaner and more consistent with other backends
Sam Lantinga <slouken@libsdl.org>
parents: 6496
diff changeset
   651
        rect->w = display->current_mode.w;
42948831d16e Refactored the UIKit mode code into a separate file so it's cleaner and more consistent with other backends
Sam Lantinga <slouken@libsdl.org>
parents: 6496
diff changeset
   652
        rect->h = display->current_mode.h;
3528
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   653
    }
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   654
    return 0;
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   655
}
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   656
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   657
SDL_bool
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   658
SDL_AddDisplayMode(SDL_VideoDisplay * display,  const SDL_DisplayMode * mode)
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   659
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   660
    SDL_DisplayMode *modes;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   661
    int i, nmodes;
910
4ab6d1fd028f Date: Sat, 26 Jun 2004 14:58:42 +0300
Sam Lantinga <slouken@libsdl.org>
parents: 883
diff changeset
   662
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   663
    /* Make sure we don't already have the mode in the list */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   664
    modes = display->display_modes;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   665
    nmodes = display->num_display_modes;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   666
    for (i = nmodes; i--;) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   667
        if (SDL_memcmp(mode, &modes[i], sizeof(*mode)) == 0) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   668
            return SDL_FALSE;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   669
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   670
    }
910
4ab6d1fd028f Date: Sat, 26 Jun 2004 14:58:42 +0300
Sam Lantinga <slouken@libsdl.org>
parents: 883
diff changeset
   671
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   672
    /* Go ahead and add the new mode */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   673
    if (nmodes == display->max_display_modes) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   674
        modes =
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   675
            SDL_realloc(modes,
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   676
                        (display->max_display_modes + 32) * sizeof(*modes));
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   677
        if (!modes) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   678
            return SDL_FALSE;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   679
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   680
        display->display_modes = modes;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   681
        display->max_display_modes += 32;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   682
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   683
    modes[nmodes] = *mode;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   684
    display->num_display_modes++;
650
fe445b59d307 We need to lookup the address of glGetString before calling GL_MakeCurrent(),
Ryan C. Gordon <icculus@icculus.org>
parents: 630
diff changeset
   685
3178
72edc980789b 1. SDL_CreateTextureFromSurface() now tries to find surface's pixel format.
Mike Gorchak <lestat@i.com.ua>
parents: 3169
diff changeset
   686
    /* Re-sort video modes */
72edc980789b 1. SDL_CreateTextureFromSurface() now tries to find surface's pixel format.
Mike Gorchak <lestat@i.com.ua>
parents: 3169
diff changeset
   687
    SDL_qsort(display->display_modes, display->num_display_modes,
3186
Sam Lantinga <slouken@libsdl.org>
parents: 3178
diff changeset
   688
              sizeof(SDL_DisplayMode), cmpmodes);
3178
72edc980789b 1. SDL_CreateTextureFromSurface() now tries to find surface's pixel format.
Mike Gorchak <lestat@i.com.ua>
parents: 3169
diff changeset
   689
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   690
    return SDL_TRUE;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   691
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   692
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   693
static int
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   694
SDL_GetNumDisplayModesForDisplay(SDL_VideoDisplay * display)
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   695
{
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   696
    if (!display->num_display_modes && _this->GetDisplayModes) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   697
        _this->GetDisplayModes(_this, display);
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   698
        SDL_qsort(display->display_modes, display->num_display_modes,
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   699
                  sizeof(SDL_DisplayMode), cmpmodes);
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   700
    }
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   701
    return display->num_display_modes;
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   702
}
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   703
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   704
int
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   705
SDL_GetNumDisplayModes(int displayIndex)
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   706
{
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   707
    CHECK_DISPLAY_INDEX(displayIndex, -1);
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   708
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   709
    return SDL_GetNumDisplayModesForDisplay(&_this->displays[displayIndex]);
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   710
}
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   711
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   712
int
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   713
SDL_GetDisplayMode(int displayIndex, int index, SDL_DisplayMode * mode)
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   714
{
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   715
    SDL_VideoDisplay *display;
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   716
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   717
    CHECK_DISPLAY_INDEX(displayIndex, -1);
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   718
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   719
    display = &_this->displays[displayIndex];
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   720
    if (index < 0 || index >= SDL_GetNumDisplayModesForDisplay(display)) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   721
        return SDL_SetError("index must be in the range of 0 - %d",
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   722
                            SDL_GetNumDisplayModesForDisplay(display) - 1);
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   723
    }
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   724
    if (mode) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   725
        *mode = display->display_modes[index];
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   726
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   727
    return 0;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   728
}
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   729
1967
01e29c3e9a29 In general, fill in pointers to structures, rather than return them.
Sam Lantinga <slouken@libsdl.org>
parents: 1965
diff changeset
   730
int
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   731
SDL_GetDesktopDisplayMode(int displayIndex, SDL_DisplayMode * mode)
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   732
{
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   733
    SDL_VideoDisplay *display;
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   734
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   735
    CHECK_DISPLAY_INDEX(displayIndex, -1);
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   736
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   737
    display = &_this->displays[displayIndex];
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   738
    if (mode) {
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   739
        *mode = display->desktop_mode;
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   740
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   741
    return 0;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   742
}
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   743
1967
01e29c3e9a29 In general, fill in pointers to structures, rather than return them.
Sam Lantinga <slouken@libsdl.org>
parents: 1965
diff changeset
   744
int
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   745
SDL_GetCurrentDisplayMode(int displayIndex, SDL_DisplayMode * mode)
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   746
{
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   747
    SDL_VideoDisplay *display;
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   748
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   749
    CHECK_DISPLAY_INDEX(displayIndex, -1);
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   750
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   751
    display = &_this->displays[displayIndex];
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   752
    if (mode) {
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   753
        *mode = display->current_mode;
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   754
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   755
    return 0;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   756
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   757
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   758
static SDL_DisplayMode *
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   759
SDL_GetClosestDisplayModeForDisplay(SDL_VideoDisplay * display,
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   760
                                    const SDL_DisplayMode * mode,
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   761
                                    SDL_DisplayMode * closest)
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   762
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   763
    Uint32 target_format;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   764
    int target_refresh_rate;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   765
    int i;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   766
    SDL_DisplayMode *current, *match;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   767
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   768
    if (!mode || !closest) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   769
        SDL_SetError("Missing desired mode or closest mode parameter");
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   770
        return NULL;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   771
    }
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   772
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   773
    /* Default to the desktop format */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   774
    if (mode->format) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   775
        target_format = mode->format;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   776
    } else {
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   777
        target_format = display->desktop_mode.format;
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   778
    }
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   779
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   780
    /* Default to the desktop refresh rate */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   781
    if (mode->refresh_rate) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   782
        target_refresh_rate = mode->refresh_rate;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   783
    } else {
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   784
        target_refresh_rate = display->desktop_mode.refresh_rate;
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   785
    }
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   786
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   787
    match = NULL;
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   788
    for (i = 0; i < SDL_GetNumDisplayModesForDisplay(display); ++i) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   789
        current = &display->display_modes[i];
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   790
2789
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   791
        if (current->w && (current->w < mode->w)) {
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   792
            /* Out of sorted modes large enough here */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   793
            break;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   794
        }
2789
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   795
        if (current->h && (current->h < mode->h)) {
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   796
            if (current->w && (current->w == mode->w)) {
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   797
                /* Out of sorted modes large enough here */
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   798
                break;
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   799
            }
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   800
            /* Wider, but not tall enough, due to a different
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   801
               aspect ratio. This mode must be skipped, but closer
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   802
               modes may still follow. */
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   803
            continue;
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   804
        }
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   805
        if (!match || current->w < match->w || current->h < match->h) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   806
            match = current;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   807
            continue;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   808
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   809
        if (current->format != match->format) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   810
            /* Sorted highest depth to lowest */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   811
            if (current->format == target_format ||
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   812
                (SDL_BITSPERPIXEL(current->format) >=
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   813
                 SDL_BITSPERPIXEL(target_format)
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   814
                 && SDL_PIXELTYPE(current->format) ==
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   815
                 SDL_PIXELTYPE(target_format))) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   816
                match = current;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   817
            }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   818
            continue;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   819
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   820
        if (current->refresh_rate != match->refresh_rate) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   821
            /* Sorted highest refresh to lowest */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   822
            if (current->refresh_rate >= target_refresh_rate) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   823
                match = current;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   824
            }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   825
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   826
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   827
    if (match) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   828
        if (match->format) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   829
            closest->format = match->format;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   830
        } else {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   831
            closest->format = mode->format;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   832
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   833
        if (match->w && match->h) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   834
            closest->w = match->w;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   835
            closest->h = match->h;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   836
        } else {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   837
            closest->w = mode->w;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   838
            closest->h = mode->h;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   839
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   840
        if (match->refresh_rate) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   841
            closest->refresh_rate = match->refresh_rate;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   842
        } else {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   843
            closest->refresh_rate = mode->refresh_rate;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   844
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   845
        closest->driverdata = match->driverdata;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   846
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   847
        /*
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   848
         * Pick some reasonable defaults if the app and driver don't
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   849
         * care
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   850
         */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   851
        if (!closest->format) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   852
            closest->format = SDL_PIXELFORMAT_RGB888;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   853
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   854
        if (!closest->w) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   855
            closest->w = 640;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   856
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   857
        if (!closest->h) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   858
            closest->h = 480;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   859
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   860
        return closest;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   861
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   862
    return NULL;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   863
}
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   864
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   865
SDL_DisplayMode *
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   866
SDL_GetClosestDisplayMode(int displayIndex,
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   867
                          const SDL_DisplayMode * mode,
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   868
                          SDL_DisplayMode * closest)
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   869
{
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   870
    SDL_VideoDisplay *display;
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   871
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   872
    CHECK_DISPLAY_INDEX(displayIndex, NULL);
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   873
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   874
    display = &_this->displays[displayIndex];
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   875
    return SDL_GetClosestDisplayModeForDisplay(display, mode, closest);
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   876
}
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   877
6044
35448a5ea044 Lots of fixes importing SDL source wholesale into a new iOS project
Sam Lantinga <slouken@libsdl.org>
parents: 5571
diff changeset
   878
static int
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   879
SDL_SetDisplayModeForDisplay(SDL_VideoDisplay * display, const SDL_DisplayMode * mode)
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   880
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   881
    SDL_DisplayMode display_mode;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   882
    SDL_DisplayMode current_mode;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   883
3502
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   884
    if (mode) {
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   885
        display_mode = *mode;
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   886
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   887
        /* Default to the current mode */
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   888
        if (!display_mode.format) {
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   889
            display_mode.format = display->current_mode.format;
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   890
        }
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   891
        if (!display_mode.w) {
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   892
            display_mode.w = display->current_mode.w;
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   893
        }
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   894
        if (!display_mode.h) {
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   895
            display_mode.h = display->current_mode.h;
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   896
        }
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   897
        if (!display_mode.refresh_rate) {
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   898
            display_mode.refresh_rate = display->current_mode.refresh_rate;
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   899
        }
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   900
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   901
        /* Get a good video mode, the closest one possible */
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   902
        if (!SDL_GetClosestDisplayModeForDisplay(display, &display_mode, &display_mode)) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   903
            return SDL_SetError("No video mode large enough for %dx%d",
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   904
                                display_mode.w, display_mode.h);
3502
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   905
        }
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   906
    } else {
98a819296cdc Whenever a window becomes fullscreen, shown, unminimized, and has input focus it will change the display to the corresponding fullscreen video mode.
Sam Lantinga <slouken@libsdl.org>
parents: 3501
diff changeset
   907
        display_mode = display->desktop_mode;
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   908
    }
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   909
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   910
    /* See if there's anything left to do */
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   911
    current_mode = display->current_mode;
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   912
    if (SDL_memcmp(&display_mode, &current_mode, sizeof(display_mode)) == 0) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   913
        return 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   914
    }
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   915
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   916
    /* Actually change the display mode */
4978
4a7f284a82b2 You can't change the resolution on some devices
Sam Lantinga <slouken@libsdl.org>
parents: 4977
diff changeset
   917
    if (!_this->SetDisplayMode) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   918
        return SDL_SetError("Video driver doesn't support changing display mode");
4978
4a7f284a82b2 You can't change the resolution on some devices
Sam Lantinga <slouken@libsdl.org>
parents: 4977
diff changeset
   919
    }
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   920
    if (_this->SetDisplayMode(_this, display, &display_mode) < 0) {
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   921
        return -1;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   922
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   923
    display->current_mode = display_mode;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   924
    return 0;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   925
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   926
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1737
diff changeset
   927
int
6786
7174fb08017a Renamed SDL_GetWindowDisplay() to SDL_GetWindowDisplayIndex()
Sam Lantinga <slouken@libsdl.org>
parents: 6784
diff changeset
   928
SDL_GetWindowDisplayIndex(SDL_Window * window)
5246
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   929
{
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   930
    int displayIndex;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   931
    int i, dist;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   932
    int closest = -1;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   933
    int closest_dist = 0x7FFFFFFF;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   934
    SDL_Point center;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   935
    SDL_Point delta;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   936
    SDL_Rect rect;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   937
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   938
    CHECK_WINDOW_MAGIC(window, -1);
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   939
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   940
    if (SDL_WINDOWPOS_ISUNDEFINED(window->x) ||
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   941
        SDL_WINDOWPOS_ISCENTERED(window->x)) {
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   942
        displayIndex = (window->x & 0xFFFF);
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   943
        if (displayIndex >= _this->num_displays) {
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   944
            displayIndex = 0;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   945
        }
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   946
        return displayIndex;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   947
    }
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   948
    if (SDL_WINDOWPOS_ISUNDEFINED(window->y) ||
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   949
        SDL_WINDOWPOS_ISCENTERED(window->y)) {
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   950
        displayIndex = (window->y & 0xFFFF);
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   951
        if (displayIndex >= _this->num_displays) {
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   952
            displayIndex = 0;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   953
        }
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   954
        return displayIndex;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   955
    }
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   956
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   957
    /* Find the display containing the window */
6547
38bc368a3b87 A window being fullscreen takes precedence over coordinate checks
Sam Lantinga <slouken@libsdl.org>
parents: 6522
diff changeset
   958
    for (i = 0; i < _this->num_displays; ++i) {
38bc368a3b87 A window being fullscreen takes precedence over coordinate checks
Sam Lantinga <slouken@libsdl.org>
parents: 6522
diff changeset
   959
        SDL_VideoDisplay *display = &_this->displays[i];
38bc368a3b87 A window being fullscreen takes precedence over coordinate checks
Sam Lantinga <slouken@libsdl.org>
parents: 6522
diff changeset
   960
38bc368a3b87 A window being fullscreen takes precedence over coordinate checks
Sam Lantinga <slouken@libsdl.org>
parents: 6522
diff changeset
   961
        if (display->fullscreen_window == window) {
38bc368a3b87 A window being fullscreen takes precedence over coordinate checks
Sam Lantinga <slouken@libsdl.org>
parents: 6522
diff changeset
   962
            return i;
38bc368a3b87 A window being fullscreen takes precedence over coordinate checks
Sam Lantinga <slouken@libsdl.org>
parents: 6522
diff changeset
   963
        }
38bc368a3b87 A window being fullscreen takes precedence over coordinate checks
Sam Lantinga <slouken@libsdl.org>
parents: 6522
diff changeset
   964
    }
5246
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   965
    center.x = window->x + window->w / 2;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   966
    center.y = window->y + window->h / 2;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   967
    for (i = 0; i < _this->num_displays; ++i) {
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   968
        SDL_GetDisplayBounds(i, &rect);
6547
38bc368a3b87 A window being fullscreen takes precedence over coordinate checks
Sam Lantinga <slouken@libsdl.org>
parents: 6522
diff changeset
   969
        if (SDL_EnclosePoints(&center, 1, &rect, NULL)) {
5246
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   970
            return i;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   971
        }
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   972
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   973
        delta.x = center.x - (rect.x + rect.w / 2);
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   974
        delta.y = center.y - (rect.y + rect.h / 2);
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   975
        dist = (delta.x*delta.x + delta.y*delta.y);
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   976
        if (dist < closest_dist) {
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   977
            closest = i;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   978
            closest_dist = dist;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   979
        }
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   980
    }
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   981
    if (closest < 0) {
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   982
        SDL_SetError("Couldn't find any displays");
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   983
    }
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   984
    return closest;
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   985
}
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   986
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   987
SDL_VideoDisplay *
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   988
SDL_GetDisplayForWindow(SDL_Window *window)
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   989
{
6786
7174fb08017a Renamed SDL_GetWindowDisplay() to SDL_GetWindowDisplayIndex()
Sam Lantinga <slouken@libsdl.org>
parents: 6784
diff changeset
   990
    int displayIndex = SDL_GetWindowDisplayIndex(window);
5373
02007fd16991 Do error checking in SDL_GetDisplayForWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 5306
diff changeset
   991
    if (displayIndex >= 0) {
02007fd16991 Do error checking in SDL_GetDisplayForWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 5306
diff changeset
   992
        return &_this->displays[displayIndex];
02007fd16991 Do error checking in SDL_GetDisplayForWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 5306
diff changeset
   993
    } else {
02007fd16991 Do error checking in SDL_GetDisplayForWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 5306
diff changeset
   994
        return NULL;
02007fd16991 Do error checking in SDL_GetDisplayForWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 5306
diff changeset
   995
    }
5246
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   996
}
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   997
58265e606e4e Window coordinates are in the global space and windows are not tied to a particular display.
Sam Lantinga <slouken@libsdl.org>
parents: 5244
diff changeset
   998
int
3685
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3683
diff changeset
   999
SDL_SetWindowDisplayMode(SDL_Window * window, const SDL_DisplayMode * mode)
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1000
{
3695
f6a8be3fefa0 Added magic to detect already freed or otherwise invalid windows and textures.
Sam Lantinga <slouken@libsdl.org>
parents: 3694
diff changeset
  1001
    CHECK_WINDOW_MAGIC(window, -1);
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1002
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1003
    if (mode) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1004
        window->fullscreen_mode = *mode;
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1005
    } else {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1006
        SDL_zero(window->fullscreen_mode);
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1007
    }
3526
e6f2f312780f Fixed compiler warnings
Sam Lantinga <slouken@libsdl.org>
parents: 3517
diff changeset
  1008
    return 0;
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1009
}
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1010
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1011
int
3685
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3683
diff changeset
  1012
SDL_GetWindowDisplayMode(SDL_Window * window, SDL_DisplayMode * mode)
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1013
{
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1014
    SDL_DisplayMode fullscreen_mode;
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7178
diff changeset
  1015
    SDL_VideoDisplay *display;
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1016
6936
76d9c31e823d Add additional input validation to SDL_GetWindowDisplayMode; add tests to video suite
Andreas Schiffler <aschiffler@ferzkopp.net>
parents: 6900
diff changeset
  1017
    if (!mode) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
  1018
      return SDL_InvalidParamError("mode");
6936
76d9c31e823d Add additional input validation to SDL_GetWindowDisplayMode; add tests to video suite
Andreas Schiffler <aschiffler@ferzkopp.net>
parents: 6900
diff changeset
  1019
    }
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7178
diff changeset
  1020
3695
f6a8be3fefa0 Added magic to detect already freed or otherwise invalid windows and textures.
Sam Lantinga <slouken@libsdl.org>
parents: 3694
diff changeset
  1021
    CHECK_WINDOW_MAGIC(window, -1);
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1022
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1023
    fullscreen_mode = window->fullscreen_mode;
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1024
    if (!fullscreen_mode.w) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1025
        fullscreen_mode.w = window->w;
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1026
    }
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1027
    if (!fullscreen_mode.h) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1028
        fullscreen_mode.h = window->h;
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1029
    }
7191
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7178
diff changeset
  1030
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7178
diff changeset
  1031
    display = SDL_GetDisplayForWindow(window);
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7178
diff changeset
  1032
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7178
diff changeset
  1033
    /* if in desktop size mode, just return the size of the desktop */
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7178
diff changeset
  1034
    if ( ( window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP ) == SDL_WINDOW_FULLSCREEN_DESKTOP )
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7178
diff changeset
  1035
    {
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7178
diff changeset
  1036
        fullscreen_mode = display->desktop_mode;
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7178
diff changeset
  1037
    }
75360622e65f File style cleanup for the SDL 2.0 release
Sam Lantinga <slouken@libsdl.org>
parents: 7178
diff changeset
  1038
    else if (!SDL_GetClosestDisplayModeForDisplay(SDL_GetDisplayForWindow(window),
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1039
                                             &fullscreen_mode,
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1040
                                             &fullscreen_mode)) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
  1041
        return SDL_SetError("Couldn't find display mode match");
2869
2fe507a2ef7d Whoops, the X11 driver doesn't support fullscreen modes (yet)
Sam Lantinga <slouken@libsdl.org>
parents: 2860
diff changeset
  1042
    }
3092
cad1aefa2ed9 Date: Thu, 12 Mar 2009 15:14:38 +0200
Sam Lantinga <slouken@libsdl.org>
parents: 3091
diff changeset
  1043
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1044
    if (mode) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1045
        *mode = fullscreen_mode;
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745