src/video/SDL_video.c
author Edward Rudd <urkle@outoforder.cc>
Thu, 02 May 2013 21:40:59 -0400
changeset 7139 dd722e7460c5
parent 7135 20db445af8c7
child 7178 8e2156e2ff3e
permissions -rw-r--r--
move Ticks initialization tracking to separate function and ensure it's called with SDL_VideoInit is called to init SDL instead of SDL_Init -- why do we even allow initialization w/o calling at least SDL_Init(0) ?
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
    }
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
   419
    
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 */
5123
dc0dfdd58f27 Removed completely non-portable event thread hack.
Sam Lantinga <slouken@libsdl.org>
parents: 5103
diff changeset
   425
    if (SDL_StartEventLoop() < 0 ||
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 ||
dc0dfdd58f27 Removed completely non-portable event thread hack.
Sam Lantinga <slouken@libsdl.org>
parents: 5103
diff changeset
   428
        SDL_TouchInit() < 0 ||
dc0dfdd58f27 Removed completely non-portable event thread hack.
Sam Lantinga <slouken@libsdl.org>
parents: 5103
diff changeset
   429
        SDL_QuitInit() < 0) {
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   430
        return -1;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   431
    }
3694
b0a707f589a6 Fixed bug #916
Sam Lantinga <slouken@libsdl.org>
parents: 3693
diff changeset
   432
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   433
    /* Select the proper video driver */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   434
    index = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   435
    video = NULL;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   436
    if (driver_name == NULL) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   437
        driver_name = SDL_getenv("SDL_VIDEODRIVER");
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   438
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   439
    if (driver_name != NULL) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   440
        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
   441
            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
   442
                video = bootstrap[i]->create(index);
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   443
                break;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   444
            }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   445
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   446
    } else {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   447
        for (i = 0; bootstrap[i]; ++i) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   448
            if (bootstrap[i]->available()) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   449
                video = bootstrap[i]->create(index);
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   450
                if (video != NULL) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   451
                    break;
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
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   456
    if (video == NULL) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   457
        if (driver_name) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   458
            return SDL_SetError("%s not available", driver_name);
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   459
        }
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   460
        return SDL_SetError("No available video device");
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   461
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   462
    _this = video;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   463
    _this->name = bootstrap[i]->name;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   464
    _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
   465
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   466
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   467
    /* Set some very sane GL defaults */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   468
    _this->gl_config.driver_loaded = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   469
    _this->gl_config.dll_handle = NULL;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   470
    _this->gl_config.red_size = 3;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   471
    _this->gl_config.green_size = 3;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   472
    _this->gl_config.blue_size = 2;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   473
    _this->gl_config.alpha_size = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   474
    _this->gl_config.buffer_size = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   475
    _this->gl_config.depth_size = 16;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   476
    _this->gl_config.stencil_size = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   477
    _this->gl_config.double_buffer = 1;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   478
    _this->gl_config.accum_red_size = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   479
    _this->gl_config.accum_green_size = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   480
    _this->gl_config.accum_blue_size = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   481
    _this->gl_config.accum_alpha_size = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   482
    _this->gl_config.stereo = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   483
    _this->gl_config.multisamplebuffers = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   484
    _this->gl_config.multisamplesamples = 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   485
    _this->gl_config.retained_backing = 1;
3571
19691cebb866 Default to allow either accelerated or not
Sam Lantinga <slouken@libsdl.org>
parents: 3570
diff changeset
   486
    _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
   487
#if SDL_VIDEO_OPENGL
3100
7dc982143c06 Date: Sun, 22 Mar 2009 12:52:29 +0000
Sam Lantinga <slouken@libsdl.org>
parents: 3099
diff changeset
   488
    _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
   489
    _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
   490
    _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
   491
#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
   492
    _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
   493
    _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
   494
    _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
   495
#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
   496
    _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
   497
    _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
   498
    _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
   499
#endif
6296
b42657486c0d Add OpenGL 3.X context creation support
Sam Lantinga <slouken@libsdl.org>
parents: 6266
diff changeset
   500
    _this->gl_config.flags = 0;
