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(¤t); 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