Skip to content

Latest commit

 

History

History
649 lines (565 loc) · 19.5 KB

SDL_ph_video.c

File metadata and controls

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