mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-22 22:00:39 -06:00
SDLWindow also mainly for review
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1578 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -101,6 +101,11 @@ if gfxenv['HAVE_XXF86VM']:
|
|||||||
'X11Window.cpp',
|
'X11Window.cpp',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if gfxenv['HAVE_SDL']:
|
||||||
|
files += [
|
||||||
|
'SDLWindow.cpp',
|
||||||
|
]
|
||||||
|
|
||||||
# Sanity check
|
# Sanity check
|
||||||
if gfxenv['USE_WX'] and not gfxenv['HAVE_WX']:
|
if gfxenv['USE_WX'] and not gfxenv['HAVE_WX']:
|
||||||
print "Must have wx to use wxgl"
|
print "Must have wx to use wxgl"
|
||||||
|
131
Source/Plugins/Plugin_VideoOGL/Src/SDLWindow.cpp
Normal file
131
Source/Plugins/Plugin_VideoOGL/Src/SDLWindow.cpp
Normal file
@ -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);
|
||||||
|
}
|
26
Source/Plugins/Plugin_VideoOGL/Src/SDLWindow.h
Normal file
26
Source/Plugins/Plugin_VideoOGL/Src/SDLWindow.h
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#ifndef _SDLWINDOW_H
|
||||||
|
#define _SDLWINDOW_H
|
||||||
|
|
||||||
|
#include "GLWindow.h"
|
||||||
|
#include <GL/glxew.h>
|
||||||
|
#include <SDL.h>
|
||||||
|
#include <GL/gl.h>
|
||||||
|
|
||||||
|
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
|
Reference in New Issue
Block a user