diff --git a/Source/Plugins/Plugin_VideoOGL/Src/SConscript b/Source/Plugins/Plugin_VideoOGL/Src/SConscript index fe44acfc25..288db7fc52 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/SConscript +++ b/Source/Plugins/Plugin_VideoOGL/Src/SConscript @@ -101,6 +101,11 @@ if gfxenv['HAVE_XXF86VM']: 'X11Window.cpp', ] +if gfxenv['HAVE_SDL']: + files += [ + 'SDLWindow.cpp', + ] + # Sanity check if gfxenv['USE_WX'] and not gfxenv['HAVE_WX']: print "Must have wx to use wxgl" diff --git a/Source/Plugins/Plugin_VideoOGL/Src/SDLWindow.cpp b/Source/Plugins/Plugin_VideoOGL/Src/SDLWindow.cpp new file mode 100644 index 0000000000..4f2c87f06d --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/SDLWindow.cpp @@ -0,0 +1,131 @@ +#include "SDLWindow.h" + +void SDLWindow::SwapBuffers() { + SDL_GL_SwapBuffers(); +} + +void SDLWindow::SetWindowText(const char *text) { + SDL_WM_SetCaption(text, NULL); +} + +bool SDLWindow::PeekMessages() { + // TODO implement + return false; +} + +void SDLWindow::Update() { + + SDL_Surface *surface = SDL_GetVideoSurface(); + // RECT rcWindow; + if (!surface) return; + //nBackbufferWidth = surface->w; + //nBackbufferHeight = surface->h; + + // rcWindow.right = surface->w; + // rcWindow.bottom = surface->h; + + float FactorW = 640.0f / (float)surface->w; + float FactorH = 480.0f / (float)surface->h; + float Max = (FactorW < FactorH) ? FactorH : FactorW; + // AR = (float)surface->w / (float)surface->h;; + + if (g_Config.bStretchToFit) { + MValueX = 1; + MValueY = 1; + nXoff = 0; + nYoff = 0; + } else { + MValueX = 1.0f / Max; + MValueY = 1.0f / Max; + nXoff = (int)((surface->w - (640 * MValueX)) / 2); + nYoff = (int)((surface->h - (480 * MValueY)) / 2); + } + + // tell the debugger + // gleft = rcWindow.left; gright = rcWindow.right; + // gtop = rcWindow.top; gbottom = rcWindow.bottom; +} + +bool SDLWindow::MakeCurrent() { + /* Note: The reason for having the call to SDL_SetVideoMode in here instead + of in OpenGL_Create() is that "make current" is part of the video + mode setting and is not available as a separate call in SDL. We + have to do "make current" here because this method runs in the CPU + thread while OpenGL_Create() runs in a diferent thread and "make + current" has to be done in the same thread that will be making + calls to OpenGL. */ + + // Fetch video info. + const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo(); + if (!videoInfo) { + // TODO: Display an error message. + SDL_Quit(); + return false; + } + // Compute video mode flags. + const int videoFlags = SDL_OPENGL + | ( videoInfo->hw_available ? SDL_HWSURFACE : SDL_SWSURFACE ) + | ( g_Config.bFullscreen ? SDL_FULLSCREEN : 0); + // Set vide mode. + // TODO: Can we use this field or is a separate field needed? + SDL_Surface *screen = SDL_SetVideoMode(GetWidth(), GetHeight(), + 0, videoFlags); + if (!screen) { + //TODO : Display an error message + SDL_Quit(); + return false; + } + + return true; +} + +SDLWindow::~SDLWindow() { + SDL_Quit(); +} + +SDLWindow::SDLWindow(int _iwidth, int _iheight) { + int _twidth, _theight; + if(g_Config.bFullscreen) { + if(strlen(g_Config.iFSResolution) > 1) { + sscanf(g_Config.iFSResolution, "%dx%d", &_twidth, &_theight); + } else { // No full screen reso set, fall back to default reso + _twidth = _iwidth; + _theight = _iheight; + } + } else { // Going Windowed + if(strlen(g_Config.iWindowedRes) > 1) { + sscanf(g_Config.iWindowedRes, "%dx%d", &_twidth, &_theight); + } else {// No Window reso set, fall back to default + _twidth = _iwidth; + _theight = _iheight; + } + } + + SetSize(_iwidth, _theight); + + float FactorW = 640.0f / (float)_twidth; + float FactorH = 480.0f / (float)_theight; + float Max = (FactorW < FactorH) ? FactorH : FactorW; + + if(g_Config.bStretchToFit) { + MValueX = 1.0f / FactorW; + MValueY = 1.0f / FactorH; + nXoff = 0; + nYoff = 0; + } else { + MValueX = 1.0f / Max; + MValueY = 1.0f / Max; + nXoff = (int)((_twidth - (640 * MValueX)) / 2); + nYoff = (int)((_theight - (480 * MValueY)) / 2); + } + + //init sdl video + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + //TODO : Display an error message + SDL_Quit(); + // return NULL; + } + + //setup ogl to use double buffering + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/SDLWindow.h b/Source/Plugins/Plugin_VideoOGL/Src/SDLWindow.h new file mode 100644 index 0000000000..472d738064 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/SDLWindow.h @@ -0,0 +1,26 @@ +#ifndef _SDLWINDOW_H +#define _SDLWINDOW_H + +#include "GLWindow.h" +#include +#include +#include + +class SDLWindow : public GLWindow +{ +public: + int nXoff, nYoff; // screen offset + // Since it can Stretch to fit Window, we need two different multiplication values + float MValueX, MValueY; + + virtual void SwapBuffers(); + virtual void SetWindowText(const char *text); + virtual bool PeekMessages(); + virtual void Update(); + virtual bool MakeCurrent(); + + ~SDLWindow(); + SDLWindow(int _iwidth, int _iheight); + +}; +#endif