b42657486c0d Add OpenGL 3.X context creation support
Sam Lantinga <slouken@libsdl.org>
parents: 6266
diff changeset
   501
    _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
   502
    _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
   503
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   504
    /* Initialize the video subsystem */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   505
    if (_this->VideoInit(_this) < 0) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   506
        SDL_VideoQuit();
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   507
        return -1;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   508
    }
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
   509
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   510
    /* Make sure some displays were added */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   511
    if (_this->num_displays == 0) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   512
        SDL_VideoQuit();
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   513
        return SDL_SetError("The video driver did not add any displays");
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   514
    }
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   515
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
   516
    /* 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
   517
    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
   518
        _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
   519
        _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
   520
        _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
   521
    }
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
   522
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
   523
    /* 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
   524
       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
   525
       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
   526
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
       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
   528
       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
   529
     */
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
    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
   531
        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
   532
    }
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
   533
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   534
    /* We're ready to go! */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   535
    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
   536
}
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
   537
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   538
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
   539
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
   540
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   541
    if (!_this) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   542
        SDL_UninitializedVideo();
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   543
        return NULL;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   544
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   545
    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
   546
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   547
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
   548
SDL_VideoDevice *
4472
791b3256fb22 Mostly cleaned up warnings with -Wmissing-prototypes
Sam Lantinga <slouken@libsdl.org>
parents: 4433
diff changeset
   549
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
   550
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   551
    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
   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
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
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
   555
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
   556
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   557
    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
   558
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   559
    SDL_zero(display);
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   560
    if (desktop_mode) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   561
        display.desktop_mode = *desktop_mode;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   562
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   563
    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
   564
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   565
    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
   566
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   567
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
   568
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
   569
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
   570
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   571
    SDL_VideoDisplay *displays;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   572
    int index = -1;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   573
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   574
    displays =
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   575
        SDL_realloc(_this->displays,
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   576
                    (_this->num_displays + 1) * sizeof(*displays));
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   577
    if (displays) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   578
        index = _this->num_displays++;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   579
        displays[index] = *display;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   580
        displays[index].device = _this;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   581
        _this->displays = displays;
