146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    SDL - Simple DirectMedia Layer
346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Copyright (C) 1997-2006 Sam Lantinga
446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is free software; you can redistribute it and/or
646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    modify it under the terms of the GNU Lesser General Public
746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License as published by the Free Software Foundation; either
846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    version 2.1 of the License, or (at your option) any later version.
946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is distributed in the hope that it will be useful,
1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    but WITHOUT ANY WARRANTY; without even the implied warranty of
1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Lesser General Public License for more details.
1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    You should have received a copy of the GNU Lesser General Public
1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License along with this library; if not, write to the Free Software
1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Sam Lantinga
2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    slouken@libsdl.org
2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h"
2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* BWindow based framebuffer implementation */
2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <unistd.h>
2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_BWin.h"
2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_timer.h"
3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern "C" {
3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../SDL_sysvideo.h"
3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../../events/SDL_events_c.h"
3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_sysevents_c.h"
3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_sysmouse_c.h"
3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_syswm_c.h"
3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_lowvideo.h"
3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../SDL_yuvfuncs.h"
4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_sysyuv.h"
4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../blank_cursor.h"
4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define BEOS_HIDDEN_SIZE	32	/* starting hidden window size */
4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Initialization/Query functions */
4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int BE_VideoInit(_THIS, SDL_PixelFormat *vformat);
4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_Rect **BE_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_Surface *BE_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void BE_UpdateMouse(_THIS);
5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int BE_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void BE_VideoQuit(_THIS);
5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Hardware surface functions */
5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int BE_AllocHWSurface(_THIS, SDL_Surface *surface);
5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int BE_LockHWSurface(_THIS, SDL_Surface *surface);
5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void BE_UnlockHWSurface(_THIS, SDL_Surface *surface);
5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void BE_FreeHWSurface(_THIS, SDL_Surface *surface);
5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int BE_ToggleFullScreen(_THIS, int fullscreen);
6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_Overlay *BE_CreateYUVOverlay(_THIS, int width, int height, Uint32 format, SDL_Surface *display);
6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* OpenGL functions */
6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int BE_GL_LoadLibrary(_THIS, const char *path);
6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void* BE_GL_GetProcAddress(_THIS, const char *proc);
6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int BE_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value);
6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int BE_GL_MakeCurrent(_THIS);
6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void BE_GL_SwapBuffers(_THIS);
6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* FB driver bootstrap functions */
7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int BE_Available(void)
7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(1);
7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void BE_DeleteDevice(SDL_VideoDevice *device)
7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_free(device->hidden);
8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_free(device);
8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_VideoDevice *BE_CreateDevice(int devindex)
8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_VideoDevice *device;
8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Initialize all variables that we clean on shutdown */
8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice));
9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( device ) {
9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_memset(device, 0, (sizeof *device));
9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		device->hidden = (struct SDL_PrivateVideoData *)
9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				SDL_malloc((sizeof *device->hidden));
9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( (device == NULL) || (device->hidden == NULL) ) {
9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_OutOfMemory();
9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( device ) {
9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_free(device);
9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(0);
10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_memset(device->hidden, 0, (sizeof *device->hidden));
10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Set the function pointers */
10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Initialization/Query functions */
10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->VideoInit = BE_VideoInit;
10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->ListModes = BE_ListModes;
10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetVideoMode = BE_SetVideoMode;
10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->ToggleFullScreen = BE_ToggleFullScreen;
11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->UpdateMouse = BE_UpdateMouse;
11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->CreateYUVOverlay = BE_CreateYUVOverlay;
11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetColors = BE_SetColors;
11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->UpdateRects = NULL;
11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->VideoQuit = BE_VideoQuit;
11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Hardware acceleration functions */
11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->AllocHWSurface = BE_AllocHWSurface;
11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->CheckHWBlit = NULL;
11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->FillHWRect = NULL;
11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetHWColorKey = NULL;
12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetHWAlpha = NULL;
12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->LockHWSurface = BE_LockHWSurface;
12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->UnlockHWSurface = BE_UnlockHWSurface;
12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->FlipHWSurface = NULL;
12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->FreeHWSurface = BE_FreeHWSurface;
12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Gamma support */
12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* OpenGL support */
12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GL_LoadLibrary = BE_GL_LoadLibrary;
12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GL_GetProcAddress = BE_GL_GetProcAddress;
13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GL_GetAttribute = BE_GL_GetAttribute;
13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GL_MakeCurrent = BE_GL_MakeCurrent;
13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GL_SwapBuffers = BE_GL_SwapBuffers;
13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Window manager functions */
13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetCaption = BE_SetWMCaption;
13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetIcon = NULL;
13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->IconifyWindow = BE_IconifyWindow;
13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GrabInput = BE_GrabInput;
13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GetWMInfo = BE_GetWMInfo;
14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Cursor manager functions */
14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->FreeWMCursor = BE_FreeWMCursor;
14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->CreateWMCursor = BE_CreateWMCursor;
14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->ShowWMCursor = BE_ShowWMCursor;
14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->WarpWMCursor = BE_WarpWMCursor;
14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->MoveWMCursor = NULL;
14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->CheckMouseMode = BE_CheckMouseMode;
14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Event manager functions */
14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->InitOSKeymap = BE_InitOSKeymap;
14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->PumpEvents = BE_PumpEvents;
15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->free = BE_DeleteDevice;
15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Set the driver flags */
15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->handles_any_size = 1;
15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return device;
15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
15946be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerVideoBootStrap BWINDOW_bootstrap = {
16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	"bwindow", "BDirectWindow graphics",
16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	BE_Available, BE_CreateDevice
16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner};
16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic inline int ColorSpaceToBitsPerPixel(uint32 colorspace)
16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int bitsperpixel;
16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	bitsperpixel = 0;
16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	switch (colorspace) {
17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    case B_CMAP8:
17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		bitsperpixel = 8;
17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    case B_RGB15:
17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    case B_RGBA15:
17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    case B_RGB15_BIG:
17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    case B_RGBA15_BIG:
17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		bitsperpixel = 15;
17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    case B_RGB16:
18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    case B_RGB16_BIG:
18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		bitsperpixel = 16;
18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    case B_RGB32:
18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    case B_RGBA32:
18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    case B_RGB32_BIG:
18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    case B_RGBA32_BIG:
18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		bitsperpixel = 32;
18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	    default:
19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(bitsperpixel);
19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Function to sort the display_list in bscreen */
19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int CompareModes(const void *A, const void *B)
19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	const display_mode *a = (display_mode *)A;
19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	const display_mode *b = (display_mode *)B;
20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( a->space == b->space ) {
20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return((b->virtual_width*b->virtual_height)-
20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		       (a->virtual_width*a->virtual_height));
20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	} else {
20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(ColorSpaceToBitsPerPixel(b->space)-
20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		       ColorSpaceToBitsPerPixel(a->space));
20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Yes, this isn't the fastest it could be, but it works nicely */
21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int BE_AddMode(_THIS, int index, unsigned int w, unsigned int h)
21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_Rect *mode;
21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int i;
21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int next_mode;
21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Check to see if we already have this mode */
21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( SDL_nummodes[index] > 0 ) {
21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		for ( i=SDL_nummodes[index]-1; i >= 0; --i ) {
22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mode = SDL_modelist[index][i];
22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( (mode->w == w) && (mode->h == h) ) {
22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef BWINDOW_DEBUG
22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				fprintf(stderr, "We already have mode %dx%d at %d bytes per pixel\n", w, h, index+1);
22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				return(0);
22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Set up the new video mode rectangle */
23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	mode = (SDL_Rect *)SDL_malloc(sizeof *mode);
23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( mode == NULL ) {
23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_OutOfMemory();
23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(-1);
23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	mode->x = 0;
23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	mode->y = 0;
23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	mode->w = w;
23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	mode->h = h;
24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef BWINDOW_DEBUG
24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	fprintf(stderr, "Adding mode %dx%d at %d bytes per pixel\n", w, h, index+1);
24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Allocate the new list of modes, and fill in the new mode */
24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	next_mode = SDL_nummodes[index];
24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_modelist[index] = (SDL_Rect **)
24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	       SDL_realloc(SDL_modelist[index], (1+next_mode+1)*sizeof(SDL_Rect *));
24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( SDL_modelist[index] == NULL ) {
24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_OutOfMemory();
25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_nummodes[index] = 0;
25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_free(mode);
25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(-1);
25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_modelist[index][next_mode] = mode;
25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_modelist[index][next_mode+1] = NULL;
25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_nummodes[index]++;
25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(0);
25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint BE_VideoInit(_THIS, SDL_PixelFormat *vformat)
26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	display_mode *modes;
26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	uint32 i, nmodes;
26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int bpp;
26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	BRect bounds;
26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Initialize the Be Application for appserver interaction */
26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( SDL_InitBeApp() < 0 ) {
27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(-1);
27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* It is important that this be created after SDL_InitBeApp() */
27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	BScreen bscreen;
27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Save the current display mode */
27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	bscreen.GetMode(&saved_mode);
27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	_this->info.current_w = saved_mode.virtual_width;
27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	_this->info.current_h = saved_mode.virtual_height;
28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Determine the screen depth */
28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	vformat->BitsPerPixel = ColorSpaceToBitsPerPixel(bscreen.ColorSpace());
28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( vformat->BitsPerPixel == 0 ) {
28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_SetError("Unknown BScreen colorspace: 0x%x",
28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						bscreen.ColorSpace());
28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(-1);
28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Get the video modes we can switch to in fullscreen mode */
29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	bscreen.GetModeList(&modes, &nmodes);
29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_qsort(modes, nmodes, sizeof *modes, CompareModes);
29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	for ( i=0; i<nmodes; ++i ) {
29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		bpp = ColorSpaceToBitsPerPixel(modes[i].space);
29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		//if ( bpp != 0 ) { // There are bugs in changing colorspace
29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( modes[i].space == saved_mode.space ) {
29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			BE_AddMode(_this, ((bpp+7)/8)-1,
29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				modes[i].virtual_width,
29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				modes[i].virtual_height);
29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Create the window and view */
30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	bounds.top = 0; bounds.left = 0;
30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	bounds.right = BEOS_HIDDEN_SIZE;
30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	bounds.bottom = BEOS_HIDDEN_SIZE;
30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_Win = new SDL_BWin(bounds);
30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* testgl application doesn't load library, just tries to load symbols */
31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* is it correct? if so we have to load library here */
31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	BE_GL_LoadLibrary(_this, NULL);
31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Create the clear cursor */
31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_BlankCursor = BE_CreateWMCursor(_this, blank_cdata, blank_cmask,
31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			BLANK_CWIDTH, BLANK_CHEIGHT, BLANK_CHOTX, BLANK_CHOTY);
31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Fill in some window manager capabilities */
31946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	_this->info.wm_available = 1;
32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* We're done! */
32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(0);
32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* We support any dimension at our bit-depth */
32646be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_Rect **BE_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_Rect **modes;
32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	modes = ((SDL_Rect **)0);
33146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) {
33246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		modes = SDL_modelist[((format->BitsPerPixel+7)/8)-1];
33346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	} else {
33446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( format->BitsPerPixel ==
33546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			_this->screen->format->BitsPerPixel ) {
33646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			modes = ((SDL_Rect **)-1);
33746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
33846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
33946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(modes);
34046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
34146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
34246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Various screen update functions available */
34346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void BE_NormalUpdate(_THIS, int numrects, SDL_Rect *rects);
34446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
34546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
34646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Find the closest display mode for fullscreen */
34746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic bool BE_FindClosestFSMode(_THIS, int width, int height, int bpp,
34846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					 display_mode *mode)
34946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
35046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	BScreen bscreen;
35146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	uint32 i, nmodes;
35246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_Rect **modes;
35346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	display_mode *dmodes;
35446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	display_mode current;
35546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	float current_refresh;
35646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	bscreen.GetMode(&current);
35746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	current_refresh = (1000 * current.timing.pixel_clock) /
35846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	                  (current.timing.h_total * current.timing.v_total);
35946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
36046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	modes = SDL_modelist[((bpp+7)/8)-1];
36146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	for ( i=0; modes[i] && (modes[i]->w > width) &&
36246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		      (modes[i]->h > height); ++i ) {
36346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* still looking */
36446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
36546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( ! modes[i] || (modes[i]->w < width) || (modes[i]->h < width) ) {
36646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		--i;	/* We went too far */
36746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
36846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
36946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	width = modes[i]->w;
37046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	height = modes[i]->h;
37146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
37246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	bscreen.GetModeList(&dmodes, &nmodes);
37346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	for ( i = 0; i < nmodes; ++i ) {
37446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( (bpp == ColorSpaceToBitsPerPixel(dmodes[i].space)) &&
37546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		     (width == dmodes[i].virtual_width) &&
37646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		     (height == dmodes[i].virtual_height) ) {
37746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
37846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
37946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
38046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( i != nmodes ) {
38146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		*mode = dmodes[i];
38246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ((mode->virtual_width <= current.virtual_width) &&
38346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		    (mode->virtual_height <= current.virtual_height)) {
38446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			float new_refresh = (1000 * mode->timing.pixel_clock) /
38546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			                    (mode->timing.h_total * mode->timing.v_total);
38646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if (new_refresh < current_refresh) {
38746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				mode->timing.pixel_clock = (uint32)((mode->timing.h_total * mode->timing.v_total)
38846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				                                    * current_refresh / 1000);
38946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
39046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
39146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return true;
39246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	} else {
39346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return false;
39446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
39546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
39646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
39746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int BE_SetFullScreen(_THIS, SDL_Surface *screen, int fullscreen)
39846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
39946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int was_fullscreen;
40046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	bool needs_unlock;
40146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	BScreen bscreen;
40246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	BRect bounds;
40346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	display_mode mode;
40446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int width, height, bpp;
40546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
40646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Set the fullscreen mode */
40746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	was_fullscreen = SDL_Win->IsFullScreen();
40846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_Win->SetFullScreen(fullscreen);
40946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	fullscreen = SDL_Win->IsFullScreen();
41046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
41146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	width = screen->w;
41246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	height = screen->h;
41346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
41446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Set the appropriate video mode */
41546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( fullscreen ) {
41646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		bpp = screen->format->BitsPerPixel;
41746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		bscreen.GetMode(&mode);
41846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( (bpp != ColorSpaceToBitsPerPixel(mode.space)) ||
41946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		     (width != mode.virtual_width) ||
42046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		     (height != mode.virtual_height)) {
42146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if(BE_FindClosestFSMode(_this, width, height, bpp, &mode)) {
42246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				bscreen.SetMode(&mode);
42346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				/* This simply stops the next resize event from being
42446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				 * sent to the SDL handler.
42546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				 */
42646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				SDL_Win->InhibitResize();
42746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			} else {
42846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				fullscreen = 0;
42946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				SDL_Win->SetFullScreen(fullscreen);
43046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
43146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
43246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
43346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( was_fullscreen && ! fullscreen ) {
43446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		bscreen.SetMode(&saved_mode);
43546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
43646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
43746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( SDL_Win->Lock() ) {
43846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		int cx, cy;
43946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( SDL_Win->Shown() ) {
44046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			needs_unlock = 1;
44146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_Win->Hide();
44246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		} else {
44346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			needs_unlock = 0;
44446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
44546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* This resizes the window and view area, but inhibits resizing
44646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		 * of the BBitmap due to the InhibitResize call above. Thus the
44746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		 * bitmap (pixel data) never changes.
44846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		 */
44946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_Win->ResizeTo(width, height);
45046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		bounds = bscreen.Frame();
45146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Calculate offsets - used either to center window
45246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		 * (windowed mode) or to set drawing offsets (fullscreen mode)
45346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		 */
45446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		cx = (bounds.IntegerWidth() - width)/2;
45546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		cy = (bounds.IntegerHeight() - height)/2;
45646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
45746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( fullscreen ) {
45846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* Set offset for drawing */
45946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_Win->SetXYOffset(cx, cy);
46046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		} else {
46146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_Win->SetXYOffset(0, 0);
46246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
46346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( ! needs_unlock || was_fullscreen ) {
46446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* Center the window the first time */
46546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_Win->MoveTo(cx, cy);
46646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
46746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_Win->Show();
46846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
46946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Unlock the window manually after the first Show() */
47046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( needs_unlock ) {
47146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_Win->Unlock();
47246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
47346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
47446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
47546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Set the fullscreen flag in the screen surface */
47646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( fullscreen ) {
47746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		screen->flags |= SDL_FULLSCREEN;
47846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	} else {
47946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		screen->flags &= ~SDL_FULLSCREEN;
48046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
48146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(1);
48246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
48346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
48446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int BE_ToggleFullScreen(_THIS, int fullscreen)
48546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
48646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return BE_SetFullScreen(_this, _this->screen, fullscreen);
48746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
48846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
48946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* FIXME: check return values and cleanup here */
49046be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_Surface *BE_SetVideoMode(_THIS, SDL_Surface *current,
49146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				int width, int height, int bpp, Uint32 flags)
49246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
49346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	BScreen bscreen;
49446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	BBitmap *bbitmap;
49546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	BRect bounds;
49646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Uint32 gl_flags = 0;
49746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
49846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Only RGB works on r5 currently */
49946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	gl_flags = BGL_RGB;
50046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (_this->gl_config.double_buffer)
50146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		gl_flags |= BGL_DOUBLE;
50246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	else
50346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		gl_flags |= BGL_SINGLE;
50446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (_this->gl_config.alpha_size > 0 || bpp == 32)
50546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		gl_flags |= BGL_ALPHA;
50646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (_this->gl_config.depth_size > 0)
50746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		gl_flags |= BGL_DEPTH;
50846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (_this->gl_config.stencil_size > 0)
50946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		gl_flags |= BGL_STENCIL;
51046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (_this->gl_config.accum_red_size > 0
51146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		|| _this->gl_config.accum_green_size > 0
51246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		|| _this->gl_config.accum_blue_size > 0
51346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		|| _this->gl_config.accum_alpha_size > 0)
51446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		gl_flags |= BGL_ACCUM;
51546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
51646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Create the view for this window, using found flags */
51746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( SDL_Win->CreateView(flags, gl_flags) < 0 ) {
51846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(NULL);
51946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
52046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
52146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	current->flags = 0;		/* Clear flags */
52246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	current->w = width;
52346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	current->h = height;
52446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_Win->SetType(B_TITLED_WINDOW);
52546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( flags & SDL_NOFRAME ) {
52646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		current->flags |= SDL_NOFRAME;
52746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_Win->SetLook(B_NO_BORDER_WINDOW_LOOK);
52846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	} else {
52946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( (flags & SDL_RESIZABLE) && !(flags & SDL_OPENGL) )  {
53046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			current->flags |= SDL_RESIZABLE;
53146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* We don't want opaque resizing (TM). :-) */
53246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_Win->SetFlags(B_OUTLINE_RESIZE);
53346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		} else {
53446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_Win->SetFlags(B_NOT_RESIZABLE|B_NOT_ZOOMABLE);
53546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
53646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
53746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
53846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( flags & SDL_OPENGL ) {
53946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		current->flags |= SDL_OPENGL;
54046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		current->pitch = 0;
54146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		current->pixels = NULL;
54246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		_this->UpdateRects = NULL;
54346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	} else {
54446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Create the BBitmap framebuffer */
54546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		bounds.top = 0; bounds.left = 0;
54646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		bounds.right = width-1;
54746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		bounds.bottom = height-1;
54846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		bbitmap = new BBitmap(bounds, bscreen.ColorSpace());
54946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( ! bbitmap->IsValid() ) {
55046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_SetError("Couldn't create screen bitmap");
55146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			delete bbitmap;
55246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			return(NULL);
55346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
55446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		current->pitch = bbitmap->BytesPerRow();
55546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		current->pixels = (void *)bbitmap->Bits();
55646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_Win->SetBitmap(bbitmap);
55746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		_this->UpdateRects = BE_NormalUpdate;
55846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
55946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
56046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Set the correct fullscreen mode */
56146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	BE_SetFullScreen(_this, current, flags & SDL_FULLSCREEN ? 1 : 0);
56246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
56346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* We're done */
56446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(current);
56546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
56646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
56746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Update the current mouse state and position */
56846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid BE_UpdateMouse(_THIS)
56946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
57046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	BPoint point;
57146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	uint32 buttons;
57246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
57346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( SDL_Win->Lock() ) {
57446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Get new input state, if still active */
57546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( SDL_Win->IsActive() ) {
57646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			(SDL_Win->View())->GetMouse(&point, &buttons, true);
57746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		} else {
57846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			point.x = -1;
57946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			point.y = -1;
58046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
58146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_Win->Unlock();
58246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
58346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( (point.x >= 0) && (point.x < SDL_VideoSurface->w) &&
58446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		     (point.y >= 0) && (point.y < SDL_VideoSurface->h) ) {
58546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
58646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_PrivateMouseMotion(0, 0,
58746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					(Sint16)point.x, (Sint16)point.y);
58846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		} else {
58946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
59046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
59146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
59246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
59346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
59446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* We don't actually allow hardware surfaces other than the main one */
59546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int BE_AllocHWSurface(_THIS, SDL_Surface *surface)
59646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
59746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(-1);
59846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
59946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void BE_FreeHWSurface(_THIS, SDL_Surface *surface)
60046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
60146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return;
60246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
60346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int BE_LockHWSurface(_THIS, SDL_Surface *surface)
60446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
60546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(0);
60646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
60746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void BE_UnlockHWSurface(_THIS, SDL_Surface *surface)
60846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
60946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return;
61046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
61146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
61246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void BE_NormalUpdate(_THIS, int numrects, SDL_Rect *rects)
61346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
61446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( SDL_Win->BeginDraw() ) {
61546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		int i;
61646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
61746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		for ( i=0; i<numrects; ++i ) {
61846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			BRect rect;
61946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
62046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			rect.top = rects[i].y;
62146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			rect.left = rects[i].x;
62246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			rect.bottom = rect.top+rects[i].h-1;
62346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			rect.right = rect.left+rects[i].w-1;
62446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_Win->DrawAsync(rect);
62546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
62646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_Win->EndDraw();
62746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
62846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
62946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
63046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
63146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Passing a NULL path means load pointers from the application */
63246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint BE_GL_LoadLibrary(_THIS, const char *path)
63346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
63446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (path == NULL) {
63546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if (_this->gl_config.dll_handle == NULL) {
63646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			image_info info;
63746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			int32 cookie = 0;
63846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			while (get_next_image_info(0,&cookie,&info) == B_OK) {
63946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				void *location = NULL;
64046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if (get_image_symbol((image_id)cookie,"glBegin",B_SYMBOL_TYPE_ANY,&location) == B_OK) {
64146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					_this->gl_config.dll_handle = (void*)cookie;
64246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					_this->gl_config.driver_loaded = 1;
64346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					SDL_strlcpy(_this->gl_config.driver_path, "libGL.so", SDL_arraysize(_this->gl_config.driver_path));
64446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
64546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
64646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
64746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	} else {
64846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/*
64946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			FIXME None of BeOS libGL.so implementations have exported functions
65046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			to load BGLView, which should be reloaded from new lib.
65146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			So for now just "load" linked libGL.so :(
65246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		*/
65346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if (_this->gl_config.dll_handle == NULL) {
65446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			return BE_GL_LoadLibrary(_this, NULL);
65546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
65646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
65746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Unload old first */
65846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/*if (_this->gl_config.dll_handle != NULL) {*/
65946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* Do not try to unload application itself (if LoadLibrary was called before with NULL ;) */
66046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/*	image_info info;
66146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if (get_image_info((image_id)_this->gl_config.dll_handle, &info) == B_OK) {
66246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if (info.type != B_APP_IMAGE) {
66346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					unload_add_on((image_id)_this->gl_config.dll_handle);
66446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
66546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
66646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
66746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
66846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
66946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ((_this->gl_config.dll_handle = (void*)load_add_on(path)) != (void*)B_ERROR) {
67046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			_this->gl_config.driver_loaded = 1;
67146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_strlcpy(_this->gl_config.driver_path, path, SDL_arraysize(_this->gl_config.driver_path));
67246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}*/
67346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
67446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
67546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (_this->gl_config.dll_handle != NULL) {
67646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return 0;
67746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	} else {
67846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		_this->gl_config.dll_handle = NULL;
67946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		_this->gl_config.driver_loaded = 0;
68046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		*_this->gl_config.driver_path = '\0';
68146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return -1;
68246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
68346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
68446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
68546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid* BE_GL_GetProcAddress(_THIS, const char *proc)
68646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
68746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (_this->gl_config.dll_handle != NULL) {
68846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		void *location = NULL;
68946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		status_t err;
69046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ((err = get_image_symbol((image_id)_this->gl_config.dll_handle, proc, B_SYMBOL_TYPE_ANY, &location)) == B_OK) {
69146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			return location;
69246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		} else {
69346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_SetError("Couldn't find OpenGL symbol");
69446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			return NULL;
69546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
69646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	} else {
69746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_SetError("OpenGL library not loaded");
69846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return NULL;
69946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
70046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
70146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
70246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint BE_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value)
70346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
70446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/*
70546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		FIXME? Right now BE_GL_GetAttribute shouldn't be called between glBegin() and glEnd() - it doesn't use "cached" values
70646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	*/
70746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	switch (attrib)
70846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    {
70946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_RED_SIZE:
71046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetIntegerv(GL_RED_BITS, (GLint*)value);
71146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
71246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_GREEN_SIZE:
71346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetIntegerv(GL_GREEN_BITS, (GLint*)value);
71446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
71546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_BLUE_SIZE:
71646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetIntegerv(GL_BLUE_BITS, (GLint*)value);
71746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
71846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_ALPHA_SIZE:
71946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetIntegerv(GL_ALPHA_BITS, (GLint*)value);
72046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
72146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_DOUBLEBUFFER:
72246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetBooleanv(GL_DOUBLEBUFFER, (GLboolean*)value);
72346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
72446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_BUFFER_SIZE:
72546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			int v;
72646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetIntegerv(GL_RED_BITS, (GLint*)&v);
72746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			*value = v;
72846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetIntegerv(GL_GREEN_BITS, (GLint*)&v);
72946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			*value += v;
73046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetIntegerv(GL_BLUE_BITS, (GLint*)&v);
73146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			*value += v;
73246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetIntegerv(GL_ALPHA_BITS, (GLint*)&v);
73346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			*value += v;
73446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
73546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_DEPTH_SIZE:
73646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetIntegerv(GL_DEPTH_BITS, (GLint*)value); /* Mesa creates 16 only? r5 always 32 */
73746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
73846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_STENCIL_SIZE:
73946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetIntegerv(GL_STENCIL_BITS, (GLint*)value);
74046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
74146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_ACCUM_RED_SIZE:
74246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetIntegerv(GL_ACCUM_RED_BITS, (GLint*)value);
74346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
74446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_ACCUM_GREEN_SIZE:
74546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetIntegerv(GL_ACCUM_GREEN_BITS, (GLint*)value);
74646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
74746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_ACCUM_BLUE_SIZE:
74846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetIntegerv(GL_ACCUM_BLUE_BITS, (GLint*)value);
74946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
75046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_ACCUM_ALPHA_SIZE:
75146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			glGetIntegerv(GL_ACCUM_ALPHA_BITS, (GLint*)value);
75246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
75346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_STEREO:
75446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_MULTISAMPLEBUFFERS:
75546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_GL_MULTISAMPLESAMPLES:
75646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		default:
75746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			*value=0;
75846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			return(-1);
75946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
76046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return 0;
76146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
76246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
76346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint BE_GL_MakeCurrent(_THIS)
76446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
76546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* FIXME: should we glview->unlock and then glview->lock()? */
76646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return 0;
76746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
76846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
76946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid BE_GL_SwapBuffers(_THIS)
77046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
77146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_Win->SwapBuffers();
77246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
77346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
77446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
77546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Is the system palette settable? */
77646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint BE_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
77746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
77846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int i;
77946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_Palette *palette;
78046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	const color_map *cmap = BScreen().ColorMap();
78146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
78246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Get the screen colormap */
78346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	palette = _this->screen->format->palette;
78446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	for ( i=0; i<256; ++i ) {
78546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		palette->colors[i].r = cmap->color_list[i].red;
78646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		palette->colors[i].g = cmap->color_list[i].green;
78746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		palette->colors[i].b = cmap->color_list[i].blue;
78846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
78946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(0);
79046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
79146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
79246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid BE_VideoQuit(_THIS)
79346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
79446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int i, j;
79546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
79646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_Win->Quit();
79746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_Win = NULL;
79846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
79946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( SDL_BlankCursor != NULL ) {
80046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		BE_FreeWMCursor(_this, SDL_BlankCursor);
80146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_BlankCursor = NULL;
80246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
80346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	for ( i=0; i<NUM_MODELISTS; ++i ) {
80446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( SDL_modelist[i] ) {
80546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			for ( j=0; SDL_modelist[i][j]; ++j ) {
80646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				SDL_free(SDL_modelist[i][j]);
80746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
80846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_free(SDL_modelist[i]);
80946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_modelist[i] = NULL;
81046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
81146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
81246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Restore the original video mode */
81346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( _this->screen ) {
81446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( (_this->screen->flags&SDL_FULLSCREEN) == SDL_FULLSCREEN ) {
81546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			BScreen bscreen;
81646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			bscreen.SetMode(&saved_mode);
81746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
81846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		_this->screen->pixels = NULL;
81946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
82046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
82146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
82246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (_this->gl_config.dll_handle != NULL)
82346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		unload_add_on((image_id)_this->gl_config.dll_handle);
82446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
82546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
82646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_QuitBeApp();
82746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
82846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
82946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}; /* Extern C */
830