Skip to content

Latest commit

 

History

History
723 lines (630 loc) · 21 KB

SDL_ph_video.c

File metadata and controls

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