6787
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   582
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   583
        if (display->name) {
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   584
            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
   585
        } else {
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   586
            char name[32];
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   587
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   588
            SDL_itoa(index, name, 10);
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   589
            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
   590
        }
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   591
    } else {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   592
        SDL_OutOfMemory();
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   593
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   594
    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
   595
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   596
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
   597
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
   598
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
   599
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   600
    if (!_this) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   601
        SDL_UninitializedVideo();
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   602
        return 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   603
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   604
    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
   605
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   606
6044
35448a5ea044 Lots of fixes importing SDL source wholesale into a new iOS project
Sam Lantinga <slouken@libsdl.org>
parents: 5571
diff changeset
   607
static int
5380
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   608
SDL_GetIndexOfDisplay(SDL_VideoDisplay *display)
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   609
{
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   610
    int displayIndex;
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   611
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   612
    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
   613
        if (display == &_this->displays[displayIndex]) {
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   614
            return displayIndex;
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
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   618
    /* 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
   619
    return 0;
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   620
}
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   621
6787
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   622
const char *
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   623
SDL_GetDisplayName(int displayIndex)
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   624
{
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   625
    CHECK_DISPLAY_INDEX(displayIndex, NULL);
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   626
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   627
    return _this->displays[displayIndex].name;
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   628
}
95a4c5a5464c Added SDL_GetDisplayName(), with implementation for Mac OS X
Sam Lantinga <slouken@libsdl.org>
parents: 6786
diff changeset
   629
5380
2de85077eb0b Simplified and unified the window creation process a little.
Sam Lantinga <slouken@libsdl.org>
parents: 5375
diff changeset
   630
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
   631
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
   632
{
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   633
    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
   634
3528
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   635
    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
   636
        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
   637
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   638
        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
   639
            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
   640
                return 0;
3528
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   641
            }
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
   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
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
        /* 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
   645
        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
   646
            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
   647
            rect->y = 0;
3528
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   648
        } 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
   649
            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
   650
            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
   651
        }
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
   652
        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
   653
        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
   654
    }
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   655
    return 0;
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   656
}
59ff7a2beb57 Added an API function to query geometry of multiple monitors:
Sam Lantinga <slouken@libsdl.org>
parents: 3526
diff changeset
   657
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
   658
SDL_bool
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   659
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
   660
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   661
    SDL_DisplayMode *modes;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   662
    int i, nmodes;
910
4ab6d1fd028f Date: Sat, 26 Jun 2004 14:58:42 +0300
Sam Lantinga <slouken@libsdl.org>
parents: 883
diff changeset
   663
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   664
    /* Make sure we don't already have the mode in the list */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   665
    modes = display->display_modes;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   666
    nmodes = display->num_display_modes;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   667
    for (i = nmodes; i--;) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   668
        if (SDL_memcmp(mode, &modes[i], sizeof(*mode)) == 0) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   669
            return SDL_FALSE;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   670
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   671
    }
910
4ab6d1fd028f Date: Sat, 26 Jun 2004 14:58:42 +0300
Sam Lantinga <slouken@libsdl.org>
parents: 883
diff changeset
   672
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   673
    /* Go ahead and add the new mode */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   674
    if (nmodes == display->max_display_modes) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   675
        modes =
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   676
            SDL_realloc(modes,
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   677
                        (display->max_display_modes + 32) * sizeof(*modes));
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   678
        if (!modes) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   679
            return SDL_FALSE;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   680
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   681
        display->display_modes = modes;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   682
        display->max_display_modes += 32;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   683
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   684
    modes[nmodes] = *mode;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   685
    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
   686
3178
72edc980789b 1. SDL_CreateTextureFromSurface() now tries to find surface's pixel format.
Mike Gorchak <lestat@i.com.ua>
parents: 3169
diff changeset
   687
    /* 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
   688
    SDL_qsort(display->display_modes, display->num_display_modes,
3186
Sam Lantinga <slouken@libsdl.org>
parents: 3178
diff changeset
   689
              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
   690
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   691
    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
   692
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   693
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   694
static int
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   695
SDL_GetNumDisplayModesForDisplay(SDL_VideoDisplay * display)
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   696
{
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   697
    if (!display->num_display_modes && _this->GetDisplayModes) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   698
        _this->GetDisplayModes(_this, display);
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   699
        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
   700
                  sizeof(SDL_DisplayMode), cmpmodes);
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   701
    }
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   702
    return display->num_display_modes;
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
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   705
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
   706
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
   707
{
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   708
    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
   709
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   710
    return SDL_GetNumDisplayModesForDisplay(&_this->displays[displayIndex]);
3500
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
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   713
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
   714
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
   715
{
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   716
    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
   717
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   718
    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
   719
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   720
    display = &_this->displays[displayIndex];
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   721
    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
   722
        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
   723
                            SDL_GetNumDisplayModesForDisplay(display) - 1);
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   724
    }
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   725
    if (mode) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   726
        *mode = display->display_modes[index];
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   727
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   728
    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
   729
}
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
   730
1967
01e29c3e9a29 In general, fill in pointers to structures, rather than return them.
Sam Lantinga <slouken@libsdl.org>
parents: 1965
diff changeset
   731
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
   732
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
   733
{
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   734
    SDL_VideoDisplay *display;
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   735
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   736
    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
   737
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   738
    display = &_this->displays[displayIndex];
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   739
    if (mode) {
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   740
        *mode = display->desktop_mode;
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   741
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   742
    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
   743
}
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
   744
1967
01e29c3e9a29 In general, fill in pointers to structures, rather than return them.
Sam Lantinga <slouken@libsdl.org>
parents: 1965
diff changeset
   745
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
   746
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
   747
{
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   748
    SDL_VideoDisplay *display;
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   749
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   750
    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
   751
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   752
    display = &_this->displays[displayIndex];
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   753
    if (mode) {
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   754
        *mode = display->current_mode;
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   755
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   756
    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
   757
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   758
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   759
static SDL_DisplayMode *
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   760
SDL_GetClosestDisplayModeForDisplay(SDL_VideoDisplay * display,
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   761
                                    const SDL_DisplayMode * mode,
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   762
                                    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
   763
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   764
    Uint32 target_format;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   765
    int target_refresh_rate;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   766
    int i;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   767
    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
   768
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   769
    if (!mode || !closest) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   770
        SDL_SetError("Missing desired mode or closest mode parameter");
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   771
        return NULL;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   772
    }
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   773
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   774
    /* Default to the desktop format */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   775
    if (mode->format) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   776
        target_format = mode->format;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   777
    } else {
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   778
        target_format = display->desktop_mode.format;
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   779
    }
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
   780
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   781
    /* Default to the desktop refresh rate */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   782
    if (mode->refresh_rate) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   783
        target_refresh_rate = mode->refresh_rate;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   784
    } else {
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   785
        target_refresh_rate = display->desktop_mode.refresh_rate;
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   786
    }
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
   787
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   788
    match = NULL;
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   789
    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
   790
        current = &display->display_modes[i];
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   791
2789
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   792
        if (current->w && (current->w < mode->w)) {
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   793
            /* Out of sorted modes large enough here */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   794
            break;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   795
        }
