Skip to content

Latest commit

 

History

History
705 lines (604 loc) · 20 KB

SDL_ph_video.c

File metadata and controls

705 lines (604 loc) · 20 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
/*
SDL - Simple DirectMedia Layer
Mar 6, 2002
Mar 6, 2002
3
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 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
53
54
55
56
57
58
#include "SDL_phyuv_c.h"
#include "blank_cursor.h"
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);
static void ph_VideoQuit(_THIS);
static void ph_DeleteDevice(SDL_VideoDevice *device);
Jan 20, 2003
Jan 20, 2003
59
static void ph_UpdateMouse(_THIS);
Mar 2, 2002
Mar 2, 2002
60
61
#ifdef HAVE_OPENGL
Mar 11, 2002
Mar 11, 2002
62
int ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags);
Jan 18, 2002
Jan 18, 2002
63
static void ph_GL_SwapBuffers(_THIS);
Mar 2, 2002
Mar 2, 2002
64
65
static int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value);
#endif /* HAVE_OPENGL */
Jan 18, 2002
Jan 18, 2002
66
Apr 26, 2001
Apr 26, 2001
67
68
static int ph_Available(void)
{
Mar 11, 2002
Mar 11, 2002
69
70
71
72
73
74
75
76
77
78
79
int phstat=-1;
phstat=PtInit(0);
if (phstat==0)
{
return 1;
}
else
{
return 0;
}
Apr 26, 2001
Apr 26, 2001
80
81
82
83
84
85
86
87
}
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
88
if (device) {
Apr 26, 2001
Apr 26, 2001
89
90
91
92
93
memset(device, 0, (sizeof *device));
device->hidden = (struct SDL_PrivateVideoData *)
malloc((sizeof *device->hidden));
device->gl_data = NULL;
}
Jan 20, 2003
Jan 20, 2003
94
if ((device == NULL) || (device->hidden == NULL)) {
Apr 26, 2001
Apr 26, 2001
95
96
97
98
99
100
101
SDL_OutOfMemory();
ph_DeleteDevice(device);
return(0);
}
memset(device->hidden, 0, (sizeof *device->hidden));
/* Set the driver flags */
Feb 14, 2002
Feb 14, 2002
102
device->handles_any_size = 1; /* JB not true for fullscreen */
Apr 26, 2001
Apr 26, 2001
103
104
/* Set the function pointers */
Jan 18, 2002
Jan 18, 2002
105
device->CreateYUVOverlay = ph_CreateYUVOverlay;
Apr 26, 2001
Apr 26, 2001
106
107
108
device->VideoInit = ph_VideoInit;
device->ListModes = ph_ListModes;
device->SetVideoMode = ph_SetVideoMode;
Mar 11, 2002
Mar 11, 2002
109
device->ToggleFullScreen = ph_ToggleFullScreen;
Jan 20, 2003
Jan 20, 2003
110
device->UpdateMouse = ph_UpdateMouse;
Apr 26, 2001
Apr 26, 2001
111
device->SetColors = ph_SetColors;
Jan 20, 2003
Jan 20, 2003
112
device->UpdateRects = NULL; /* ph_SetupUpdateFunction */
Apr 26, 2001
Apr 26, 2001
113
114
115
116
117
118
119
120
121
122
device->VideoQuit = ph_VideoQuit;
device->AllocHWSurface = ph_AllocHWSurface;
device->CheckHWBlit = NULL;
device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->LockHWSurface = ph_LockHWSurface;
device->UnlockHWSurface = ph_UnlockHWSurface;
device->FlipHWSurface = ph_FlipHWSurface;
device->FreeHWSurface = ph_FreeHWSurface;
May 10, 2001
May 10, 2001
123
device->SetCaption = ph_SetCaption;
Apr 26, 2001
Apr 26, 2001
124
device->SetIcon = NULL;
May 10, 2001
May 10, 2001
125
device->IconifyWindow = ph_IconifyWindow;
Feb 20, 2002
Feb 20, 2002
126
device->GrabInput = ph_GrabInput;
Mar 2, 2002
Mar 2, 2002
127
device->GetWMInfo = ph_GetWMInfo;
Apr 26, 2001
Apr 26, 2001
128
129
130
131
132
133
134
135
device->FreeWMCursor = ph_FreeWMCursor;
device->CreateWMCursor = ph_CreateWMCursor;
device->ShowWMCursor = ph_ShowWMCursor;
device->WarpWMCursor = ph_WarpWMCursor;
device->CheckMouseMode = ph_CheckMouseMode;
device->InitOSKeymap = ph_InitOSKeymap;
device->PumpEvents = ph_PumpEvents;
Feb 14, 2002
Feb 14, 2002
136
/* OpenGL support. */
Jan 18, 2002
Jan 18, 2002
137
138
139
device->GL_LoadLibrary = NULL;
device->GL_GetProcAddress = NULL;
device->GL_MakeCurrent = NULL;
Feb 14, 2002
Feb 14, 2002
140
#ifdef HAVE_OPENGL
Jan 18, 2002
Jan 18, 2002
141
device->GL_SwapBuffers = ph_GL_SwapBuffers;
Mar 2, 2002
Mar 2, 2002
142
device->GL_GetAttribute = ph_GL_GetAttribute;
Feb 14, 2002
Feb 14, 2002
143
144
#else
device->GL_SwapBuffers = NULL;
Mar 2, 2002
Mar 2, 2002
145
device->GL_GetAttribute = NULL;
Feb 14, 2002
Feb 14, 2002
146
#endif /* HAVE_OPENGL */
Jan 18, 2002
Jan 18, 2002
147
Apr 26, 2001
Apr 26, 2001
148
149
150
151
152
device->free = ph_DeleteDevice;
return device;
}
May 10, 2001
May 10, 2001
153
VideoBootStrap ph_bootstrap = {
Mar 23, 2002
Mar 23, 2002
154
155
"photon", "QNX Photon video output",
ph_Available, ph_CreateDevice
Apr 26, 2001
Apr 26, 2001
156
157
158
159
};
static void ph_DeleteDevice(SDL_VideoDevice *device)
{
Mar 11, 2002
Mar 11, 2002
160
161
162
163
if (device)
{
if (device->hidden)
{
Apr 26, 2001
Apr 26, 2001
164
165
166
free(device->hidden);
device->hidden = NULL;
}
Mar 11, 2002
Mar 11, 2002
167
168
if (device->gl_data)
{
Apr 26, 2001
Apr 26, 2001
169
170
171
172
173
174
175
176
free(device->gl_data);
device->gl_data = NULL;
}
free(device);
device = NULL;
}
}
Jan 20, 2003
Jan 20, 2003
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
static PtWidget_t *ph_CreateWindow(_THIS)
{
PtWidget_t *widget;
widget = PtCreateWidget(PtWindow, NULL, 0, 0);
if (widget == NULL)
{
SDL_SetError("Couldn't create video window");
}
return widget;
}
static int ph_SetupWindow(_THIS, int w, int h, int flags)
{
PtArg_t args[32];
PhPoint_t pos = {0, 0};
PhDim_t dim = {w, h};
int nargs = 0;
PtSetArg(&args[nargs++], Pt_ARG_DIM, &dim, 0);
PtSetArg(&args[nargs++], Pt_ARG_FILL_COLOR, Pg_BLACK, 0);
if ((flags & SDL_RESIZABLE) == SDL_RESIZABLE)
{
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE, Ph_WM_RESIZE | Ph_WM_MAX);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE, Ph_WM_RESIZE | Ph_WM_MAX);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_TRUE, Ph_WM_RENDER_RESIZE | Ph_WM_RENDER_MAX);
}
else
{
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE, Ph_WM_RESIZE | Ph_WM_MAX);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_FALSE, Ph_WM_RESIZE | Ph_WM_MAX);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE, Ph_WM_RENDER_RESIZE | Ph_WM_RENDER_MAX | Ph_WM_RENDER_COLLAPSE);
}
if (((flags & SDL_NOFRAME)==SDL_NOFRAME) || ((flags & SDL_FULLSCREEN)==SDL_FULLSCREEN))
{
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE, Pt_TRUE);
}
else
{
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_TRUE, Ph_WM_RENDER_BORDER | Ph_WM_RENDER_TITLE |
Ph_WM_RENDER_CLOSE | Ph_WM_RENDER_MENU | Ph_WM_RENDER_MIN);
}
if (flags & SDL_FULLSCREEN)
{
PtSetArg(&args[nargs++], Pt_ARG_POS, &pos, 0);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE, Ph_WM_FFRONT | Ph_WM_MAX);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_TRUE, Ph_WM_STATE_ISFRONT | Ph_WM_STATE_ISMAX |
Ph_WM_STATE_ISFOCUS | Ph_WM_STATE_ISALTKEY);
}
else
{
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_FALSE, Ph_WM_STATE_ISFRONT | Ph_WM_STATE_ISMAX | Ph_WM_STATE_ISALTKEY);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE, Ph_WM_HIDE);
PtSetArg(&args[nargs++], Pt_ARG_RESIZE_FLAGS, Pt_FALSE, Pt_RESIZE_XY_AS_REQUIRED);
}
PtSetResources(window, nargs, args);
PtRealizeWidget(window);
return 0;
}
Apr 26, 2001
Apr 26, 2001
243
244
static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat)
{
Mar 11, 2002
Mar 11, 2002
245
246
PgVideoModeInfo_t my_mode_info;
PgHWCaps_t my_hwcaps;
Apr 26, 2001
Apr 26, 2001
247
Mar 11, 2002
Mar 11, 2002
248
window=NULL;
Mar 23, 2002
Mar 23, 2002
249
desktoppal=SDLPH_PAL_NONE;
Mar 28, 2002
Mar 28, 2002
250
251
252
#ifdef HAVE_OPENGL
oglctx=NULL;
#endif /* HAVE_OPENGL */
Mar 23, 2002
Mar 23, 2002
253
254
255
old_video_mode=-1;
old_refresh_rate=-1;
Apr 26, 2001
Apr 26, 2001
256
Mar 11, 2002
Mar 11, 2002
257
258
if (NULL == (event = malloc(EVENT_SIZE)))
{
Jan 20, 2003
Jan 20, 2003
259
260
SDL_OutOfMemory();
return -1;
Mar 11, 2002
Mar 11, 2002
261
}
May 28, 2002
May 28, 2002
262
memset(event, 0x00, EVENT_SIZE);
Mar 11, 2002
Mar 11, 2002
263
Jan 20, 2003
Jan 20, 2003
264
265
266
267
268
269
window = ph_CreateWindow(this);
if (window == NULL)
{
return -1;
}
Mar 11, 2002
Mar 11, 2002
270
271
272
273
274
275
276
/* 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)
{
Jan 20, 2003
Jan 20, 2003
277
fprintf(stderr, "ph_VideoInit(): could not create blank cursor !\n");
Mar 11, 2002
Mar 11, 2002
278
279
280
281
}
if (PgGetGraphicsHWCaps(&my_hwcaps) < 0)
{
May 28, 2002
May 28, 2002
282
fprintf(stderr,"ph_VideoInit(): GetGraphicsHWCaps failed !\n");
Mar 11, 2002
Mar 11, 2002
283
284
285
286
}
if (PgGetVideoModeInfo(my_hwcaps.current_video_mode, &my_mode_info) < 0)
{
May 28, 2002
May 28, 2002
287
fprintf(stderr,"ph_VideoInit(): PgGetVideoModeInfo failed !\n");
Mar 11, 2002
Mar 11, 2002
288
289
290
291
292
}
/* We need to return BytesPerPixel as it in used by CreateRGBsurface */
vformat->BitsPerPixel = my_mode_info.bits_per_pixel;
vformat->BytesPerPixel = my_mode_info.bytes_per_scanline/my_mode_info.width;
Mar 23, 2002
Mar 23, 2002
293
desktopbpp = my_mode_info.bits_per_pixel;
Mar 28, 2002
Mar 28, 2002
294
295
296
/* save current palette */
if (desktopbpp==8)
Mar 11, 2002
Mar 11, 2002
297
{
Jan 20, 2003
Jan 20, 2003
298
299
PgGetPalette(savedpal);
PgGetPalette(syspalph);
Mar 11, 2002
Mar 11, 2002
300
}
Mar 28, 2002
Mar 28, 2002
301
May 10, 2001
May 10, 2001
302
303
304
305
currently_fullscreen = 0;
this->info.wm_available = 1;
Apr 26, 2001
Apr 26, 2001
306
307
308
309
310
311
312
return 0;
}
static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
int width, int height, int bpp, Uint32 flags)
{
PgDisplaySettings_t settings;
Jan 20, 2003
Jan 20, 2003
313
SDL_Color* colors;
Mar 11, 2002
Mar 11, 2002
314
int mode;
Jan 18, 2002
Jan 18, 2002
315
316
int rtnval;
int i;
Apr 26, 2001
Apr 26, 2001
317
318
319
320
/* Lock the event thread, in multi-threading environments */
SDL_Lock_EventThread();
Mar 28, 2002
Mar 28, 2002
321
322
current->flags = flags;
Jan 20, 2003
Jan 20, 2003
323
ph_SetupWindow(this, width, height, flags);
Apr 26, 2001
Apr 26, 2001
324
Mar 11, 2002
Mar 11, 2002
325
#ifdef HAVE_OPENGL
Jan 20, 2003
Jan 20, 2003
326
if (current->flags & SDL_OPENGL)
Apr 26, 2001
Apr 26, 2001
327
{
Mar 11, 2002
Mar 11, 2002
328
329
330
/* ph_SetupOpenGLContext creates also window as need */
if (ph_SetupOpenGLContext(this, width, height, bpp, flags)==0)
{
Jan 20, 2003
Jan 20, 2003
331
ph_SetupUpdateFunction(this, current, flags);
Mar 11, 2002
Mar 11, 2002
332
333
334
335
}
else
{
/* if context creation fail, report no OpenGL to high level */
Jan 20, 2003
Jan 20, 2003
336
current->flags &= ~SDL_OPENGL;
Mar 11, 2002
Mar 11, 2002
337
}
Mar 2, 2002
Mar 2, 2002
338
#else
Jan 20, 2003
Jan 20, 2003
339
if (current->flags & SDL_OPENGL) /* if no built-in OpenGL support */
Mar 11, 2002
Mar 11, 2002
340
{
May 19, 2002
May 19, 2002
341
fprintf(stderr, "ph_SetVideoMode(): no OpenGL support, try to recompile library.\n");
Jan 20, 2003
Jan 20, 2003
342
current->flags &= ~SDL_OPENGL;
Mar 11, 2002
Mar 11, 2002
343
return NULL;
Feb 14, 2002
Feb 14, 2002
344
#endif /* HAVE_OPENGL */
Apr 26, 2001
Apr 26, 2001
345
}
Mar 11, 2002
Mar 11, 2002
346
347
348
else
{
/* Initialize the window */
Jan 20, 2003
Jan 20, 2003
349
if (current->flags & SDL_FULLSCREEN) /* Direct Context , assume SDL_HWSURFACE also set */
Mar 11, 2002
Mar 11, 2002
350
351
{
/* Get the video mode and set it */
Jan 20, 2003
Jan 20, 2003
352
if (current->flags & SDL_ANYFORMAT)
Mar 11, 2002
Mar 11, 2002
353
354
355
{
if ((mode = get_mode_any_format(width, height, bpp)) == 0)
{
May 19, 2002
May 19, 2002
356
fprintf(stderr,"ph_SetVideoMode(): get_mode_any_format failed !\n");
Mar 11, 2002
Mar 11, 2002
357
358
359
360
361
362
363
exit(1);
}
}
else
{
if ((mode = get_mode(width, height, bpp)) == 0)
{
May 19, 2002
May 19, 2002
364
fprintf(stderr,"ph_SetVideoMode(): get_mode failed !\n");
Mar 11, 2002
Mar 11, 2002
365
366
367
exit(1);
}
}
Mar 23, 2002
Mar 23, 2002
368
369
370
371
372
373
374
375
376
377
378
379
if (bpp==8)
{
desktoppal=SDLPH_PAL_SYSTEM;
}
/* save old video mode caps */
PgGetVideoMode(&settings);
old_video_mode=settings.mode;
old_refresh_rate=settings.refresh;
/* setup new video mode */
Mar 11, 2002
Mar 11, 2002
380
381
settings.mode = mode;
settings.refresh = 0;
Mar 23, 2002
Mar 23, 2002
382
settings.flags = 0;
Apr 26, 2001
Apr 26, 2001
383
Mar 23, 2002
Mar 23, 2002
384
if (PgSetVideoMode(&settings) < 0)
Mar 11, 2002
Mar 11, 2002
385
{
May 19, 2002
May 19, 2002
386
fprintf(stderr,"ph_SetVideoMode(): PgSetVideoMode failed !\n");
Mar 11, 2002
Mar 11, 2002
387
}
Apr 26, 2001
Apr 26, 2001
388
Jan 20, 2003
Jan 20, 2003
389
390
current->flags &= ~SDL_RESIZABLE; /* no resize for Direct Context */
current->flags |= SDL_HWSURFACE;
Apr 26, 2001
Apr 26, 2001
391
Mar 11, 2002
Mar 11, 2002
392
393
/* Begin direct mode */
ph_EnterFullScreen(this);
Apr 26, 2001
Apr 26, 2001
394
Mar 11, 2002
Mar 11, 2002
395
396
397
} /* end fullscreen flag */
else
{
Mar 28, 2002
Mar 28, 2002
398
/* Use offscreen memory iff SDL_HWSURFACE flag is set */
Jan 20, 2003
Jan 20, 2003
399
if (current->flags & SDL_HWSURFACE)
Mar 11, 2002
Mar 11, 2002
400
{
Mar 28, 2002
Mar 28, 2002
401
/* no stretch blit in offscreen context */
Jan 20, 2003
Jan 20, 2003
402
current->flags &= ~SDL_RESIZABLE;
Mar 11, 2002
Mar 11, 2002
403
}
Mar 28, 2002
Mar 28, 2002
404
Mar 23, 2002
Mar 23, 2002
405
406
407
408
409
410
411
412
413
414
415
/* using palette emulation code in window mode */
if (bpp==8)
{
if (desktopbpp>=15)
{
desktoppal=SDLPH_PAL_EMULATE;
}
else
{
desktoppal=SDLPH_PAL_SYSTEM;
}
Feb 14, 2002
Feb 14, 2002
416
Jan 20, 2003
Jan 20, 2003
417
418
419
420
421
422
423
/* fill the palette */
PgGetPalette(savedpal);
PgGetPalette(syspalph);
current->format->palette = calloc(1, sizeof(SDL_Palette));
current->format->palette->ncolors = _Pg_MAX_PALETTE;
current->format->palette->colors = (SDL_Color *)calloc(_Pg_MAX_PALETTE, sizeof(SDL_Color));
Mar 11, 2002
Mar 11, 2002
424
Jan 20, 2003
Jan 20, 2003
425
colors = current->format->palette->colors;
Mar 11, 2002
Mar 11, 2002
426
Jan 20, 2003
Jan 20, 2003
427
428
429
430
431
432
433
434
for(i=0; i<256; i++)
{
colors[i].r = PgRedValue(syspalph[i]);
colors[i].g = PgGreenValue(syspalph[i]);
colors[i].b = PgBlueValue(syspalph[i]);
}
}
else
Mar 11, 2002
Mar 11, 2002
435
{
Jan 20, 2003
Jan 20, 2003
436
desktoppal=SDLPH_PAL_NONE;
Mar 11, 2002
Mar 11, 2002
437
}
Jan 18, 2002
Jan 18, 2002
438
}
Mar 11, 2002
Mar 11, 2002
439
440
441
442
}
current->w = width;
current->h = height;
Jan 20, 2003
Jan 20, 2003
443
444
/* These values can be overridden in ph_SetupUpdateFunction() */
Mar 11, 2002
Mar 11, 2002
445
446
447
current->format->BitsPerPixel = bpp;
current->format->BytesPerPixel = (bpp+7)/8;
current->pitch = SDL_CalculatePitch(current);
May 19, 2002
May 19, 2002
448
Mar 11, 2002
Mar 11, 2002
449
/* Must call at least once it setup image planes */
Jan 20, 2003
Jan 20, 2003
450
rtnval = ph_SetupUpdateFunction(this, current, current->flags);
May 19, 2002
May 19, 2002
451
452
453
if (rtnval==-1)
{
Jan 20, 2003
Jan 20, 2003
454
fprintf(stderr,"ph_SetVideoMode(): ph_SetupUpdateFunction failed !\n");
May 19, 2002
May 19, 2002
455
456
return NULL;
}
Mar 11, 2002
Mar 11, 2002
457
Mar 28, 2002
Mar 28, 2002
458
459
460
/* finish window drawing */
PtFlush();
Apr 26, 2001
Apr 26, 2001
461
462
463
SDL_Unlock_EventThread();
/* We're done! */
Mar 23, 2002
Mar 23, 2002
464
return (current);
Apr 26, 2001
Apr 26, 2001
465
466
467
468
}
static void ph_VideoQuit(_THIS)
{
Mar 28, 2002
Mar 28, 2002
469
#ifdef HAVE_OPENGL
Mar 11, 2002
Mar 11, 2002
470
PhRegion_t region_info;
Mar 28, 2002
Mar 28, 2002
471
#endif /* HAVE_OPENGL */
Mar 11, 2002
Mar 11, 2002
472
Feb 20, 2002
Feb 20, 2002
473
ph_DestroyImage(this, SDL_VideoSurface);
Apr 26, 2001
Apr 26, 2001
474
Feb 14, 2002
Feb 14, 2002
475
476
if (currently_fullscreen)
{
Mar 23, 2002
Mar 23, 2002
477
ph_LeaveFullScreen(this);
Feb 14, 2002
Feb 14, 2002
478
}
Apr 26, 2001
Apr 26, 2001
479
Mar 11, 2002
Mar 11, 2002
480
#ifdef HAVE_OPENGL
Mar 28, 2002
Mar 28, 2002
481
/* prevent double SEGFAULT during parachute mode */
Mar 23, 2002
Mar 23, 2002
482
if (this->screen)
Mar 11, 2002
Mar 11, 2002
483
{
Mar 23, 2002
Mar 23, 2002
484
485
486
487
488
489
490
if (((this->screen->flags & SDL_FULLSCREEN)==SDL_FULLSCREEN) &&
((this->screen->flags & SDL_OPENGL)==SDL_OPENGL))
{
region_info.cursor_type=Ph_CURSOR_POINTER;
region_info.rid=PtWidgetRid(window);
PhRegionChange(Ph_REGION_CURSOR, 0, &region_info, NULL, NULL);
}
Mar 11, 2002
Mar 11, 2002
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
}
PtFlush();
#endif /* HAVE_OPENGL */
if (window)
{
PtUnrealizeWidget(window);
PtDestroyWidget(window);
window=NULL;
}
#ifdef HAVE_OPENGL
if (oglctx)
{
PhDCSetCurrent(NULL);
PhDCRelease(oglctx);
oglctx=NULL;
}
#endif /* HAVE_OPENGL */
Jan 20, 2003
Jan 20, 2003
511
512
513
514
515
516
517
518
519
520
521
522
523
524
/* restore palette */
if (desktoppal!=SDLPH_PAL_NONE)
{
PgSetPalette(savedpal, 1, 0, _Pg_MAX_PALETTE, Pg_PALSET_HARD | Pg_PALSET_FORCE_EXPOSE, 0);
/* pass -1, to force release palette */
PgSetPalette(savedpal, 1, 0, -1, Pg_PALSET_HARD | Pg_PALSET_FORCE_EXPOSE, 0);
}
if (event!=NULL)
{
free(event);
event=NULL;
}
Mar 11, 2002
Mar 11, 2002
525
}
Apr 26, 2001
Apr 26, 2001
526
527
528
static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
{
Mar 23, 2002
Mar 23, 2002
529
int i;
Jan 20, 2003
Jan 20, 2003
530
531
532
533
534
SDL_Rect updaterect;
updaterect.x = updaterect.y = 0;
updaterect.w = this->screen->w;
updaterect.h = this->screen->h;
Apr 26, 2001
Apr 26, 2001
535
Mar 23, 2002
Mar 23, 2002
536
537
538
539
540
541
542
/* 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
543
544
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
545
}
Jan 20, 2003
Jan 20, 2003
546
547
/* image needs to be redrawn */
this->UpdateRects(this, 1, &updaterect);
Mar 23, 2002
Mar 23, 2002
548
}
Apr 26, 2001
Apr 26, 2001
549
}
Mar 23, 2002
Mar 23, 2002
550
551
552
else
{
if (desktoppal==SDLPH_PAL_SYSTEM)
Apr 26, 2001
Apr 26, 2001
553
{
Mar 23, 2002
Mar 23, 2002
554
555
for (i=firstcolor; i<firstcolor+ncolors; i++)
{
Jan 20, 2003
Jan 20, 2003
556
syspalph[i] = PgRGB(colors[i-firstcolor].r, colors[i-firstcolor].g, colors[i-firstcolor].b);
Mar 23, 2002
Mar 23, 2002
557
558
559
560
}
if ((this->screen->flags & SDL_FULLSCREEN) != SDL_FULLSCREEN)
{
Jan 20, 2003
Jan 20, 2003
561
562
563
564
/* window mode must use soft palette */
PgSetPalette(&syspalph[firstcolor], 1, firstcolor, ncolors, Pg_PALSET_SOFT, 0);
/* image needs to be redrawn */
this->UpdateRects(this, 1, &updaterect);
Mar 23, 2002
Mar 23, 2002
565
566
567
568
}
else
{
/* fullscreen mode must use hardware palette */
Jan 20, 2003
Jan 20, 2003
569
PgSetPalette(&syspalph[firstcolor], 1, firstcolor, ncolors, Pg_PALSET_HARDLOCKED, 0);
Mar 23, 2002
Mar 23, 2002
570
}
Apr 26, 2001
Apr 26, 2001
571
}
Mar 23, 2002
Mar 23, 2002
572
else
Apr 26, 2001
Apr 26, 2001
573
{
Mar 23, 2002
Mar 23, 2002
574
/* SDLPH_PAL_NONE do nothing */
Apr 26, 2001
Apr 26, 2001
575
}
Mar 23, 2002
Mar 23, 2002
576
577
578
}
return 1;
Apr 26, 2001
Apr 26, 2001
579
580
}
Feb 14, 2002
Feb 14, 2002
581
#ifdef HAVE_OPENGL
Mar 11, 2002
Mar 11, 2002
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
int ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags)
{
PhDim_t dim;
uint64_t OGLAttrib[PH_OGL_MAX_ATTRIBS];
int OGLargc;
dim.w=width;
dim.h=height;
if (oglctx!=NULL)
{
PhDCSetCurrent(NULL);
PhDCRelease(oglctx);
oglctx=NULL;
}
OGLargc=0;
if (this->gl_config.depth_size)
{
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_DEPTH_BITS;
OGLAttrib[OGLargc++]=this->gl_config.depth_size;
}
if (this->gl_config.stencil_size)
{
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_STENCIL_BITS;
OGLAttrib[OGLargc++]=this->gl_config.stencil_size;
}
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FORCE_SW;
if (flags & SDL_FULLSCREEN)
{
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN;
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_DIRECT;
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN_BEST;
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN_CENTER;
}
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_NONE;
if (this->gl_config.double_buffer)
{
oglctx=PdCreateOpenGLContext(2, &dim, 0, OGLAttrib);
}
else
{
oglctx=PdCreateOpenGLContext(1, &dim, 0, OGLAttrib);
}
Mar 28, 2002
Mar 28, 2002
628
Mar 11, 2002
Mar 11, 2002
629
630
if (oglctx==NULL)
{
May 19, 2002
May 19, 2002
631
fprintf(stderr,"ph_SetupOpenGLContext(): cannot create OpenGL context.\n");
Mar 11, 2002
Mar 11, 2002
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
return (-1);
}
PhDCSetCurrent(oglctx);
/* disable mouse for fullscreen */
if (flags & SDL_FULLSCREEN)
{
PhRegion_t region_info;
region_info.cursor_type=Ph_CURSOR_NONE;
region_info.rid=PtWidgetRid(window);
PhRegionChange(Ph_REGION_CURSOR, 0, &region_info, NULL, NULL);
}
PtFlush();
return 0;
}
Jan 18, 2002
Jan 18, 2002
652
653
void ph_GL_SwapBuffers(_THIS)
{
Mar 2, 2002
Mar 2, 2002
654
PgSetRegion(PtWidgetRid(window));
Mar 11, 2002
Mar 11, 2002
655
PdOpenGLContextSwapBuffers(oglctx);
Jan 18, 2002
Jan 18, 2002
656
657
}
Mar 2, 2002
Mar 2, 2002
658
int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value)
Apr 26, 2001
Apr 26, 2001
659
{
Mar 2, 2002
Mar 2, 2002
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
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
676
}
Mar 2, 2002
Mar 2, 2002
677
678
#endif /* HAVE_OPENGL */
Jan 20, 2003
Jan 20, 2003
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
static void ph_UpdateMouse(_THIS)
{
PhCursorInfo_t phcursor;
short abs_x;
short abs_y;
/* Lock the event thread, in multi-threading environments */
SDL_Lock_EventThread();
/* synchronizing photon mouse cursor position and SDL mouse position, if cursor appears over window. */
PtGetAbsPosition(window, &abs_x, &abs_y);
PhQueryCursor(PhInputGroup(NULL), &phcursor);
if (((phcursor.pos.x >= abs_x) && (phcursor.pos.x <= abs_x + this->screen->w)) &&
((phcursor.pos.y >= abs_y) && (phcursor.pos.y <= abs_y + this->screen->h)))
{
SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
SDL_PrivateMouseMotion(0, 0, phcursor.pos.x-abs_x, phcursor.pos.y-abs_y);
}
else
{
SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
}
/* Unlock the event thread, in multi-threading environments */
SDL_Unlock_EventThread();
}