diff --git a/stella/src/emucore/Console.cxx b/stella/src/emucore/Console.cxx index 6ff6c0c53..524408d62 100644 --- a/stella/src/emucore/Console.cxx +++ b/stella/src/emucore/Console.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: Console.cxx,v 1.23 2004-04-04 02:03:15 stephena Exp $ +// $Id: Console.cxx,v 1.24 2004-04-12 23:28:42 stephena Exp $ //============================================================================ #include @@ -207,7 +207,7 @@ Console::~Console() void Console::update() { myFrameBuffer.update(); -// FIXME mySound.update(); + mySound.update(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/emucore/TIA.cxx b/stella/src/emucore/TIA.cxx index d8ee7d340..0389f58c0 100644 --- a/stella/src/emucore/TIA.cxx +++ b/stella/src/emucore/TIA.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: TIA.cxx,v 1.27 2004-04-04 02:03:15 stephena Exp $ +// $Id: TIA.cxx,v 1.28 2004-04-12 23:28:42 stephena Exp $ //============================================================================ #include @@ -1637,7 +1637,7 @@ inline void TIA::updateFrameScanline(uInt32 clocksToUpdate, uInt32 hpos) myFramePointer = ending; // Add sound bytes to the sound queue every scanline - mySound.update(); +//FIXME mySound.update(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/ui/sdl/FrameBufferGL.cxx b/stella/src/ui/sdl/FrameBufferGL.cxx index 15c598892..8a002ba20 100644 --- a/stella/src/ui/sdl/FrameBufferGL.cxx +++ b/stella/src/ui/sdl/FrameBufferGL.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferGL.cxx,v 1.14 2004-04-04 02:03:15 stephena Exp $ +// $Id: FrameBufferGL.cxx,v 1.15 2004-04-12 23:28:42 stephena Exp $ //============================================================================ #include @@ -47,10 +47,33 @@ FrameBufferGL::~FrameBufferGL() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool FrameBufferGL::createScreen() { - uInt32 w = (uInt32) (myWidth * theZoomLevel * theAspectRatio); - uInt32 h = myHeight * theZoomLevel; + GLint viewportX = 0, viewportY = 0; + uInt32 screenWidth = 0; + uInt32 screenHeight = 0; - myScreen = SDL_SetVideoMode(w, h, 0, mySDLFlags); + uInt32 imageWidth = (uInt32) (myWidth * theZoomLevel * theAspectRatio); + uInt32 imageHeight = myHeight * theZoomLevel; + + // Determine if we're in fullscreen or windowed mode + // In fullscreen mode, we clip the SDL screen to known resolutions + // In windowed mode, we use the actual image resolution for the SDL screen + if(mySDLFlags & SDL_FULLSCREEN) + { + SDL_Rect rect = viewport(imageWidth, imageHeight); + + viewportX = rect.x; + viewportY = rect.y; + screenWidth = rect.w; + screenHeight = rect.h; + } + else + { + screenWidth = imageWidth; + screenHeight = imageHeight; + viewportX = viewportY = 0; + } + + myScreen = SDL_SetVideoMode(screenWidth, screenHeight, 0, mySDLFlags); if(myScreen == NULL) { cerr << "ERROR: Unable to open SDL window: " << SDL_GetError() << endl; @@ -58,14 +81,16 @@ bool FrameBufferGL::createScreen() } glPushAttrib(GL_ENABLE_BIT); - glViewport(0, 0, myScreen->w, myScreen->h); + + // Center the screen horizontally and vertically + glViewport(viewportX, viewportY, imageWidth, imageHeight); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); - glOrtho(0.0, (GLdouble) myScreen->w/(theZoomLevel * theAspectRatio), - (GLdouble) myScreen->h/theZoomLevel, 0.0, 0.0, 1.0); + glOrtho(0.0, (GLdouble) imageWidth/(theZoomLevel * theAspectRatio), + (GLdouble) imageHeight/theZoomLevel, 0.0, 0.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); @@ -82,6 +107,9 @@ bool FrameBufferGL::createScreen() glEnable(GL_TEXTURE_2D); #endif + // Make sure any old parts of the screen are erased + glClear(GL_COLOR_BUFFER_BIT); + theRedrawEntireFrameIndicator = true; return true; } @@ -464,7 +492,7 @@ void FrameBufferGL::toggleFilter() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, myFilterParam); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, myFilterParam); - for(uInt32 i =0; i < 256; i++) + for(uInt32 i = 0; i < 256; i++) { glBindTexture(GL_TEXTURE_2D, myFontTextureID[i]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); @@ -476,3 +504,44 @@ void FrameBufferGL::toggleFilter() // The filtering has changed, so redraw the entire screen theRedrawEntireFrameIndicator = true; } + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +SDL_Rect FrameBufferGL::viewport(uInt32 width, uInt32 height) +{ + SDL_Rect rect; + rect.x = rect.y = 0; + rect.w = width; rect.h = height; + + struct Screenmode + { + uInt32 w; + uInt32 h; + }; + + // List of valid fullscreen OpenGL modes + Screenmode myScreenmode[6] = { + {320, 200 }, + {640, 480 }, + {800, 600 }, + {1024, 768 }, + {1280, 1024}, + {1600, 1200} + }; + + for(uInt32 i = 0; i < 6; i++) + { + if(width <= myScreenmode[i].w && height <= myScreenmode[i].h) + { + rect.x = (myScreenmode[i].w - width) / 2; + rect.y = (myScreenmode[i].h - height) / 2; + rect.w = myScreenmode[i].w; + rect.h = myScreenmode[i].h; + + return rect; + } + } + + // If we get here, it probably indicates an error + // But we have to return something ... + return rect; +} diff --git a/stella/src/ui/sdl/FrameBufferGL.hxx b/stella/src/ui/sdl/FrameBufferGL.hxx index 0b79fd89c..d83e19da2 100644 --- a/stella/src/ui/sdl/FrameBufferGL.hxx +++ b/stella/src/ui/sdl/FrameBufferGL.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferGL.hxx,v 1.7 2003-12-10 18:58:56 stephena Exp $ +// $Id: FrameBufferGL.hxx,v 1.8 2004-04-12 23:28:42 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_GL_HXX @@ -34,7 +34,7 @@ class MediaSource; This class implements an SDL OpenGL framebuffer. @author Stephen Anthony - @version $Id: FrameBufferGL.hxx,v 1.7 2003-12-10 18:58:56 stephena Exp $ + @version $Id: FrameBufferGL.hxx,v 1.8 2004-04-12 23:28:42 stephena Exp $ */ class FrameBufferGL : public FrameBufferSDL { @@ -123,6 +123,8 @@ class FrameBufferGL : public FrameBufferSDL bool createTextures(); + SDL_Rect viewport(uInt32 width, uInt32 height); + uInt32 power_of_two(uInt32 input) { uInt32 value = 1; diff --git a/stella/src/ui/sdl/mainSDL.cxx b/stella/src/ui/sdl/mainSDL.cxx index d060d59f7..4e976d45e 100644 --- a/stella/src/ui/sdl/mainSDL.cxx +++ b/stella/src/ui/sdl/mainSDL.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: mainSDL.cxx,v 1.69 2004-04-04 02:03:15 stephena Exp $ +// $Id: mainSDL.cxx,v 1.70 2004-04-12 23:28:43 stephena Exp $ //============================================================================ #include @@ -334,9 +334,6 @@ void handleEvents() else if(key == SDLK_RETURN) { theDisplay->toggleFullscreen(); - // Pause when switching modes - if(!theConsole->eventHandler().doPause()) - theConsole->eventHandler().sendEvent(Event::Pause, 1); } #ifdef DISPLAY_OPENGL else if(key == SDLK_f && theUseOpenGLFlag) @@ -687,11 +684,7 @@ int main(int argc, char* argv[]) theShowInfoFlag = theSettings->getBool("showinfo"); // Request that the SDL window be centered, if possible -#if defined(UNIX) - setenv("SDL_VIDEO_CENTERED", "1", 1); -#else putenv("SDL_VIDEO_CENTERED=1"); -#endif // Get a pointer to the file which contains the cartridge ROM const char* file = argv[argc - 1]; @@ -746,6 +739,7 @@ int main(int argc, char* argv[]) if(!theDisplay) { cerr << "ERROR: Couldn't set up display.\n"; + delete[] image; cleanup(); return 0; }