diff --git a/stella/docs/index.html b/stella/docs/index.html index 81ea2d38b..8518caa6d 100644 --- a/stella/docs/index.html +++ b/stella/docs/index.html @@ -605,8 +605,8 @@ -
-gl_fsmax <never|always|ui|tia>
- OpenGL mode only. Stretch fullscreen image while in the given mode. +
-gl_fsmax <0|1>
+ OpenGL mode only. Stretch TIA image while in fullscreen mode. diff --git a/stella/src/common/FrameBufferGL.cxx b/stella/src/common/FrameBufferGL.cxx index ee7060560..3a131f3a3 100644 --- a/stella/src/common/FrameBufferGL.cxx +++ b/stella/src/common/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.126 2008-12-27 23:27:32 stephena Exp $ +// $Id: FrameBufferGL.cxx,v 1.127 2008-12-28 21:01:55 stephena Exp $ //============================================================================ #ifdef DISPLAY_OPENGL @@ -74,8 +74,6 @@ FrameBufferGL::FrameBufferGL(OSystem* osystem) : FrameBuffer(osystem), myTiaSurface(NULL), myFilterParamName("GL_NEAREST"), - myWidthScaleFactor(1.0), - myHeightScaleFactor(1.0), myHaveTexRectEXT(false), myDirtyFlag(true) { @@ -188,8 +186,6 @@ bool FrameBufferGL::loadFuncs() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool FrameBufferGL::initSubsystem(VideoMode& mode) { -cerr << "FrameBufferGL::initSubsystem\n"; - mySDLFlags |= SDL_OPENGL; // Set up the OpenGL attributes @@ -244,8 +240,6 @@ string FrameBufferGL::about() const // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool FrameBufferGL::setVidMode(VideoMode& mode) { -cerr << "setVidMode: w = " << mode.screen_w << ", h = " << mode.screen_h << endl; - bool inUIMode = myOSystem->eventHandler().state() == EventHandler::S_LAUNCHER || myOSystem->eventHandler().state() == EventHandler::S_DEBUGGER; @@ -254,32 +248,19 @@ cerr << "setVidMode: w = " << mode.screen_w << ", h = " << mode.screen_h << endl uInt32 baseWidth = mode.image_w / mode.gfxmode.zoom; uInt32 baseHeight = mode.image_h / mode.gfxmode.zoom; - // FIXME - look at actual videomode type - // Normally, we just scale to the given zoom level - myWidthScaleFactor = (float) mode.gfxmode.zoom; - myHeightScaleFactor = (float) mode.gfxmode.zoom; - - // Activate aspect ratio correction in TIA mode - int iaspect = myOSystem->settings().getInt("gl_aspect"); - if(!inUIMode && iaspect < 100) + // Aspect ratio and fullscreen stretching only applies to the TIA + if(!inUIMode) { - float aspectFactor = float(iaspect) / 100.0; - myWidthScaleFactor *= aspectFactor; - mode.image_w = (uInt16)(float(mode.image_w) * aspectFactor); - } + // Aspect ratio + int aspect = myOSystem->settings().getInt("gl_aspect"); + if(aspect < 100) + mode.image_w = (uInt16)(float(mode.image_w * aspect) / 100.0); - // Activate stretching if its been requested in fullscreen mode - float stretchFactor = 1.0; - if(fullScreen() && (mode.image_w < mode.screen_w) && - (mode.image_h < mode.screen_h)) - { - const string& gl_fsmax = myOSystem->settings().getString("gl_fsmax"); - - // Only stretch in certain modes - if((gl_fsmax == "always") || - (inUIMode && gl_fsmax == "ui") || - (!inUIMode && gl_fsmax == "tia")) + // Fullscreen mode stretching + if(fullScreen() && myOSystem->settings().getBool("gl_fsmax") && + (mode.image_w < mode.screen_w) && (mode.image_h < mode.screen_h)) { + float stretchFactor = 1.0; float scaleX = float(mode.image_w) / mode.screen_w; float scaleY = float(mode.image_h) / mode.screen_h; @@ -287,14 +268,13 @@ cerr << "setVidMode: w = " << mode.screen_w << ", h = " << mode.screen_h << endl stretchFactor = float(mode.screen_w) / mode.image_w; else stretchFactor = float(mode.screen_h) / mode.image_h; + + mode.image_w = (Uint16) (stretchFactor * mode.image_w); + mode.image_h = (Uint16) (stretchFactor * mode.image_h); } } - myWidthScaleFactor *= stretchFactor; - myHeightScaleFactor *= stretchFactor; // Now re-calculate the dimensions - mode.image_w = (Uint16) (stretchFactor * mode.image_w); - mode.image_h = (Uint16) (stretchFactor * mode.image_h); if(!fullScreen()) mode.screen_w = mode.image_w; mode.image_x = (mode.screen_w - mode.image_w) >> 1; mode.image_y = (mode.screen_h - mode.image_h) >> 1; @@ -390,6 +370,7 @@ cerr << "dimensions: " << (fullScreen() ? "(full)" : "") << endl myTiaSurface = new FBSurfaceGL(*this, baseWidth>>1, baseHeight, mode.image_w, mode.image_h); myTiaSurface->setPos(mode.image_x, mode.image_y); + myTiaSurface->setFilter(myOSystem->settings().getString("gl_filter")); } // Make sure any old parts of the screen are erased @@ -474,14 +455,11 @@ void FrameBufferGL::drawMediaSource(bool fullRedraw) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBufferGL::postFrameUpdate() { -//static int FCOUNT = 0; if(myDirtyFlag) { // Now show all changes made to the texture SDL_GL_SwapBuffers(); myDirtyFlag = false; -//cerr << FCOUNT++ % 2 << " : SWAP buffers" << endl; -//cerr << "--------------------------------------------------------------------" << endl; } } @@ -494,34 +472,6 @@ void FrameBufferGL::enablePhosphor(bool enable, int blend) myRedrawEntireFrame = true; } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void FrameBufferGL::toggleFilter() -{ -/* - if(myBuffer.filter == GL_NEAREST) - { - myBuffer.filter = GL_LINEAR; - myOSystem->settings().setString("gl_filter", "linear"); - showMessage("Filtering: GL_LINEAR"); - } - else - { - myBuffer.filter = GL_NEAREST; - myOSystem->settings().setString("gl_filter", "nearest"); - showMessage("Filtering: GL_NEAREST"); - } - - p_glBindTexture(myBuffer.target, myBuffer.texture); - p_glTexParameteri(myBuffer.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - p_glTexParameteri(myBuffer.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - p_glTexParameteri(myBuffer.target, GL_TEXTURE_MAG_FILTER, myBuffer.filter); - p_glTexParameteri(myBuffer.target, GL_TEXTURE_MIN_FILTER, myBuffer.filter); - - // The filtering has changed, so redraw the entire screen - myRedrawEntireFrame = true; -*/ -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FBSurface* FrameBufferGL::createSurface(int w, int h, bool isBase) const { @@ -561,8 +511,6 @@ FBSurfaceGL::FBSurfaceGL(FrameBufferGL& buffer, myWidth(scaleWidth), myHeight(scaleHeight) { -//cerr << " FBSurfaceGL::FBSurfaceGL: w = " << baseWidth << ", h = " << baseHeight << " : " << this << endl; - // Fill buffer struct with valid data // This changes depending on the texturing used myTexCoord[0] = 0.0f; @@ -612,8 +560,6 @@ FBSurfaceGL::FBSurfaceGL(FrameBufferGL& buffer, // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FBSurfaceGL::~FBSurfaceGL() { -//cerr << " FBSurfaceGL::~FBSurfaceGL(): myTexID = " << myTexID << " @ " << this << endl; - if(myTexture) SDL_FreeSurface(myTexture); @@ -720,6 +666,8 @@ void FBSurfaceGL::drawBitmap(uInt32* bitmap, Int32 tx, Int32 ty, // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FBSurfaceGL::addDirtyRect(uInt32 x, uInt32 y, uInt32 w, uInt32 h) { + // OpenGL mode doesn't make use of dirty rectangles + // It's faster to just update the entire surface mySurfaceIsDirty = true; } @@ -740,8 +688,6 @@ void FBSurfaceGL::setPos(uInt32 x, uInt32 y) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FBSurfaceGL::setWidth(uInt32 w) { -//cerr << " BEFORE: w = " << myWidth <<", texcoord[2] = " << myTexCoord[2] << endl; - // This method can't be used with 'scaled' surface (aka TIA surfaces) // That shouldn't really matter, though, as all the UI stuff isn't scaled, // and it's the only thing that uses it @@ -751,15 +697,11 @@ void FBSurfaceGL::setWidth(uInt32 w) myTexCoord[2] = (GLfloat) myWidth; else myTexCoord[2] = (GLfloat) myWidth / myTexWidth; - -//cerr << " AFTER: w = " << myWidth <<", texcoord[2] = " << myTexCoord[2] << endl; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FBSurfaceGL::setHeight(uInt32 h) { -//cerr << " BEFORE: h = " << myHeight <<", texcoord[3] = " << myTexCoord[3] << endl; - // This method can't be used with 'scaled' surface (aka TIA surfaces) // That shouldn't really matter, though, as all the UI stuff isn't scaled, // and it's the only thing that uses it @@ -769,22 +711,13 @@ void FBSurfaceGL::setHeight(uInt32 h) myTexCoord[3] = (GLfloat) myHeight; else myTexCoord[3] = (GLfloat) myHeight / myTexHeight; - -//cerr << " AFTER: h = " << myHeight <<", texcoord[3] = " << myTexCoord[3] << endl; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FBSurfaceGL::translateCoords(Int32& x, Int32& y) const { -#if 1 - x = x - myXOrig; - y = y - myYOrig; -#else - // Wow, what a mess :) - const GUI::Rect& image = myFB.imageRect(); - x = (Int32) ((x - myXOrig - image.x()) / myWidthScaleFactor); - y = (Int32) ((y - myXOrig - image.y()) / myHeightScaleFactor); -#endif + x -= myXOrig; + y -= myYOrig; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -792,8 +725,6 @@ void FBSurfaceGL::update() { if(mySurfaceIsDirty) { -//cerr << " --> FBSurfaceGL::update(): w = " << myWidth << ", h = " << myHeight << endl; - // Texturemap complete texture to surface so we have free scaling // and antialiasing p_glBindTexture(myTexTarget, myTexID); @@ -823,8 +754,6 @@ void FBSurfaceGL::update() void FBSurfaceGL::free() { p_glDeleteTextures(1, &myTexID); - -//cerr << " ==> FBSurfaceGL::free(): myTexID = " << myTexID << " @ " << this << endl; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -839,26 +768,10 @@ void FBSurfaceGL::reload() // Basically, all that needs to be done is to re-call glTexImage2D with a // new texture ID, so that's what we do here -/* - // Create an OpenGL texture from the SDL texture - const string& filter = myOSystem->settings().getString("gl_filter"); - if(filter == "linear") - { - myBuffer.filter = GL_LINEAR; - myFilterParamName = "GL_LINEAR"; - } - else if(filter == "nearest") - { - myBuffer.filter = GL_NEAREST; - myFilterParamName = "GL_NEAREST"; - } -*/ p_glGenTextures(1, &myTexID); p_glBindTexture(myTexTarget, myTexID); p_glTexParameteri(myTexTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); p_glTexParameteri(myTexTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -// p_glTexParameteri(myTexTarget, GL_TEXTURE_MIN_FILTER, myBuffer.filter); -// p_glTexParameteri(myTexTarget, GL_TEXTURE_MAG_FILTER, myBuffer.filter); p_glTexParameteri(myTexTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST); p_glTexParameteri(myTexTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -868,10 +781,35 @@ void FBSurfaceGL::reload() GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, myTexture->pixels); p_glEnable(myTexTarget); - -//cerr << " ==> FBSurfaceGL::reload(): myTexID = " << myTexID << " @ " << this << endl; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void FBSurfaceGL::setFilter(const string& name) +{ + // We only do GL_NEAREST or GL_LINEAR for now + GLint filter = GL_NEAREST; + if(name == "linear") + filter = GL_LINEAR; + + p_glBindTexture(myTexTarget, myTexID); + p_glTexParameteri(myTexTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + p_glTexParameteri(myTexTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + p_glTexParameteri(myTexTarget, GL_TEXTURE_MIN_FILTER, filter); + p_glTexParameteri(myTexTarget, GL_TEXTURE_MAG_FILTER, filter); + + // The filtering has changed, so redraw the entire screen + mySurfaceIsDirty = true; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool FrameBufferGL::myLibraryLoaded = false; + +#endif // DISPLAY_OPENGL + + + + + #if 0 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GUI::Surface* FrameBufferGL::createSurface(int width, int height) const @@ -884,7 +822,6 @@ GUI::Surface* FrameBufferGL::createSurface(int width, int height) const return data ? new GUI::Surface(width, height, data) : NULL; } - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBufferGL::drawSurface(const GUI::Surface* surface, Int32 x, Int32 y) { @@ -912,8 +849,3 @@ void FrameBufferGL::bytesToSurface(GUI::Surface* surface, int row, *pixels++ = SDL_MapRGB(s->format, data[c], data[c+1], data[c+2]); } #endif - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool FrameBufferGL::myLibraryLoaded = false; - -#endif // DISPLAY_OPENGL diff --git a/stella/src/common/FrameBufferGL.hxx b/stella/src/common/FrameBufferGL.hxx index 3e3b8a8cc..8558d43a6 100644 --- a/stella/src/common/FrameBufferGL.hxx +++ b/stella/src/common/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.65 2008-12-27 23:27:32 stephena Exp $ +// $Id: FrameBufferGL.hxx,v 1.66 2008-12-28 21:01:55 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_GL_HXX @@ -35,7 +35,7 @@ class FBSurfaceGL; This class implements an SDL OpenGL framebuffer. @author Stephen Anthony - @version $Id: FrameBufferGL.hxx,v 1.65 2008-12-27 23:27:32 stephena Exp $ + @version $Id: FrameBufferGL.hxx,v 1.66 2008-12-28 21:01:55 stephena Exp $ */ class FrameBufferGL : public FrameBuffer { @@ -126,12 +126,6 @@ class FrameBufferGL : public FrameBuffer */ FBSurface* createSurface(int w, int h, bool useBase = false) const; - /** - Switches between the two filtering options in OpenGL. - Currently, these are GL_NEAREST and GL_LINEAR. - */ - void toggleFilter(); - /** This method should be called anytime the MediaSource needs to be redrawn to the screen (full indicating that a full redraw is required). @@ -168,9 +162,6 @@ class FrameBufferGL : public FrameBuffer // The name of the texture filtering to use string myFilterParamName; - // The amount by which to scale the image in each dimension in fullscreen mode - float myWidthScaleFactor, myHeightScaleFactor; - // Optional GL extensions that may increase performance bool myHaveTexRectEXT; @@ -185,7 +176,7 @@ class FrameBufferGL : public FrameBuffer A surface suitable for OpenGL rendering mode. @author Stephen Anthony - @version $Id: FrameBufferGL.hxx,v 1.65 2008-12-27 23:27:32 stephena Exp $ + @version $Id: FrameBufferGL.hxx,v 1.66 2008-12-28 21:01:55 stephena Exp $ */ class FBSurfaceGL : public FBSurface { @@ -215,6 +206,8 @@ class FBSurfaceGL : public FBSurface void reload(); private: + void setFilter(const string& name); + inline void* pixels() const { return myTexture->pixels; } inline uInt32 pitch() const { return myPitch; } @@ -231,15 +224,12 @@ class FBSurfaceGL : public FBSurface SDL_Surface* myTexture; GLuint myTexID; + GLenum myTexTarget; GLsizei myTexWidth; GLsizei myTexHeight; GLfloat myTexCoord[4]; - GLenum myTexTarget; - GLint myTexFilter; - - uInt32 myXOrig, myYOrig; - uInt32 myWidth, myHeight; + uInt32 myXOrig, myYOrig, myWidth, myHeight; bool mySurfaceIsDirty; uInt32 myPitch; }; diff --git a/stella/src/common/FrameBufferSoft.cxx b/stella/src/common/FrameBufferSoft.cxx index 06779c163..33fe2f574 100644 --- a/stella/src/common/FrameBufferSoft.cxx +++ b/stella/src/common/FrameBufferSoft.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: FrameBufferSoft.cxx,v 1.85 2008-12-27 23:27:32 stephena Exp $ +// $Id: FrameBufferSoft.cxx,v 1.86 2008-12-28 21:01:55 stephena Exp $ //============================================================================ #include @@ -102,19 +102,32 @@ bool FrameBufferSoft::setVidMode(VideoMode& mode) myFormat = myScreen->format; myBytesPerPixel = myFormat->BytesPerPixel; + // Make sure drawMediaSource() knows which renderer to use + switch(myBytesPerPixel) + { + case 2: // 16-bit + myPitch = myScreen->pitch >> 1; + myRenderType = myUsePhosphor ? kPhosphor_16 : kSoftZoom_16; + break; + case 3: // 24-bit + myPitch = myScreen->pitch; + myRenderType = myUsePhosphor ? kPhosphor_24 : kSoftZoom_24; + break; + case 4: // 32-bit + myPitch = myScreen->pitch >> 2; + myRenderType = myUsePhosphor ? kPhosphor_32 : kSoftZoom_32; + break; + } + myBaseOffset = mode.image_y * myPitch + mode.image_x; + // If software mode can open the given screen, it will always be in the // requested format, or not at all; we only update mode when the screen // is successfully created mode.screen_w = myScreen->w; mode.screen_h = myScreen->h; myZoomLevel = mode.gfxmode.zoom; - // FIXME - look at gfxmode directly - // Make sure drawMediaSource() knows which renderer to use - stateChanged(myOSystem->eventHandler().state()); - myBaseOffset = mode.image_y * myPitch + mode.image_x; - // Erase old rects, since they've probably been scaled for // a different sized screen myRectList->start(); @@ -376,11 +389,12 @@ void FrameBufferSoft::postFrameUpdate() { if(myTiaDirty && !myInUIMode) { - SDL_Flip(myScreen); + SDL_UpdateRect(myScreen, 0, 0, 0, 0); myTiaDirty = false; } else if(myRectList->numRects() > 0) { +//myRectList->print(myScreen->w, myScreen->h); SDL_UpdateRects(myScreen, myRectList->numRects(), myRectList->rects()); } myRectList->start(); @@ -392,37 +406,26 @@ void FrameBufferSoft::enablePhosphor(bool enable, int blend) myUsePhosphor = enable; myPhosphorBlend = blend; - stateChanged(myOSystem->eventHandler().state()); + // Make sure drawMediaSource() knows which renderer to use + switch(myBytesPerPixel) + { + case 2: // 16-bit + myRenderType = myUsePhosphor ? kPhosphor_16 : kSoftZoom_16; + break; + case 3: // 24-bit + myRenderType = myUsePhosphor ? kPhosphor_24 : kSoftZoom_24; + break; + case 4: // 32-bit + myRenderType = myUsePhosphor ? kPhosphor_32 : kSoftZoom_32; + break; + } + myRedrawEntireFrame = true; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBufferSoft::stateChanged(EventHandler::State state) { - if(!myScreen) - return; - - myInUIMode = (state == EventHandler::S_LAUNCHER || - state == EventHandler::S_DEBUGGER); - - // Make sure drawMediaSource() knows which renderer to use - switch(myBytesPerPixel) - { - case 2: // 16-bit - myPitch = myScreen->pitch >> 1; - myRenderType = myUsePhosphor ? kPhosphor_16 : kSoftZoom_16; - break; - case 3: // 24-bit - myPitch = myScreen->pitch; - myRenderType = myUsePhosphor ? kPhosphor_24 : kSoftZoom_24; - break; - case 4: // 32-bit - myPitch = myScreen->pitch >> 2; - myRenderType = myUsePhosphor ? kPhosphor_32 : kSoftZoom_32; - break; - } - - // Have the changes take effect - refresh(); + myRedrawEntireFrame = true; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -594,7 +597,7 @@ void FBSurfaceSoft::drawChar(const GUI::Font* font, uInt8 chr, case 2: { // Get buffer position where upper-left pixel of the character will be drawn - uInt16* buffer = (uInt16*) mySurface->pixels + + uInt16* buffer = (uInt16*) mySurface->pixels + myBaseOffset + (ty + desc.ascent - bby - bbh) * myPitch + tx + bbx; @@ -654,7 +657,7 @@ void FBSurfaceSoft::drawChar(const GUI::Font* font, uInt8 chr, case 4: { // Get buffer position where upper-left pixel of the character will be drawn - uInt32* buffer = (uInt32*) mySurface->pixels + + uInt32* buffer = (uInt32*) mySurface->pixels + myBaseOffset + (ty + desc.ascent - bby - bbh) * myPitch + tx + bbx; @@ -702,6 +705,8 @@ void FBSurfaceSoft::drawBitmap(uInt32* bitmap, Int32 tx, Int32 ty, // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FBSurfaceSoft::addDirtyRect(uInt32 x, uInt32 y, uInt32 w, uInt32 h) { +//cerr << " -> addDirtyRect: x = " << x << ", y = " << y << ", w = " << w << ", h = " << h << endl; + // Base surfaces use dirty-rectangle updates, since they can be quite // large, and updating the entire surface each frame would be too slow // Non-base surfaces are usually smaller, and can be updated entirely @@ -824,6 +829,9 @@ void FBSurfaceSoft::recalc() } + + + #if 0 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBufferSoft::drawSurface(const GUI::Surface* surface, Int32 x, Int32 y) diff --git a/stella/src/common/FrameBufferSoft.hxx b/stella/src/common/FrameBufferSoft.hxx index 0f9dcd352..3090e01d6 100644 --- a/stella/src/common/FrameBufferSoft.hxx +++ b/stella/src/common/FrameBufferSoft.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: FrameBufferSoft.hxx,v 1.58 2008-12-27 23:27:32 stephena Exp $ +// $Id: FrameBufferSoft.hxx,v 1.59 2008-12-28 21:01:55 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_SOFT_HXX @@ -32,7 +32,7 @@ class RectList; This class implements an SDL software framebuffer. @author Stephen Anthony - @version $Id: FrameBufferSoft.hxx,v 1.58 2008-12-27 23:27:32 stephena Exp $ + @version $Id: FrameBufferSoft.hxx,v 1.59 2008-12-28 21:01:55 stephena Exp $ */ class FrameBufferSoft : public FrameBuffer { @@ -114,12 +114,6 @@ class FrameBufferSoft : public FrameBuffer */ FBSurface* createSurface(int w, int h, bool useBase = false) const; - /** - Switches between the filtering options in software mode. - Currently, none exist. - */ - void toggleFilter() { /* No filter added yet */ } - /** This method should be called anytime the MediaSource needs to be redrawn to the screen (full indicating that a full redraw is required). @@ -172,7 +166,7 @@ class FrameBufferSoft : public FrameBuffer A surface suitable for software rendering mode. @author Stephen Anthony - @version $Id: FrameBufferSoft.hxx,v 1.58 2008-12-27 23:27:32 stephena Exp $ + @version $Id: FrameBufferSoft.hxx,v 1.59 2008-12-28 21:01:55 stephena Exp $ */ class FBSurfaceSoft : public FBSurface { diff --git a/stella/src/common/RectList.cxx b/stella/src/common/RectList.cxx index 73e0b545c..3681a53c9 100644 --- a/stella/src/common/RectList.cxx +++ b/stella/src/common/RectList.cxx @@ -13,10 +13,11 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: RectList.cxx,v 1.4 2008-02-06 13:45:19 stephena Exp $ +// $Id: RectList.cxx,v 1.5 2008-12-28 21:01:55 stephena Exp $ //============================================================================ #include +#include "bspf.hxx" #include "RectList.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -74,3 +75,21 @@ void RectList::start() { currentRect = 0; } + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void RectList::print(int boundWidth, int boundHeight) +{ + cerr << "RectList: rects = " << numRects() << endl; + for(Uint32 i = 0; i < currentRect; ++i) + { + cerr << "Rect " << i << endl + << " x = " << rectArray[i].x << endl + << " y = " << rectArray[i].y << endl + << " w = " << rectArray[i].w << endl + << " h = " << rectArray[i].h << endl; + if((rectArray[i].x + rectArray[i].w) > boundWidth || + (rectArray[i].y + rectArray[i].h) > boundHeight) + cerr << " TOO LARGE" << endl; + cerr << endl; + } +} diff --git a/stella/src/common/RectList.hxx b/stella/src/common/RectList.hxx index f369b6ce3..20ce7d983 100644 --- a/stella/src/common/RectList.hxx +++ b/stella/src/common/RectList.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: RectList.hxx,v 1.4 2008-02-06 13:45:19 stephena Exp $ +// $Id: RectList.hxx,v 1.5 2008-12-28 21:01:55 stephena Exp $ //============================================================================ #ifndef RECTLIST_HXX @@ -24,7 +24,7 @@ class RectList { public: - RectList(Uint32 size = 512); + RectList(Uint32 size = 256); ~RectList(); void add(SDL_Rect* rect); @@ -32,6 +32,7 @@ class RectList SDL_Rect* rects(); Uint32 numRects(); void start(); + void print(int boundWidth, int boundHeight); private: Uint32 currentSize, currentRect; diff --git a/stella/src/emucore/FrameBuffer.cxx b/stella/src/emucore/FrameBuffer.cxx index b018e79dc..c73cd3fc5 100644 --- a/stella/src/emucore/FrameBuffer.cxx +++ b/stella/src/emucore/FrameBuffer.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: FrameBuffer.cxx,v 1.148 2008-12-27 23:27:32 stephena Exp $ +// $Id: FrameBuffer.cxx,v 1.149 2008-12-28 21:01:55 stephena Exp $ //============================================================================ #include @@ -60,7 +60,6 @@ FrameBuffer::~FrameBuffer(void) // Free all allocated surfaces while(!mySurfaceList.empty()) { -//cerr << " delete id = " << (*mySurfaceList.begin()).first << ", " << (*mySurfaceList.begin()).second << endl; delete (*mySurfaceList.begin()).second; mySurfaceList.erase(mySurfaceList.begin()); } @@ -88,8 +87,6 @@ bool FrameBuffer::initialize(const string& title, uInt32 width, uInt32 height) mySDLFlags = 0; #endif -cerr << " <== FrameBuffer::initialize: w = " << width << ", h = " << height << endl; - // Set the available video modes for this framebuffer setAvailableVidModes(width, height); @@ -372,8 +369,6 @@ inline void FrameBuffer::drawMessage() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBuffer::refresh() { -cerr << "FrameBuffer::refresh() : " << myOSystem->eventHandler().state() << endl; - // This method partly duplicates the behaviour in ::update() // Here, however, make sure to redraw *all* surfaces applicable to the // current EventHandler state @@ -592,8 +587,8 @@ bool FrameBuffer::changeVidMode(int direction) if(saveModeChange) myOSystem->settings().setString("tia_filter", vidmode.gfxmode.name); - myOSystem->eventHandler().handleResizeEvent(); - refresh(); // _FIXME myOSystem->eventHandler().refreshDisplay(true); + myOSystem->eventHandler().handleResizeEvent(); // FIXME - this may no longer be required + refresh(); } else return false; diff --git a/stella/src/emucore/FrameBuffer.hxx b/stella/src/emucore/FrameBuffer.hxx index 6166ae784..d0a03d39b 100644 --- a/stella/src/emucore/FrameBuffer.hxx +++ b/stella/src/emucore/FrameBuffer.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: FrameBuffer.hxx,v 1.108 2008-12-27 23:27:32 stephena Exp $ +// $Id: FrameBuffer.hxx,v 1.109 2008-12-28 21:01:55 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_HXX @@ -91,7 +91,7 @@ enum { turn drawn here as well. @author Stephen Anthony - @version $Id: FrameBuffer.hxx,v 1.108 2008-12-27 23:27:32 stephena Exp $ + @version $Id: FrameBuffer.hxx,v 1.109 2008-12-28 21:01:55 stephena Exp $ */ class FrameBuffer { @@ -365,11 +365,6 @@ class FrameBuffer */ virtual FBSurface* createSurface(int w, int h, bool useBase = false) const = 0; - /** - Switches between the filtering options in the video subsystem. - */ - virtual void toggleFilter() = 0; - /** This method should be called anytime the MediaSource needs to be redrawn to the screen (full indicating that a full redraw is required). @@ -549,7 +544,7 @@ class FrameBuffer FrameBuffer type. @author Stephen Anthony - @version $Id: FrameBuffer.hxx,v 1.108 2008-12-27 23:27:32 stephena Exp $ + @version $Id: FrameBuffer.hxx,v 1.109 2008-12-28 21:01:55 stephena Exp $ */ // Text alignment modes for drawString() enum TextAlignment { diff --git a/stella/src/emucore/Settings.cxx b/stella/src/emucore/Settings.cxx index ec72556cf..fb9e0f8fe 100644 --- a/stella/src/emucore/Settings.cxx +++ b/stella/src/emucore/Settings.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: Settings.cxx,v 1.149 2008-07-22 14:54:39 stephena Exp $ +// $Id: Settings.cxx,v 1.150 2008-12-28 21:01:55 stephena Exp $ //============================================================================ #include @@ -41,7 +41,7 @@ Settings::Settings(OSystem* osystem) // OpenGL specific options setInternal("gl_filter", "nearest"); setInternal("gl_aspect", "100"); - setInternal("gl_fsmax", "never"); + setInternal("gl_fsmax", "false"); setInternal("gl_lib", "libGL.so"); setInternal("gl_vsync", "false"); setInternal("gl_texrect", "false"); @@ -226,10 +226,6 @@ void Settings::validate() i = getInt("gl_aspect"); if(i < 50 || i > 100) setInternal("gl_aspect", "100"); - - s = getString("gl_fsmax"); - if(s != "never" && s != "ui" && s != "tia" && s != "always") - setInternal("gl_fsmax", "never"); #endif #ifdef SOUND_SUPPORT @@ -287,8 +283,7 @@ void Settings::usage() << " nearest Normal scaling (GL_NEAREST)\n" << " linear Blurred scaling (GL_LINEAR)\n" << " -gl_aspect Scale the width by the given percentage\n" - << " -gl_fsmax Stretch GL image in fullscreen emulation mode\n" << " -gl_vsync <1|0> Enable synchronize to vertical blank interrupt\n" << " -gl_texrect <1|0> Enable GL_TEXTURE_RECTANGLE extension\n" << endl diff --git a/stella/src/gui/Dialog.cxx b/stella/src/gui/Dialog.cxx index af2a3314c..387e439ab 100644 --- a/stella/src/gui/Dialog.cxx +++ b/stella/src/gui/Dialog.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: Dialog.cxx,v 1.72 2008-12-27 23:27:32 stephena Exp $ +// $Id: Dialog.cxx,v 1.73 2008-12-28 21:01:55 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -249,7 +249,7 @@ void Dialog::drawDialog() if(_dirty) { - cerr << "Dialog::drawDialog(): w = " << _w << ", h = " << _h << " @ " << &s << endl << endl; +// cerr << "Dialog::drawDialog(): w = " << _w << ", h = " << _h << " @ " << &s << endl << endl; s.fillRect(_x+1, _y+1, _w-2, _h-2, kDlgColor); s.box(_x, _y, _w, _h, kColor, kShadowColor); diff --git a/stella/src/gui/DialogContainer.cxx b/stella/src/gui/DialogContainer.cxx index 27f49266a..e46a05dea 100644 --- a/stella/src/gui/DialogContainer.cxx +++ b/stella/src/gui/DialogContainer.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: DialogContainer.cxx,v 1.50 2008-12-27 23:27:32 stephena Exp $ +// $Id: DialogContainer.cxx,v 1.51 2008-12-28 21:01:55 stephena Exp $ //============================================================================ #include "OSystem.hxx" @@ -28,8 +28,7 @@ DialogContainer::DialogContainer(OSystem* osystem) : myOSystem(osystem), myBaseDialog(NULL), - myTime(0), - myRefreshFlag(false) + myTime(0) { reset(); } @@ -98,7 +97,6 @@ void DialogContainer::draw(bool full) myDialogStack[i]->setDirty(); myDialogStack[i]->drawDialog(); } - myRefreshFlag = false; } else if(!myDialogStack.empty()) { @@ -109,7 +107,6 @@ void DialogContainer::draw(bool full) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void DialogContainer::addDialog(Dialog* d) { -cerr << "DialogContainer::addDialog : w = " << d->getWidth() << ", h = " << d->getHeight() << endl; myDialogStack.push(d); d->open(); diff --git a/stella/src/gui/DialogContainer.hxx b/stella/src/gui/DialogContainer.hxx index efdbe38fb..178742d79 100644 --- a/stella/src/gui/DialogContainer.hxx +++ b/stella/src/gui/DialogContainer.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: DialogContainer.hxx,v 1.25 2008-12-27 23:27:32 stephena Exp $ +// $Id: DialogContainer.hxx,v 1.26 2008-12-28 21:01:55 stephena Exp $ //============================================================================ #ifndef DIALOG_CONTAINER_HXX @@ -36,7 +36,7 @@ class OSystem; a stack, and handles their events. @author Stephen Anthony - @version $Id: DialogContainer.hxx,v 1.25 2008-12-27 23:27:32 stephena Exp $ + @version $Id: DialogContainer.hxx,v 1.26 2008-12-28 21:01:55 stephena Exp $ */ class DialogContainer { @@ -143,11 +143,6 @@ class DialogContainer */ void reStack(); - /** - Redraw all dialogs on the stack. - */ - void refresh() { myRefreshFlag = true; } - /** Return the bottom-most dialog of this container. */ @@ -171,9 +166,6 @@ class DialogContainer // Indicates the most current time (in milliseconds) as set by updateTime() int myTime; - // Indicates a full refresh of all dialogs is required - bool myRefreshFlag; - // For continuous 'key down' events struct { int ascii; diff --git a/stella/src/gui/OptionsDialog.cxx b/stella/src/gui/OptionsDialog.cxx index bc9b9b929..6888b60ca 100644 --- a/stella/src/gui/OptionsDialog.cxx +++ b/stella/src/gui/OptionsDialog.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: OptionsDialog.cxx,v 1.74 2008-12-26 21:39:17 stephena Exp $ +// $Id: OptionsDialog.cxx,v 1.75 2008-12-28 21:01:55 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -119,7 +119,7 @@ OptionsDialog::OptionsDialog(OSystem* osystem, DialogContainer* parent, int x = 0, y = 0, w, h; // Now create all the dialogs attached to each menu button - w = 410; h = 300; + w = 410; h = 275; myVideoDialog = new VideoDialog(osystem, parent, font, x, y, w, h); w = 285; h = 200; diff --git a/stella/src/gui/RomInfoWidget.cxx b/stella/src/gui/RomInfoWidget.cxx index cf9c7b171..a875391dd 100644 --- a/stella/src/gui/RomInfoWidget.cxx +++ b/stella/src/gui/RomInfoWidget.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: RomInfoWidget.cxx,v 1.9 2008-06-19 12:01:31 stephena Exp $ +// $Id: RomInfoWidget.cxx,v 1.10 2008-12-28 21:01:55 stephena Exp $ //============================================================================ #include @@ -68,6 +68,7 @@ void RomInfoWidget::loadConfig() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void RomInfoWidget::setProperties(const Properties& props) { +return; myHaveProperties = true; myProperties = props; @@ -82,6 +83,7 @@ void RomInfoWidget::setProperties(const Properties& props) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void RomInfoWidget::clearProperties() { +return; myHaveProperties = myDrawSurface = false; // Decide whether the information should be shown immediately diff --git a/stella/src/gui/VideoDialog.cxx b/stella/src/gui/VideoDialog.cxx index 2b41b6131..b4f55245b 100644 --- a/stella/src/gui/VideoDialog.cxx +++ b/stella/src/gui/VideoDialog.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: VideoDialog.cxx,v 1.57 2008-12-26 21:39:17 stephena Exp $ +// $Id: VideoDialog.cxx,v 1.58 2008-12-28 21:01:55 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -109,18 +109,6 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent, wid.push_back(myGLFilterPopup); ypos += lineHeight + 4; - // GL FS stretch - items.clear(); - items.push_back("Never", "never"); - items.push_back("UI mode", "ui"); - items.push_back("TIA mode", "tia"); - items.push_back("Always", "always"); - myGLStretchPopup = new PopUpWidget(this, font, xpos, ypos, pwidth, lineHeight, - items, "GL Stretch: ", lwidth); - wid.push_back(myGLStretchPopup); - ypos += lineHeight + 4; - - // GL aspect ratio myAspectRatioSlider = new SliderWidget(this, font, xpos, ypos, pwidth, lineHeight, @@ -160,6 +148,12 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent, wid.push_back(myColorLossCheckbox); ypos += lineHeight + 4; + // GL FS stretch + myGLStretchCheckbox = new CheckboxWidget(this, font, xpos, ypos, + "GL FS Stretch"); + wid.push_back(myGLStretchCheckbox); + ypos += lineHeight + 4; + // Use sync to vblank in OpenGL myUseVSyncCheckbox = new CheckboxWidget(this, font, xpos, ypos, "GL VSync"); @@ -190,9 +184,9 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent, // Disable certain functions when we know they aren't present #ifndef DISPLAY_GL myGLFilterPopup->clearFlags(WIDGET_ENABLED); - myGLStretchPopup->clearFlags(WIDGET_ENABLED); myAspectRatioSlider->clearFlags(WIDGET_ENABLED); myAspectRatioLabel->clearFlags(WIDGET_ENABLED); + myGLStretchCheckbox->clearFlags(WIDGET_ENABLED); myUseVSyncCheckbox->clearFlags(WIDGET_ENABLED); #endif #ifndef WINDOWED_SUPPORT @@ -242,11 +236,6 @@ void VideoDialog::loadConfig() instance().settings().getString("gl_filter"), "linear"); myGLFilterPopup->setEnabled(gl); - // GL stretch setting - myGLStretchPopup->setSelected( - instance().settings().getString("gl_fsmax"), "never"); - myGLStretchPopup->setEnabled(gl); - // GL aspect ratio setting myAspectRatioSlider->setValue(instance().settings().getInt("gl_aspect")); myAspectRatioSlider->setEnabled(gl); @@ -267,6 +256,9 @@ void VideoDialog::loadConfig() // PAL color-loss effect myColorLossCheckbox->setState(instance().settings().getBool("colorloss")); + // GL stretch setting (item is enabled/disabled in ::handleFullscreenChange) + myGLStretchCheckbox->setState(instance().settings().getBool("gl_fsmax")); + // Use sync to vertical blank (GL mode only) myUseVSyncCheckbox->setState(instance().settings().getBool("gl_vsync")); myUseVSyncCheckbox->setEnabled(gl); @@ -293,9 +285,6 @@ void VideoDialog::saveConfig() // GL Filter setting instance().settings().setString("gl_filter", myGLFilterPopup->getSelectedTag()); - // GL stretch setting - instance().settings().setString("gl_fsmax", myGLStretchPopup->getSelectedTag()); - // GL aspect ratio setting instance().settings().setString("gl_aspect", myAspectRatioLabel->getLabel()); @@ -315,6 +304,9 @@ void VideoDialog::saveConfig() // PAL color-loss effect instance().settings().setBool("colorloss", myColorLossCheckbox->getState()); + // GL stretch setting + instance().settings().setBool("gl_fsmax", myGLStretchCheckbox->getState()); + // Use sync to vertical blank (GL mode only) instance().settings().setBool("gl_vsync", myUseVSyncCheckbox->getState()); @@ -338,7 +330,6 @@ void VideoDialog::setDefaults() myTIAPalettePopup->setSelected("standard", ""); myFSResPopup->setSelected("auto", ""); myGLFilterPopup->setSelected("linear", ""); - myGLStretchPopup->setSelected("never", ""); myAspectRatioSlider->setValue(100); myAspectRatioLabel->setLabel("100"); myFrameRateSlider->setValue(0); @@ -346,6 +337,7 @@ void VideoDialog::setDefaults() myFullscreenCheckbox->setState(false); myColorLossCheckbox->setState(false); + myGLStretchCheckbox->setState(false); myUseVSyncCheckbox->setState(true); myCenterCheckbox->setState(true); @@ -359,6 +351,10 @@ void VideoDialog::handleFullscreenChange(bool enable) #ifdef WINDOWED_SUPPORT myFSResPopup->setEnabled(enable); + // GL stretch is only enabled in OpenGL mode + myGLStretchCheckbox->setEnabled( + enable && instance().frameBuffer().type() == kGLBuffer); + _dirty = true; #endif } diff --git a/stella/src/gui/VideoDialog.hxx b/stella/src/gui/VideoDialog.hxx index c1ff4c387..20d48d67a 100644 --- a/stella/src/gui/VideoDialog.hxx +++ b/stella/src/gui/VideoDialog.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: VideoDialog.hxx,v 1.25 2008-12-26 21:39:17 stephena Exp $ +// $Id: VideoDialog.hxx,v 1.26 2008-12-28 21:01:55 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -56,7 +56,6 @@ class VideoDialog : public Dialog PopUpWidget* myTIAPalettePopup; PopUpWidget* myFSResPopup; PopUpWidget* myGLFilterPopup; - PopUpWidget* myGLStretchPopup; SliderWidget* myAspectRatioSlider; StaticTextWidget* myAspectRatioLabel; @@ -64,6 +63,7 @@ class VideoDialog : public Dialog StaticTextWidget* myFrameRateLabel; CheckboxWidget* myFullscreenCheckbox; CheckboxWidget* myColorLossCheckbox; + CheckboxWidget* myGLStretchCheckbox; CheckboxWidget* myUseVSyncCheckbox; CheckboxWidget* myCenterCheckbox;