Skip to content

Latest commit

 

History

History
654 lines (570 loc) · 19.6 KB

SDL_ph_video.c

File metadata and controls

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