2789
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   796
        if (current->h && (current->h < mode->h)) {
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   797
            if (current->w && (current->w == mode->w)) {
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   798
                /* Out of sorted modes large enough here */
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   799
                break;
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   800
            }
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   801
            /* 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
   802
               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
   803
               modes may still follow. */
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   804
            continue;
985001797115 Fixed bug #605, per Martin's suggestion
Sam Lantinga <slouken@libsdl.org>
parents: 2787
diff changeset
   805
        }
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   806
        if (!match || current->w < match->w || current->h < match->h) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   807
            match = current;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   808
            continue;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   809
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   810
        if (current->format != match->format) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   811
            /* Sorted highest depth to lowest */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   812
            if (current->format == target_format ||
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   813
                (SDL_BITSPERPIXEL(current->format) >=
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   814
                 SDL_BITSPERPIXEL(target_format)
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   815
                 && SDL_PIXELTYPE(current->format) ==
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   816
                 SDL_PIXELTYPE(target_format))) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   817
                match = current;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   818
            }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   819
            continue;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   820
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   821
        if (current->refresh_rate != match->refresh_rate) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   822
            /* Sorted highest refresh to lowest */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   823
            if (current->refresh_rate >= target_refresh_rate) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   824
                match = current;
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
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   828
    if (match) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   829
        if (match->format) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   830
            closest->format = match->format;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   831
        } else {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   832
            closest->format = mode->format;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   833
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   834
        if (match->w && match->h) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   835
            closest->w = match->w;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   836
            closest->h = match->h;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   837
        } else {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   838
            closest->w = mode->w;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   839
            closest->h = mode->h;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   840
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   841
        if (match->refresh_rate) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   842
            closest->refresh_rate = match->refresh_rate;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   843
        } else {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   844
            closest->refresh_rate = mode->refresh_rate;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   845
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   846
        closest->driverdata = match->driverdata;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   847
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   848
        /*
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   849
         * Pick some reasonable defaults if the app and driver don't
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   850
         * care
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   851
         */
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   852
        if (!closest->format) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   853
            closest->format = SDL_PIXELFORMAT_RGB888;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   854
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   855
        if (!closest->w) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   856
            closest->w = 640;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   857
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   858
        if (!closest->h) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   859
            closest->h = 480;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   860
        }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   861
        return closest;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   862
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   863
    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
   864
}
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
   865
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   866
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
   867
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
   868
                          const SDL_DisplayMode * mode,
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   869
                          SDL_DisplayMode * closest)
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   870
{
5244
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   871
    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
   872
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   873
    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
   874
762e40fb8e28 Be explicit about what display you're querying. The default display is 0.
Sam Lantinga <slouken@libsdl.org>
parents: 5243
diff changeset
   875
    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
   876
    return SDL_GetClosestDisplayModeForDisplay(display, mode, closest);
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   877
}
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   878
6044
35448a5ea044 Lots of fixes importing SDL source wholesale into a new iOS project
Sam Lantinga <slouken@libsdl.org>
parents: 5571
diff changeset
   879
