Skip to content

Latest commit

 

History

History
255 lines (205 loc) · 7.84 KB

SDL_androidvideo.c

File metadata and controls

255 lines (205 loc) · 7.84 KB
 
1
2
/*
Simple DirectMedia Layer
Jan 3, 2018
Jan 3, 2018
3
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#include "../../SDL_internal.h"
#if SDL_VIDEO_DRIVER_ANDROID
Jan 3, 2019
Jan 3, 2019
25
/* Android SDL video driver implementation */
26
27
28
29
30
31
32
33
34
#include "SDL_video.h"
#include "SDL_mouse.h"
#include "../SDL_sysvideo.h"
#include "../SDL_pixels_c.h"
#include "../../events/SDL_events_c.h"
#include "../../events/SDL_windowevents_c.h"
#include "SDL_androidvideo.h"
Dec 2, 2016
Dec 2, 2016
35
#include "SDL_androidgl.h"
36
37
38
#include "SDL_androidclipboard.h"
#include "SDL_androidevents.h"
#include "SDL_androidkeyboard.h"
Jan 12, 2016
Jan 12, 2016
39
#include "SDL_androidmouse.h"
40
41
#include "SDL_androidtouch.h"
#include "SDL_androidwindow.h"
Aug 28, 2017
Aug 28, 2017
42
#include "SDL_androidvulkan.h"
43
44
45
46
47
48
#define ANDROID_VID_DRIVER_NAME "Android"
/* Initialization/Query functions */
static int Android_VideoInit(_THIS);
static void Android_VideoQuit(_THIS);
Jan 3, 2019
Jan 3, 2019
49
int Android_GetDisplayDPI(_THIS, SDL_VideoDisplay *display, float *ddpi, float *hdpi, float *vdpi);
50
51
52
53
54
55
56
57
58
59
60
61
#include "../SDL_egl_c.h"
#define Android_GLES_GetProcAddress SDL_EGL_GetProcAddress
#define Android_GLES_UnloadLibrary SDL_EGL_UnloadLibrary
#define Android_GLES_SetSwapInterval SDL_EGL_SetSwapInterval
#define Android_GLES_GetSwapInterval SDL_EGL_GetSwapInterval
#define Android_GLES_DeleteContext SDL_EGL_DeleteContext
/* Android driver bootstrap functions */
/* These are filled in with real values in Android_SetScreenResolution on init (before SDL_main()) */
Jun 8, 2018
Jun 8, 2018
62
63
64
65
int Android_SurfaceWidth = 0;
int Android_SurfaceHeight = 0;
int Android_DeviceWidth = 0;
int Android_DeviceHeight = 0;
Dec 6, 2018
Dec 6, 2018
66
static Uint32 Android_ScreenFormat = SDL_PIXELFORMAT_UNKNOWN;
Dec 2, 2016
Dec 2, 2016
67
static int Android_ScreenRate = 0;
Jan 3, 2019
Jan 3, 2019
69
SDL_sem *Android_PauseSem = NULL, *Android_ResumeSem = NULL, *Android_ActivitySem = NULL;
70
71
72
73
74
75
76
77
78
79
80
81
82
83
static int
Android_Available(void)
{
return 1;
}
static void
Android_SuspendScreenSaver(_THIS)
{
Android_JNI_SuspendScreenSaver(_this->suspend_screensaver);
}
static void
Jan 3, 2019
Jan 3, 2019
84
Android_DeleteDevice(SDL_VideoDevice *device)
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
{
SDL_free(device->driverdata);
SDL_free(device);
}
static SDL_VideoDevice *
Android_CreateDevice(int devindex)
{
SDL_VideoDevice *device;
SDL_VideoData *data;
/* Initialize all variables that we clean on shutdown */
device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
if (!device) {
SDL_OutOfMemory();
return NULL;
}
Jan 3, 2019
Jan 3, 2019
103
data = (SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData));
104
105
106
107
108
109
110
111
112
113
114
115
116
if (!data) {
SDL_OutOfMemory();
SDL_free(device);
return NULL;
}
device->driverdata = data;
/* Set the function pointers */
device->VideoInit = Android_VideoInit;
device->VideoQuit = Android_VideoQuit;
device->PumpEvents = Android_PumpEvents;
Oct 31, 2017
Oct 31, 2017
117
118
device->GetDisplayDPI = Android_GetDisplayDPI;
Aug 28, 2017
Aug 28, 2017
119
device->CreateSDLWindow = Android_CreateWindow;
120
device->SetWindowTitle = Android_SetWindowTitle;
Feb 12, 2018
Feb 12, 2018
121
device->SetWindowFullscreen = Android_SetWindowFullscreen;
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
device->DestroyWindow = Android_DestroyWindow;
device->GetWindowWMInfo = Android_GetWindowWMInfo;
device->free = Android_DeleteDevice;
/* GL pointers */
device->GL_LoadLibrary = Android_GLES_LoadLibrary;
device->GL_GetProcAddress = Android_GLES_GetProcAddress;
device->GL_UnloadLibrary = Android_GLES_UnloadLibrary;
device->GL_CreateContext = Android_GLES_CreateContext;
device->GL_MakeCurrent = Android_GLES_MakeCurrent;
device->GL_SetSwapInterval = Android_GLES_SetSwapInterval;
device->GL_GetSwapInterval = Android_GLES_GetSwapInterval;
device->GL_SwapWindow = Android_GLES_SwapWindow;
device->GL_DeleteContext = Android_GLES_DeleteContext;
Aug 28, 2017
Aug 28, 2017
138
#if SDL_VIDEO_VULKAN
Aug 28, 2017
Aug 28, 2017
139
140
141
142
143
144
device->Vulkan_LoadLibrary = Android_Vulkan_LoadLibrary;
device->Vulkan_UnloadLibrary = Android_Vulkan_UnloadLibrary;
device->Vulkan_GetInstanceExtensions = Android_Vulkan_GetInstanceExtensions;
device->Vulkan_CreateSurface = Android_Vulkan_CreateSurface;
#endif
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
/* Screensaver */
device->SuspendScreenSaver = Android_SuspendScreenSaver;
/* Text input */
device->StartTextInput = Android_StartTextInput;
device->StopTextInput = Android_StopTextInput;
device->SetTextInputRect = Android_SetTextInputRect;
/* Screen keyboard */
device->HasScreenKeyboardSupport = Android_HasScreenKeyboardSupport;
device->IsScreenKeyboardShown = Android_IsScreenKeyboardShown;
/* Clipboard */
device->SetClipboardText = Android_SetClipboardText;
device->GetClipboardText = Android_GetClipboardText;
device->HasClipboardText = Android_HasClipboardText;
return device;
}
VideoBootStrap Android_bootstrap = {
ANDROID_VID_DRIVER_NAME, "SDL Android video driver",
Android_Available, Android_CreateDevice
};
int
Android_VideoInit(_THIS)
{
SDL_DisplayMode mode;
mode.format = Android_ScreenFormat;
Jun 8, 2018
Jun 8, 2018
177
178
mode.w = Android_DeviceWidth;
mode.h = Android_DeviceHeight;
179
180
181
182
183
184
185
186
187
188
189
190
mode.refresh_rate = Android_ScreenRate;
mode.driverdata = NULL;
if (SDL_AddBasicVideoDisplay(&mode) < 0) {
return -1;
}
SDL_AddDisplayMode(&_this->displays[0], &mode);
Android_InitKeyboard();
Android_InitTouch();
Jan 12, 2016
Jan 12, 2016
191
192
Android_InitMouse();
193
194
195
196
197
198
199
/* We're done! */
return 0;
}
void
Android_VideoQuit(_THIS)
{
Jun 18, 2018
Jun 18, 2018
200
Android_QuitMouse();
201
202
203
Android_QuitTouch();
}
Oct 31, 2017
Oct 31, 2017
204
int
Jan 3, 2019
Jan 3, 2019
205
Android_GetDisplayDPI(_THIS, SDL_VideoDisplay *display, float *ddpi, float *hdpi, float *vdpi)
Oct 31, 2017
Oct 31, 2017
206
207
208
209
{
return Android_JNI_GetDisplayDPI(ddpi, hdpi, vdpi);
}
Jan 3, 2019
Jan 3, 2019
211
Android_SetScreenResolution(SDL_Window *window, int surfaceWidth, int surfaceHeight, int deviceWidth, int deviceHeight, Uint32 format, float rate)
Jan 3, 2019
Jan 3, 2019
213
SDL_VideoDevice *device;
Sep 24, 2018
Sep 24, 2018
214
SDL_VideoDisplay *display;
Jun 8, 2018
Jun 8, 2018
215
216
Android_SurfaceWidth = surfaceWidth;
Android_SurfaceHeight = surfaceHeight;
Sep 24, 2018
Sep 24, 2018
217
218
Android_DeviceWidth = deviceWidth;
Android_DeviceHeight = deviceHeight;
219
Android_ScreenFormat = format;
Dec 6, 2018
Dec 6, 2018
220
Android_ScreenRate = (int)rate;
Oct 1, 2016
Oct 1, 2016
222
223
224
/*
Update the resolution of the desktop mode, so that the window
can be properly resized. The screen resolution change can for
Feb 12, 2018
Feb 12, 2018
225
example happen when the Activity enters or exits immersive mode,
Oct 1, 2016
Oct 1, 2016
226
227
which can happen after VideoInit().
*/
Mar 14, 2017
Mar 14, 2017
228
device = SDL_GetVideoDevice();
Oct 1, 2016
Oct 1, 2016
229
230
if (device && device->num_displays > 0)
{
Mar 14, 2017
Mar 14, 2017
231
display = &device->displays[0];
Oct 1, 2016
Oct 1, 2016
232
display->desktop_mode.format = Android_ScreenFormat;
Jun 8, 2018
Jun 8, 2018
233
234
display->desktop_mode.w = Android_DeviceWidth;
display->desktop_mode.h = Android_DeviceHeight;
Oct 1, 2016
Oct 1, 2016
235
236
237
display->desktop_mode.refresh_rate = Android_ScreenRate;
}
Jan 3, 2019
Jan 3, 2019
238
if (window) {
Oct 7, 2016
Oct 7, 2016
239
240
/* Force the current mode to match the resize otherwise the SDL_WINDOWEVENT_RESTORED event
* will fall back to the old mode */
Jan 3, 2019
Jan 3, 2019
241
display = SDL_GetDisplayForWindow(window);
Oct 7, 2016
Oct 7, 2016
242
Feb 12, 2018
Feb 12, 2018
243
display->display_modes[0].format = format;
Jun 8, 2018
Jun 8, 2018
244
245
display->display_modes[0].w = Android_DeviceWidth;
display->display_modes[0].h = Android_DeviceHeight;
Dec 6, 2018
Dec 6, 2018
246
display->display_modes[0].refresh_rate = (int)rate;
Feb 12, 2018
Feb 12, 2018
247
248
display->current_mode = display->display_modes[0];
Jan 3, 2019
Jan 3, 2019
249
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, surfaceWidth, surfaceHeight);
250
251
252
253
254
255
}
}
#endif /* SDL_VIDEO_DRIVER_ANDROID */
/* vi: set ts=4 sw=4 expandtab: */