Skip to content

Latest commit

 

History

History
644 lines (560 loc) · 19.4 KB

SDL_ph_video.c

File metadata and controls

644 lines (560 loc) · 19.4 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
/*
SDL - Simple DirectMedia Layer
Feb 1, 2006
Feb 1, 2006
3
Copyright (C) 1997-2006 Sam Lantinga
Apr 26, 2001
Apr 26, 2001
4
5
This library is free software; you can redistribute it and/or
Feb 1, 2006
Feb 1, 2006
6
modify it under the terms of the GNU Lesser General Public
Apr 26, 2001
Apr 26, 2001
7
License as published by the Free Software Foundation; either
Feb 1, 2006
Feb 1, 2006
8
version 2.1 of the License, or (at your option) any later version.
Apr 26, 2001
Apr 26, 2001
9
10
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Feb 1, 2006
Feb 1, 2006
13
Lesser General Public License for more details.
Apr 26, 2001
Apr 26, 2001
14
Feb 1, 2006
Feb 1, 2006
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Apr 26, 2001
Apr 26, 2001
18
19
Sam Lantinga
Dec 14, 2001
Dec 14, 2001
20
slouken@libsdl.org
Apr 26, 2001
Apr 26, 2001
21
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
Apr 26, 2001
Apr 26, 2001
23
24
25
26
#include <unistd.h>
#include <sys/ioctl.h>
Feb 10, 2006
Feb 10, 2006
27
#include "SDL_endian.h"
Apr 26, 2001
Apr 26, 2001
28
29
30
31
#include "SDL_timer.h"
#include "SDL_thread.h"
#include "SDL_video.h"
#include "SDL_mouse.h"
Feb 16, 2006
Feb 16, 2006
32
33
34
#include "../SDL_sysvideo.h"
#include "../SDL_pixels_c.h"
#include "../../events/SDL_events_c.h"
Apr 26, 2001
Apr 26, 2001
35
36
37
38
39
#include "SDL_ph_video.h"
#include "SDL_ph_modes_c.h"
#include "SDL_ph_image_c.h"
#include "SDL_ph_events_c.h"
#include "SDL_ph_mouse_c.h"
May 10, 2001
May 10, 2001
40
#include "SDL_ph_wm_c.h"
Jul 18, 2004
Jul 18, 2004
41
#include "SDL_ph_gl.h"
Apr 26, 2001
Apr 26, 2001
42
#include "SDL_phyuv_c.h"
Feb 16, 2006
Feb 16, 2006
43
#include "../blank_cursor.h"
Apr 26, 2001
Apr 26, 2001
44
Aug 30, 2003
Aug 30, 2003
45
46
47
static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat);
static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
Apr 26, 2001
Apr 26, 2001
48
49
static void ph_VideoQuit(_THIS);
static void ph_DeleteDevice(SDL_VideoDevice *device);
Mar 2, 2002
Mar 2, 2002
50
Sep 21, 2003
Sep 21, 2003
51
52
static int phstatus=-1;
Apr 26, 2001
Apr 26, 2001
53
54
static int ph_Available(void)
{
Feb 14, 2004
Feb 14, 2004
55
if (phstatus!=0)
Mar 11, 2002
Mar 11, 2002
56
{
Sep 21, 2003
Sep 21, 2003
57
58
59
60
61
62
63
64
65
phstatus=PtInit(NULL);
if (phstatus==0)
{
return 1;
}
else
{
return 0;
}
Mar 11, 2002
Mar 11, 2002
66
}
Sep 21, 2003
Sep 21, 2003
67
return 1;
Apr 26, 2001
Apr 26, 2001
68
69
}
May 6, 2004
May 6, 2004
70
static SDL_VideoDevice* ph_CreateDevice(int devindex)
Apr 26, 2001
Apr 26, 2001
71
{
May 6, 2004
May 6, 2004
72
SDL_VideoDevice* device;
Apr 26, 2001
Apr 26, 2001
73
74
/* Initialize all variables that we clean on shutdown */
Feb 7, 2006
Feb 7, 2006
75
device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice));
May 6, 2004
May 6, 2004
76
77
if (device)
{
Feb 7, 2006
Feb 7, 2006
78
79
SDL_memset(device, 0, (sizeof *device));
device->hidden = (struct SDL_PrivateVideoData*)SDL_malloc((sizeof *device->hidden));
Apr 26, 2001
Apr 26, 2001
80
81
device->gl_data = NULL;
}
May 6, 2004
May 6, 2004
82
83
if ((device == NULL) || (device->hidden == NULL))
{
Apr 26, 2001
Apr 26, 2001
84
85
SDL_OutOfMemory();
ph_DeleteDevice(device);
May 6, 2004
May 6, 2004
86
return NULL;
Apr 26, 2001
Apr 26, 2001
87
}
Feb 7, 2006
Feb 7, 2006
88
SDL_memset(device->hidden, 0, (sizeof *device->hidden));
Apr 26, 2001
Apr 26, 2001
89
90
/* Set the driver flags */
May 6, 2004
May 6, 2004
91
device->handles_any_size = 1;
Apr 26, 2001
Apr 26, 2001
92
93
/* Set the function pointers */
Jan 18, 2002
Jan 18, 2002
94
device->CreateYUVOverlay = ph_CreateYUVOverlay;
Apr 26, 2001
Apr 26, 2001
95
96
97
device->VideoInit = ph_VideoInit;
device->ListModes = ph_ListModes;
device->SetVideoMode = ph_SetVideoMode;
Mar 11, 2002
Mar 11, 2002
98
device->ToggleFullScreen = ph_ToggleFullScreen;
Jan 20, 2003
Jan 20, 2003
99
device->UpdateMouse = ph_UpdateMouse;
Apr 26, 2001
Apr 26, 2001
100
device->SetColors = ph_SetColors;
May 6, 2004
May 6, 2004
101
device->UpdateRects = NULL; /* set up in ph_SetupUpdateFunction */
Apr 26, 2001
Apr 26, 2001
102
103
device->VideoQuit = ph_VideoQuit;
device->AllocHWSurface = ph_AllocHWSurface;
Feb 14, 2004
Feb 14, 2004
104
105
106
107
device->CheckHWBlit = ph_CheckHWBlit;
device->FillHWRect = ph_FillHWRect;
device->SetHWColorKey = ph_SetHWColorKey;
device->SetHWAlpha = ph_SetHWAlpha;
Apr 26, 2001
Apr 26, 2001
108
109
110
111
device->LockHWSurface = ph_LockHWSurface;
device->UnlockHWSurface = ph_UnlockHWSurface;
device->FlipHWSurface = ph_FlipHWSurface;
device->FreeHWSurface = ph_FreeHWSurface;
May 10, 2001
May 10, 2001
112
device->SetCaption = ph_SetCaption;
Apr 26, 2001
Apr 26, 2001
113
device->SetIcon = NULL;
May 10, 2001
May 10, 2001
114
device->IconifyWindow = ph_IconifyWindow;
Feb 20, 2002
Feb 20, 2002
115
device->GrabInput = ph_GrabInput;
Mar 2, 2002
Mar 2, 2002
116
device->GetWMInfo = ph_GetWMInfo;
Apr 26, 2001
Apr 26, 2001
117
118
119
120
device->FreeWMCursor = ph_FreeWMCursor;
device->CreateWMCursor = ph_CreateWMCursor;
device->ShowWMCursor = ph_ShowWMCursor;
device->WarpWMCursor = ph_WarpWMCursor;
Aug 30, 2003
Aug 30, 2003
121
device->MoveWMCursor = NULL;
Apr 26, 2001
Apr 26, 2001
122
123
124
125
device->CheckMouseMode = ph_CheckMouseMode;
device->InitOSKeymap = ph_InitOSKeymap;
device->PumpEvents = ph_PumpEvents;
Feb 14, 2002
Feb 14, 2002
126
/* OpenGL support. */
Feb 16, 2006
Feb 16, 2006
127
#if SDL_VIDEO_OPENGL
Aug 30, 2003
Aug 30, 2003
128
device->GL_MakeCurrent = ph_GL_MakeCurrent;
Jan 18, 2002
Jan 18, 2002
129
device->GL_SwapBuffers = ph_GL_SwapBuffers;
Mar 2, 2002
Mar 2, 2002
130
device->GL_GetAttribute = ph_GL_GetAttribute;
Aug 4, 2003
Aug 4, 2003
131
132
device->GL_LoadLibrary = ph_GL_LoadLibrary;
device->GL_GetProcAddress = ph_GL_GetProcAddress;
Feb 16, 2006
Feb 16, 2006
133
#endif /* SDL_VIDEO_OPENGL */
Jan 18, 2002
Jan 18, 2002
134
Apr 26, 2001
Apr 26, 2001
135
device->free = ph_DeleteDevice;
Aug 4, 2003
Aug 4, 2003
136
Apr 26, 2001
Apr 26, 2001
137
138
139
return device;
}
May 10, 2001
May 10, 2001
140
VideoBootStrap ph_bootstrap = {
Mar 23, 2002
Mar 23, 2002
141
142
"photon", "QNX Photon video output",
ph_Available, ph_CreateDevice
Apr 26, 2001
Apr 26, 2001
143
144
145
146
};
static void ph_DeleteDevice(SDL_VideoDevice *device)
{
Mar 11, 2002
Mar 11, 2002
147
148
149
150
if (device)
{
if (device->hidden)
{
Feb 7, 2006
Feb 7, 2006
151
SDL_free(device->hidden);
Apr 26, 2001
Apr 26, 2001
152
153
device->hidden = NULL;
}
Mar 11, 2002
Mar 11, 2002
154
155
if (device->gl_data)
{
Feb 7, 2006
Feb 7, 2006
156
SDL_free(device->gl_data);
Apr 26, 2001
Apr 26, 2001
157
158
device->gl_data = NULL;
}
Feb 7, 2006
Feb 7, 2006
159
SDL_free(device);
Apr 26, 2001
Apr 26, 2001
160
161
162
163
device = NULL;
}
}
Jan 20, 2003
Jan 20, 2003
164
165
166
167
static PtWidget_t *ph_CreateWindow(_THIS)
{
PtWidget_t *widget;
Dec 10, 2003
Dec 10, 2003
168
widget = PtCreateWidget(PtWindow, NULL, 0, NULL);
Jan 20, 2003
Jan 20, 2003
169
170
171
172
173
174
175
176
return widget;
}
static int ph_SetupWindow(_THIS, int w, int h, int flags)
{
PtArg_t args[32];
PhPoint_t pos = {0, 0};
Dec 10, 2003
Dec 10, 2003
177
PhDim_t* olddim;
Jan 20, 2003
Jan 20, 2003
178
PhDim_t dim = {w, h};
Dec 10, 2003
Dec 10, 2003
179
PhRect_t desktopextent;
Jan 20, 2003
Jan 20, 2003
180
int nargs = 0;
Aug 23, 2003
Aug 23, 2003
181
182
183
const char* windowpos;
const char* iscentered;
int x, y;
Jan 20, 2003
Jan 20, 2003
184
Dec 10, 2003
Dec 10, 2003
185
186
187
188
189
190
/* check if window size has been changed by Window Manager */
PtGetResource(window, Pt_ARG_DIM, &olddim, 0);
if ((olddim->w!=w) || (olddim->h!=h))
{
PtSetArg(&args[nargs++], Pt_ARG_DIM, &dim, 0);
}
Jan 20, 2003
Jan 20, 2003
191
192
193
if ((flags & SDL_RESIZABLE) == SDL_RESIZABLE)
{
Dec 10, 2003
Dec 10, 2003
194
195
196
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE, Ph_WM_CLOSE);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE, Ph_WM_MAX | Ph_WM_RESTORE | Ph_WM_RESIZE);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE, Ph_WM_RESIZE | Ph_WM_MOVE | Ph_WM_CLOSE | Ph_WM_MAX | Ph_WM_RESTORE);
Aug 4, 2003
Aug 4, 2003
197
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_TRUE, Ph_WM_RENDER_RESIZE | Ph_WM_RENDER_MAX | Ph_WM_RENDER_COLLAPSE | Ph_WM_RENDER_RETURN);
Dec 10, 2003
Dec 10, 2003
198
PtSetArg(&args[nargs++], Pt_ARG_RESIZE_FLAGS, Pt_TRUE, Pt_RESIZE_XY_AS_REQUIRED);
Jan 20, 2003
Jan 20, 2003
199
200
201
}
else
{
Aug 4, 2003
Aug 4, 2003
202
203
204
205
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE, Ph_WM_RESIZE | Ph_WM_MAX | Ph_WM_RESTORE | Ph_WM_CLOSE);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_FALSE, Ph_WM_RESIZE | Ph_WM_MAX | Ph_WM_RESTORE);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE, Ph_WM_MOVE | Ph_WM_CLOSE);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE, Ph_WM_RENDER_RESIZE | Ph_WM_RENDER_MAX | Ph_WM_RENDER_COLLAPSE | Ph_WM_RENDER_RETURN);
Dec 10, 2003
Dec 10, 2003
206
PtSetArg(&args[nargs++], Pt_ARG_RESIZE_FLAGS, Pt_FALSE, Pt_RESIZE_XY_AS_REQUIRED);
Jan 20, 2003
Jan 20, 2003
207
208
209
210
}
if (((flags & SDL_NOFRAME)==SDL_NOFRAME) || ((flags & SDL_FULLSCREEN)==SDL_FULLSCREEN))
{
Aug 4, 2003
Aug 4, 2003
211
212
213
214
215
216
217
218
219
if ((flags & SDL_RESIZABLE) != SDL_RESIZABLE)
{
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE, Pt_TRUE);
}
else
{
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE, Pt_TRUE);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_TRUE, Ph_WM_RENDER_RESIZE | Ph_WM_RENDER_BORDER);
}
Jan 20, 2003
Jan 20, 2003
220
221
222
223
}
else
{
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_TRUE, Ph_WM_RENDER_BORDER | Ph_WM_RENDER_TITLE |
Aug 4, 2003
Aug 4, 2003
224
Ph_WM_RENDER_CLOSE | Ph_WM_RENDER_MENU | Ph_WM_RENDER_MIN);
Jan 20, 2003
Jan 20, 2003
225
226
}
Aug 4, 2003
Aug 4, 2003
227
if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN)
Jan 20, 2003
Jan 20, 2003
228
229
{
PtSetArg(&args[nargs++], Pt_ARG_POS, &pos, 0);
Aug 23, 2003
Aug 23, 2003
230
PtSetArg(&args[nargs++], Pt_ARG_BASIC_FLAGS, Pt_TRUE, Pt_BASIC_PREVENT_FILL);
Dec 10, 2003
Dec 10, 2003
231
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE, Ph_WM_FFRONT | Ph_WM_MAX | Ph_WM_TOFRONT | Ph_WM_CONSWITCH);
Aug 23, 2003
Aug 23, 2003
232
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_TRUE, Ph_WM_STATE_ISFRONT | Ph_WM_STATE_ISFOCUS | Ph_WM_STATE_ISALTKEY);
Jan 20, 2003
Jan 20, 2003
233
234
235
}
else
{
May 6, 2004
May 6, 2004
236
237
238
239
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE, Ph_WM_FFRONT | Ph_WM_CONSWITCH);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_FALSE, Ph_WM_STATE_ISFRONT);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_TRUE, Ph_WM_STATE_ISALTKEY);
Feb 14, 2004
Feb 14, 2004
240
241
242
243
244
245
246
247
if ((flags & SDL_HWSURFACE) == SDL_HWSURFACE)
{
PtSetArg(&args[nargs++], Pt_ARG_BASIC_FLAGS, Pt_TRUE, Pt_BASIC_PREVENT_FILL);
}
else
{
PtSetArg(&args[nargs++], Pt_ARG_FILL_COLOR, Pg_BLACK, 0);
}
Dec 10, 2003
Dec 10, 2003
248
if (!currently_maximized)
Aug 23, 2003
Aug 23, 2003
249
{
Feb 7, 2006
Feb 7, 2006
250
251
windowpos = SDL_getenv("SDL_VIDEO_WINDOW_POS");
iscentered = SDL_getenv("SDL_VIDEO_CENTERED");
Dec 10, 2003
Dec 10, 2003
252
Feb 7, 2006
Feb 7, 2006
253
if ((iscentered) || ((windowpos) && (SDL_strcmp(windowpos, "center")==0)))
Aug 23, 2003
Aug 23, 2003
254
{
Dec 10, 2003
Dec 10, 2003
255
256
PhWindowQueryVisible(Ph_QUERY_CONSOLE, 0, 0, &desktopextent);
if (desktop_mode.width>w)
Aug 23, 2003
Aug 23, 2003
257
{
Dec 10, 2003
Dec 10, 2003
258
259
260
261
262
pos.x = (desktop_mode.width - w)/2;
}
if (desktop_mode.height>h)
{
pos.y = (desktop_mode.height - h)/2;
Aug 23, 2003
Aug 23, 2003
263
264
}
Dec 10, 2003
Dec 10, 2003
265
266
267
268
269
270
271
272
pos.x+=desktopextent.ul.x;
pos.y+=desktopextent.ul.y;
PtSetArg(&args[nargs++], Pt_ARG_POS, &pos, 0);
}
else
{
if (windowpos)
{
Feb 7, 2006
Feb 7, 2006
273
if (SDL_sscanf(windowpos, "%d,%d", &x, &y) == 2)
Dec 10, 2003
Dec 10, 2003
274
275
276
277
278
279
280
281
282
283
284
285
{
if ((x<desktop_mode.width) && (y<desktop_mode.height))
{
PhWindowQueryVisible(Ph_QUERY_CONSOLE, 0, 0, &desktopextent);
pos.x=x+desktopextent.ul.x;
pos.y=y+desktopextent.ul.y;
}
PtSetArg(&args[nargs++], Pt_ARG_POS, &pos, 0);
}
}
}
}
Aug 23, 2003
Aug 23, 2003
286
Dec 10, 2003
Dec 10, 2003
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
/* if window is maximized render it as maximized */
if (currently_maximized)
{
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_TRUE, Ph_WM_STATE_ISMAX);
}
else
{
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_FALSE, Ph_WM_STATE_ISMAX);
}
/* do not grab the keyboard by default */
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_FALSE, Ph_WM_STATE_ISALTKEY);
/* bring the focus to the window */
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_TRUE, Ph_WM_STATE_ISFOCUS);
Feb 14, 2004
Feb 14, 2004
303
/* allow to catch hide event */
Jan 20, 2003
Jan 20, 2003
304
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE, Ph_WM_HIDE);
Aug 4, 2003
Aug 4, 2003
305
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE, Ph_WM_HIDE);
Jan 20, 2003
Jan 20, 2003
306
307
308
309
}
PtSetResources(window, nargs, args);
PtRealizeWidget(window);
Aug 23, 2003
Aug 23, 2003
310
PtWindowToFront(window);
Jan 20, 2003
Jan 20, 2003
311
Feb 14, 2004
Feb 14, 2004
312
313
314
315
316
#if 0 /* FIXME */
PtGetResource(window, Pt_ARG_POS, &olddim, 0);
fprintf(stderr, "POSITION: %d, %d\n", olddim->w, olddim->h);
#endif
Jan 20, 2003
Jan 20, 2003
317
318
319
return 0;
}
Aug 4, 2003
Aug 4, 2003
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
static const struct ColourMasks* ph_GetColourMasks(int bpp)
{
/* The alpha mask doesn't appears to be needed */
static const struct ColourMasks phColorMasks[5] = {
/* 8 bit */ {0, 0, 0, 0, 8},
/* 15 bit ARGB */ {0x7C00, 0x03E0, 0x001F, 0x8000, 15},
/* 16 bit RGB */ {0xF800, 0x07E0, 0x001F, 0x0000, 16},
/* 24 bit RGB */ {0xFF0000, 0x00FF00, 0x0000FF, 0x000000, 24},
/* 32 bit ARGB */ {0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000, 32},
};
switch (bpp)
{
case 8:
return &phColorMasks[0];
case 15:
return &phColorMasks[1];
case 16:
return &phColorMasks[2];
case 24:
return &phColorMasks[3];
case 32:
return &phColorMasks[4];
}
return NULL;
}
Feb 14, 2004
Feb 14, 2004
347
static int ph_VideoInit(_THIS, SDL_PixelFormat* vformat)
Apr 26, 2001
Apr 26, 2001
348
{
Feb 14, 2004
Feb 14, 2004
349
PgHWCaps_t hwcaps;
Aug 4, 2003
Aug 4, 2003
350
int i;
Apr 26, 2001
Apr 26, 2001
351
Mar 11, 2002
Mar 11, 2002
352
window=NULL;
Mar 23, 2002
Mar 23, 2002
353
desktoppal=SDLPH_PAL_NONE;
Aug 30, 2003
Aug 30, 2003
354
Feb 16, 2006
Feb 16, 2006
355
#if SDL_VIDEO_OPENGL
Mar 28, 2002
Mar 28, 2002
356
oglctx=NULL;
Jul 18, 2004
Jul 18, 2004
357
oglbuffers=NULL;
Aug 30, 2003
Aug 30, 2003
358
359
oglflags=0;
oglbpp=0;
Feb 16, 2006
Feb 16, 2006
360
#endif
Mar 23, 2002
Mar 23, 2002
361
362
363
old_video_mode=-1;
old_refresh_rate=-1;
Apr 26, 2001
Apr 26, 2001
364
Mar 8, 2006
Mar 8, 2006
365
if (NULL == (phevent = SDL_malloc(EVENT_SIZE)))
Mar 11, 2002
Mar 11, 2002
366
{
Jan 20, 2003
Jan 20, 2003
367
368
SDL_OutOfMemory();
return -1;
Mar 11, 2002
Mar 11, 2002
369
}
Mar 8, 2006
Mar 8, 2006
370
SDL_memset(phevent, 0x00, EVENT_SIZE);
Mar 11, 2002
Mar 11, 2002
371
Jan 20, 2003
Jan 20, 2003
372
373
374
window = ph_CreateWindow(this);
if (window == NULL)
{
Aug 4, 2003
Aug 4, 2003
375
SDL_SetError("ph_VideoInit(): Couldn't create video window !\n");
Jan 20, 2003
Jan 20, 2003
376
377
378
return -1;
}
Mar 11, 2002
Mar 11, 2002
379
380
381
382
383
384
385
/* Create the blank cursor */
SDL_BlankCursor = this->CreateWMCursor(this, blank_cdata, blank_cmask,
(int)BLANK_CWIDTH, (int)BLANK_CHEIGHT,
(int)BLANK_CHOTX, (int)BLANK_CHOTY);
if (SDL_BlankCursor == NULL)
{
Aug 4, 2003
Aug 4, 2003
386
return -1;
Mar 11, 2002
Mar 11, 2002
387
388
}
Feb 14, 2004
Feb 14, 2004
389
if (PgGetGraphicsHWCaps(&hwcaps) < 0)
Mar 11, 2002
Mar 11, 2002
390
{
Aug 4, 2003
Aug 4, 2003
391
392
393
SDL_SetError("ph_VideoInit(): GetGraphicsHWCaps function failed !\n");
this->FreeWMCursor(this, SDL_BlankCursor);
return -1;
Mar 11, 2002
Mar 11, 2002
394
395
}
Feb 14, 2004
Feb 14, 2004
396
if (PgGetVideoModeInfo(hwcaps.current_video_mode, &desktop_mode) < 0)
Mar 11, 2002
Mar 11, 2002
397
{
Aug 4, 2003
Aug 4, 2003
398
399
400
SDL_SetError("ph_VideoInit(): PgGetVideoModeInfo function failed !\n");
this->FreeWMCursor(this, SDL_BlankCursor);
return -1;
Mar 11, 2002
Mar 11, 2002
401
402
403
}
/* We need to return BytesPerPixel as it in used by CreateRGBsurface */
Aug 23, 2003
Aug 23, 2003
404
405
406
vformat->BitsPerPixel = desktop_mode.bits_per_pixel;
vformat->BytesPerPixel = desktop_mode.bytes_per_scanline/desktop_mode.width;
desktopbpp = desktop_mode.bits_per_pixel;
Mar 28, 2002
Mar 28, 2002
407
408
409
/* save current palette */
if (desktopbpp==8)
Mar 11, 2002
Mar 11, 2002
410
{
Jan 20, 2003
Jan 20, 2003
411
412
PgGetPalette(savedpal);
PgGetPalette(syspalph);
Mar 11, 2002
Mar 11, 2002
413
}
Aug 4, 2003
Aug 4, 2003
414
415
416
417
418
419
420
421
else
{
for(i=0; i<_Pg_MAX_PALETTE; i++)
{
savedpal[i]=PgRGB(0, 0, 0);
syspalph[i]=PgRGB(0, 0, 0);
}
}
Mar 28, 2002
Mar 28, 2002
422
May 10, 2001
May 10, 2001
423
currently_fullscreen = 0;
Aug 4, 2003
Aug 4, 2003
424
currently_hided = 0;
Dec 10, 2003
Dec 10, 2003
425
currently_maximized = 0;
Aug 4, 2003
Aug 4, 2003
426
427
428
429
430
431
432
433
434
current_overlay = NULL;
OCImage.direct_context = NULL;
OCImage.offscreen_context = NULL;
OCImage.offscreen_backcontext = NULL;
OCImage.oldDC = NULL;
OCImage.CurrentFrameData = NULL;
OCImage.FrameData0 = NULL;
OCImage.FrameData1 = NULL;
Feb 14, 2004
Feb 14, 2004
435
videomode_emulatemode = 0;
May 10, 2001
May 10, 2001
436
437
this->info.wm_available = 1;
May 6, 2004
May 6, 2004
438
439
ph_UpdateHWInfo(this);
May 10, 2001
May 10, 2001
440
Apr 26, 2001
Apr 26, 2001
441
442
443
return 0;
}
Feb 14, 2004
Feb 14, 2004
444
static SDL_Surface* ph_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags)
Apr 26, 2001
Apr 26, 2001
445
{
Aug 4, 2003
Aug 4, 2003
446
const struct ColourMasks* mask;
Apr 26, 2001
Apr 26, 2001
447
448
449
450
/* Lock the event thread, in multi-threading environments */
SDL_Lock_EventThread();
Mar 28, 2002
Mar 28, 2002
451
452
current->flags = flags;
Aug 4, 2003
Aug 4, 2003
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
/* if we do not have desired fullscreen mode, then fallback into window mode */
if (((current->flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) && (ph_GetVideoMode(width, height, bpp)==0))
{
current->flags &= ~SDL_FULLSCREEN;
current->flags &= ~SDL_NOFRAME;
current->flags &= ~SDL_RESIZABLE;
}
ph_SetupWindow(this, width, height, current->flags);
mask = ph_GetColourMasks(bpp);
if (mask != NULL)
{
SDL_ReallocFormat(current, mask->bpp, mask->red, mask->green, mask->blue, 0);
}
else
{
SDL_SetError("ph_SetVideoMode(): desired bpp is not supported by photon !\n");
return NULL;
}
Apr 26, 2001
Apr 26, 2001
473
Aug 30, 2003
Aug 30, 2003
474
if ((current->flags & SDL_OPENGL)==SDL_OPENGL)
Apr 26, 2001
Apr 26, 2001
475
{
Feb 16, 2006
Feb 16, 2006
476
#if !SDL_VIDEO_OPENGL
Feb 14, 2004
Feb 14, 2004
477
478
/* if no built-in OpenGL support */
SDL_SetError("ph_SetVideoMode(): no OpenGL support, you need to recompile SDL.\n");
Jan 20, 2003
Jan 20, 2003
479
current->flags &= ~SDL_OPENGL;
Mar 11, 2002
Mar 11, 2002
480
return NULL;
Feb 16, 2006
Feb 16, 2006
481
#endif /* SDL_VIDEO_OPENGL */
Apr 26, 2001
Apr 26, 2001
482
}
Mar 11, 2002
Mar 11, 2002
483
484
else
{
Aug 4, 2003
Aug 4, 2003
485
486
/* Initialize internal variables */
if ((current->flags & SDL_FULLSCREEN) == SDL_FULLSCREEN)
Mar 11, 2002
Mar 11, 2002
487
{
Mar 23, 2002
Mar 23, 2002
488
489
490
491
if (bpp==8)
{
desktoppal=SDLPH_PAL_SYSTEM;
}
Apr 26, 2001
Apr 26, 2001
492
Jan 20, 2003
Jan 20, 2003
493
current->flags &= ~SDL_RESIZABLE; /* no resize for Direct Context */
Aug 23, 2003
Aug 23, 2003
494
current->flags |= SDL_HWSURFACE;
Aug 4, 2003
Aug 4, 2003
495
}
Mar 11, 2002
Mar 11, 2002
496
497
else
{
Feb 14, 2004
Feb 14, 2004
498
/* remove this if we'll have support for the non-fullscreen sw/hw+doublebuf one day */
Aug 4, 2003
Aug 4, 2003
499
500
501
502
current->flags &= ~SDL_DOUBLEBUF;
/* Use offscreen memory if SDL_HWSURFACE flag is set */
if ((current->flags & SDL_HWSURFACE) == SDL_HWSURFACE)
Mar 11, 2002
Mar 11, 2002
503
{
Aug 4, 2003
Aug 4, 2003
504
505
506
507
if (desktopbpp!=bpp)
{
current->flags &= ~SDL_HWSURFACE;
}
Mar 11, 2002
Mar 11, 2002
508
}
Mar 28, 2002
Mar 28, 2002
509
Mar 23, 2002
Mar 23, 2002
510
511
512
513
514
/* using palette emulation code in window mode */
if (bpp==8)
{
if (desktopbpp>=15)
{
Aug 4, 2003
Aug 4, 2003
515
desktoppal = SDLPH_PAL_EMULATE;
Mar 23, 2002
Mar 23, 2002
516
517
518
}
else
{
Aug 4, 2003
Aug 4, 2003
519
desktoppal = SDLPH_PAL_SYSTEM;
Jan 20, 2003
Jan 20, 2003
520
521
522
}
}
else
Mar 11, 2002
Mar 11, 2002
523
{
Aug 4, 2003
Aug 4, 2003
524
desktoppal = SDLPH_PAL_NONE;
Mar 11, 2002
Mar 11, 2002
525
}
Jan 18, 2002
Jan 18, 2002
526
}
Mar 11, 2002
Mar 11, 2002
527
528
529
530
}
current->w = width;
current->h = height;
Jan 20, 2003
Jan 20, 2003
531
Aug 4, 2003
Aug 4, 2003
532
533
534
535
if (desktoppal==SDLPH_PAL_SYSTEM)
{
current->flags|=SDL_HWPALETTE;
}
May 19, 2002
May 19, 2002
536
Aug 4, 2003
Aug 4, 2003
537
538
/* Must call at least once for setup image planes */
if (ph_SetupUpdateFunction(this, current, current->flags)==-1)
May 19, 2002
May 19, 2002
539
{
May 6, 2004
May 6, 2004
540
/* Error string was filled in the ph_SetupUpdateFunction() */
May 19, 2002
May 19, 2002
541
542
return NULL;
}
Mar 11, 2002
Mar 11, 2002
543
Aug 4, 2003
Aug 4, 2003
544
545
546
547
548
/* finish window drawing, if we are not in fullscreen, of course */
if ((current->flags & SDL_FULLSCREEN) != SDL_FULLSCREEN)
{
PtFlush();
}
Aug 23, 2003
Aug 23, 2003
549
550
551
552
else
{
PgFlush();
}
Mar 28, 2002
Mar 28, 2002
553
Feb 14, 2004
Feb 14, 2004
554
555
visualbpp=bpp;
May 6, 2004
May 6, 2004
556
ph_UpdateHWInfo(this);
Feb 14, 2004
Feb 14, 2004
557
Apr 26, 2001
Apr 26, 2001
558
559
SDL_Unlock_EventThread();
Feb 14, 2004
Feb 14, 2004
560
/* We've done! */
Mar 23, 2002
Mar 23, 2002
561
return (current);
Apr 26, 2001
Apr 26, 2001
562
563
564
565
}
static void ph_VideoQuit(_THIS)
{
Aug 4, 2003
Aug 4, 2003
566
567
/* restore palette */
if (desktopbpp==8)
Feb 14, 2002
Feb 14, 2002
568
{
Aug 4, 2003
Aug 4, 2003
569
570
571
PgSetPalette(syspalph, 0, -1, 0, 0, 0);
PgSetPalette(savedpal, 0, 0, _Pg_MAX_PALETTE, Pg_PALSET_GLOBAL | Pg_PALSET_FORCE_EXPOSE, 0);
PgFlush();
Feb 14, 2002
Feb 14, 2002
572
}
Apr 26, 2001
Apr 26, 2001
573
Aug 4, 2003
Aug 4, 2003
574
575
ph_DestroyImage(this, SDL_VideoSurface);
Mar 11, 2002
Mar 11, 2002
576
577
578
579
580
581
582
if (window)
{
PtUnrealizeWidget(window);
PtDestroyWidget(window);
window=NULL;
}
Mar 8, 2006
Mar 8, 2006
583
if (phevent!=NULL)
Jan 20, 2003
Jan 20, 2003
584
{
Mar 8, 2006
Mar 8, 2006
585
586
SDL_free(phevent);
phevent=NULL;
Jan 20, 2003
Jan 20, 2003
587
}
Mar 11, 2002
Mar 11, 2002
588
}
Apr 26, 2001
Apr 26, 2001
589
590
591
static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
{
Mar 23, 2002
Mar 23, 2002
592
int i;
Jan 20, 2003
Jan 20, 2003
593
594
595
596
597
SDL_Rect updaterect;
updaterect.x = updaterect.y = 0;
updaterect.w = this->screen->w;
updaterect.h = this->screen->h;
Apr 26, 2001
Apr 26, 2001
598
Mar 23, 2002
Mar 23, 2002
599
600
601
602
603
604
605
/* palette emulation code, using palette of the PhImage_t struct */
if (desktoppal==SDLPH_PAL_EMULATE)
{
if ((SDL_Image) && (SDL_Image->palette))
{
for (i=firstcolor; i<firstcolor+ncolors; i++)
{
Jan 20, 2003
Jan 20, 2003
606
607
syspalph[i] = PgRGB(colors[i-firstcolor].r, colors[i-firstcolor].g, colors[i-firstcolor].b);
SDL_Image->palette[i] = syspalph[i];
Mar 23, 2002
Mar 23, 2002
608
}
Aug 4, 2003
Aug 4, 2003
609
Jan 20, 2003
Jan 20, 2003
610
611
/* image needs to be redrawn */
this->UpdateRects(this, 1, &updaterect);
Mar 23, 2002
Mar 23, 2002
612
}
Apr 26, 2001
Apr 26, 2001
613
}
Mar 23, 2002
Mar 23, 2002
614
615
616
else
{
if (desktoppal==SDLPH_PAL_SYSTEM)
Apr 26, 2001
Apr 26, 2001
617
{
Mar 23, 2002
Mar 23, 2002
618
619
for (i=firstcolor; i<firstcolor+ncolors; i++)
{
Jan 20, 2003
Jan 20, 2003
620
syspalph[i] = PgRGB(colors[i-firstcolor].r, colors[i-firstcolor].g, colors[i-firstcolor].b);
Mar 23, 2002
Mar 23, 2002
621
622
623
624
}
if ((this->screen->flags & SDL_FULLSCREEN) != SDL_FULLSCREEN)
{
Jan 20, 2003
Jan 20, 2003
625
/* window mode must use soft palette */
Aug 4, 2003
Aug 4, 2003
626
PgSetPalette(&syspalph[firstcolor], 0, firstcolor, ncolors, Pg_PALSET_GLOBAL, 0);
Jan 20, 2003
Jan 20, 2003
627
628
/* image needs to be redrawn */
this->UpdateRects(this, 1, &updaterect);
Mar 23, 2002
Mar 23, 2002
629
630
631
632
}
else
{
/* fullscreen mode must use hardware palette */
Aug 4, 2003
Aug 4, 2003
633
PgSetPalette(&syspalph[firstcolor], 0, firstcolor, ncolors, Pg_PALSET_GLOBAL, 0);
Mar 23, 2002
Mar 23, 2002
634
}
Apr 26, 2001
Apr 26, 2001
635
}
Mar 23, 2002
Mar 23, 2002
636
else
Apr 26, 2001
Apr 26, 2001
637
{
Mar 23, 2002
Mar 23, 2002
638
/* SDLPH_PAL_NONE do nothing */
Apr 26, 2001
Apr 26, 2001
639
}
Mar 23, 2002
Mar 23, 2002
640
641
642
}
return 1;
Apr 26, 2001
Apr 26, 2001
643
}