static int
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   880
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
   881
{
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   882
    SDL_DisplayMode display_mode;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   883
    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
   884
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
   885
    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
   886
        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
   887
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
        /* 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
   889
        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
   890
            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
   891
        }
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
        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
   893
            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
   894
        }
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
        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
   896
            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
   897
        }
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
        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
   899
            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
   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
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
        /* 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
   903
        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
   904
            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
   905
                                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
   906
        }
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
    } 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
   908
        display_mode = display->desktop_mode;
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   909
    }
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   910
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   911
    /* 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
   912
    current_mode = display->current_mode;
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   913
    if (SDL_memcmp(&display_mode, &current_mode, sizeof(display_mode)) == 0) {
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   914
        return 0;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   915
    }
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   916
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   917
    /* 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
   918
    if (!_this->SetDisplayMode) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
   919
        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
   920
    }
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
   921
    if (_this->SetDisplayMode(_this, display, &display_mode) < 0) {
2753
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   922
        return -1;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   923
    }
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   924
    display->current_mode = display_mode;
Sam Lantinga <slouken@libsdl.org>
parents: 2745
diff changeset
   925
    return 0;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   926
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   927
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
   928
int
6786
7174fb08017a Renamed SDL_GetWindowDisplay() to SDL_GetWindowDisplayIndex()
Sam Lantinga <slouken@libsdl.org>
parents: 6784
diff changeset
   929
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
   930
{
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 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
   932
    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
   933
    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
   934
    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
   935
    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
   936
    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
   937
    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
   938
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
    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
   940
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
    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
   942
        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
   943
        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
   944
        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
   945
            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
   946
        }
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
        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
   948
    }
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
    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
   950
        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
   951
        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
   952
        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
   953
            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
   954
        }
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
        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
   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
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
   958
    /* 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
   959
    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
   960
        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
   961
38bc368a3b87 A window being fullscreen takes precedence over coordinate checks
Sam Lantinga <slouken@libsdl.org>
parents: 6522
diff changeset
   962
        if (display->fullscreen_window == window) {
38bc368a3b87 A window being fullscreen takes precedence over coordinate checks
Sam Lantinga <slouken@libsdl.org>
parents: 6522
diff changeset
   963
            return i;
38bc368a3b87 A window being fullscreen takes precedence over coordinate checks
Sam Lantinga <slouken@libsdl.org>
parents: 6522
diff changeset
   964
        }
38bc368a3b87 A window being fullscreen takes precedence over coordinate checks
Sam Lantinga <slouken@libsdl.org>
parents: 6522
diff changeset
   965
    }
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
   966
    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
   967
    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
   968
    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
   969
        SDL_GetDisplayBounds(i, &rect);
6547
38bc368a3b87 A window being fullscreen takes precedence over coordinate checks
Sam Lantinga <slouken@libsdl.org>
parents: 6522
diff changeset
   970
        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
   971
            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
   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
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.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
   975
        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
   976
        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
   977
        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
   978
            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
   979
            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
   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
    }
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
    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
   983
        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
   984
    }
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
    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
   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
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_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
   989
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
   990
{
6786
7174fb08017a Renamed SDL_GetWindowDisplay() to SDL_GetWindowDisplayIndex()
Sam Lantinga <slouken@libsdl.org>
parents: 6784
diff changeset
   991
    int displayIndex = SDL_GetWindowDisplayIndex(window);
5373
02007fd16991 Do error checking in SDL_GetDisplayForWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 5306
diff changeset
   992
    if (displayIndex >= 0) {
02007fd16991 Do error checking in SDL_GetDisplayForWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 5306
diff changeset
   993
        return &_this->displays[displayIndex];
02007fd16991 Do error checking in SDL_GetDisplayForWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 5306
diff changeset
   994
    } else {
02007fd16991 Do error checking in SDL_GetDisplayForWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 5306
diff changeset
   995
        return NULL;
02007fd16991 Do error checking in SDL_GetDisplayForWindow()
Sam Lantinga <slouken@libsdl.org>
parents: 5306
diff changeset
   996
    }
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
   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
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
   999
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
  1000
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
  1001
{
3695
f6a8be3fefa0 Added magic to detect already freed or otherwise invalid windows and textures.
Sam Lantinga <slouken@libsdl.org>
parents: 3694
diff changeset
  1002
    CHECK_WINDOW_MAGIC(window, -1);
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1003
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1004
    if (mode) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1005
        window->fullscreen_mode = *mode;
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1006
    } else {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1007
        SDL_zero(window->fullscreen_mode);
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1008
    }
3526
e6f2f312780f Fixed compiler warnings
Sam Lantinga <slouken@libsdl.org>
parents: 3517
diff changeset
  1009
    return 0;
3500
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
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1012
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
  1013
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
  1014
{
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1015
    SDL_DisplayMode fullscreen_mode;
6755
af77e1a6faf0 Improvements from Alfred:
Sam Lantinga <slouken@libsdl.org>
parents: 6681
diff changeset
  1016
	SDL_VideoDisplay *display;
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1017
6936
76d9c31e823d Add additional input validation to SDL_GetWindowDisplayMode; add tests to video suite
Andreas Schiffler <aschiffler@ferzkopp.net>
parents: 6900
diff changeset
  1018
    if (!mode) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
  1019
      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
  1020
    }
76d9c31e823d Add additional input validation to SDL_GetWindowDisplayMode; add tests to video suite
Andreas Schiffler <aschiffler@ferzkopp.net>
parents: 6900
diff changeset
  1021
    
3695
f6a8be3fefa0 Added magic to detect already freed or otherwise invalid windows and textures.
Sam Lantinga <slouken@libsdl.org>
parents: 3694
diff changeset
  1022
    CHECK_WINDOW_MAGIC(window, -1);
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1023
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1024
    fullscreen_mode = window->fullscreen_mode;
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1025
    if (!fullscreen_mode.w) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1026
        fullscreen_mode.w = window->w;
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1027
    }
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1028
    if (!fullscreen_mode.h) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1029
        fullscreen_mode.h = window->h;
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1030
    }
6755
af77e1a6faf0 Improvements from Alfred:
Sam Lantinga <slouken@libsdl.org>
parents: 6681
diff changeset
  1031
	
af77e1a6faf0 Improvements from Alfred:
Sam Lantinga <slouken@libsdl.org>
parents: 6681
diff changeset
  1032
	display = SDL_GetDisplayForWindow(window);
af77e1a6faf0 Improvements from Alfred:
Sam Lantinga <slouken@libsdl.org>
parents: 6681
diff changeset
  1033
af77e1a6faf0 Improvements from Alfred:
Sam Lantinga <slouken@libsdl.org>
parents: 6681
diff changeset
  1034
	/* if in desktop size mode, just return the size of the desktop */
af77e1a6faf0 Improvements from Alfred:
Sam Lantinga <slouken@libsdl.org>
parents: 6681
diff changeset
  1035
	if ( ( window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP ) == SDL_WINDOW_FULLSCREEN_DESKTOP ) 
af77e1a6faf0 Improvements from Alfred:
Sam Lantinga <slouken@libsdl.org>
parents: 6681
diff changeset
  1036
	{
af77e1a6faf0 Improvements from Alfred:
Sam Lantinga <slouken@libsdl.org>
parents: 6681
diff changeset
  1037
		fullscreen_mode = display->desktop_mode;
af77e1a6faf0 Improvements from Alfred:
Sam Lantinga <slouken@libsdl.org>
parents: 6681
diff changeset
  1038
	}
af77e1a6faf0 Improvements from Alfred:
Sam Lantinga <slouken@libsdl.org>
parents: 6681
diff changeset
  1039
	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
  1040
                                             &fullscreen_mode,
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1041
                                             &fullscreen_mode)) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 7014
diff changeset
  1042
        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
  1043
    }
3092
cad1aefa2ed9 Date: Thu, 12 Mar 2009 15:14:38 +0200
Sam Lantinga <slouken@libsdl.org>
parents: 3091
diff changeset
  1044
3500
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1045
    if (mode) {
4b594623401b Work in progress on multi-display support:
Sam Lantinga <slouken@libsdl.org>
parents: 3489
diff changeset
  1046
        *mode = fullscreen_mode;