From e6e91f3522c6317b6dc6a607b52e213c7d8e0f88 Mon Sep 17 00:00:00 2001 From: stephena Date: Mon, 30 May 2005 16:25:47 +0000 Subject: [PATCH] Made sure aspect ratio is taken into account when checking for maximum size of SDL screen. Still TODO is change OpenGL mode so that aspect ratio and non-integral scaling are not used when in debugger or launcher mode (ie, when we know the absolute coordinates of the screen). We do this since those modes are mostly GUI-based, and the GUI doesn't look quite right when using OpenGL scaling. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@456 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba --- stella/src/common/FrameBufferGL.cxx | 25 ++++++++++--------------- stella/src/common/FrameBufferGL.hxx | 9 +++++++-- stella/src/common/FrameBufferSoft.cxx | 9 ++++++++- stella/src/common/FrameBufferSoft.hxx | 9 +++++++-- stella/src/emucore/FrameBuffer.cxx | 13 +++++++------ stella/src/emucore/FrameBuffer.hxx | 22 +++++++--------------- 6 files changed, 46 insertions(+), 41 deletions(-) diff --git a/stella/src/common/FrameBufferGL.cxx b/stella/src/common/FrameBufferGL.cxx index 8bc8d4814..b05b5dc06 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.25 2005-05-29 16:09:21 stephena Exp $ +// $Id: FrameBufferGL.cxx,v 1.26 2005-05-30 16:25:46 stephena Exp $ //============================================================================ #include @@ -55,18 +55,6 @@ bool FrameBufferGL::initSubsystem() { mySDLFlags |= SDL_OPENGL; - // Get the aspect ratio for the display - // Since the display is already doubled horizontally, we half the - // ratio that is provided - if(theUseAspectRatioFlag) - { - theAspectRatio = myOSystem->settings().getFloat("gl_aspect") / 2; - if(theAspectRatio <= 0.0) - theAspectRatio = 1.0; - } - else - theAspectRatio = 1.0; - // Set up the OpenGL attributes myDepth = SDL_GetVideoInfo()->vfmt->BitsPerPixel; switch(myDepth) @@ -157,6 +145,14 @@ bool FrameBufferGL::initSubsystem() return true; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void FrameBufferGL::setAspectRatio() +{ + theAspectRatio = myOSystem->settings().getFloat("gl_aspect") / 2; + if(theAspectRatio <= 0.0) + theAspectRatio = 1.0; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool FrameBufferGL::createScreen() { @@ -508,8 +504,7 @@ void FrameBufferGL::setDimensions(GLdouble* orthoWidth, GLdouble* orthoHeight) scaleX = float(myImageDim.w) / myScreenDim.w; scaleY = float(myImageDim.h) / myScreenDim.h; - // Figure out which dimension is closest to the 10% mark, - // and calculate the scaling required to bring it to exactly 10% +cerr << "scaleX = " << scaleX << ", scaleY = " << scaleY << endl; if(scaleX > scaleY) myFSScaleFactor = float(myScreenDim.w) / myImageDim.w; else diff --git a/stella/src/common/FrameBufferGL.hxx b/stella/src/common/FrameBufferGL.hxx index edd58dbcf..d82d03246 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.13 2005-05-19 19:43:38 stephena Exp $ +// $Id: FrameBufferGL.hxx,v 1.14 2005-05-30 16:25:46 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_GL_HXX @@ -34,7 +34,7 @@ class OSystem; This class implements an SDL OpenGL framebuffer. @author Stephen Anthony - @version $Id: FrameBufferGL.hxx,v 1.13 2005-05-19 19:43:38 stephena Exp $ + @version $Id: FrameBufferGL.hxx,v 1.14 2005-05-30 16:25:46 stephena Exp $ */ class FrameBufferGL : public FrameBuffer { @@ -58,6 +58,11 @@ class FrameBufferGL : public FrameBuffer */ virtual bool initSubsystem(); + /** + This routine is called to set the aspect ratio of the screen. + */ + virtual void setAspectRatio(); + /** This routine is called whenever the screen needs to be recreated. It updates the global screen variable. diff --git a/stella/src/common/FrameBufferSoft.cxx b/stella/src/common/FrameBufferSoft.cxx index 594fe87d1..4e78d0e12 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.22 2005-05-29 16:09:21 stephena Exp $ +// $Id: FrameBufferSoft.cxx,v 1.23 2005-05-30 16:25:46 stephena Exp $ //============================================================================ #include @@ -71,6 +71,13 @@ bool FrameBufferSoft::initSubsystem() return true; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void FrameBufferSoft::setAspectRatio() +{ + // Aspect ratio correction not yet available in software mode + theAspectRatio = 1.0; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool FrameBufferSoft::createScreen() { diff --git a/stella/src/common/FrameBufferSoft.hxx b/stella/src/common/FrameBufferSoft.hxx index 4d347f1bc..cbd48ab2d 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.13 2005-05-16 00:02:31 stephena Exp $ +// $Id: FrameBufferSoft.hxx,v 1.14 2005-05-30 16:25:46 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_SOFT_HXX @@ -34,7 +34,7 @@ class RectList; This class implements an SDL software framebuffer. @author Stephen Anthony - @version $Id: FrameBufferSoft.hxx,v 1.13 2005-05-16 00:02:31 stephena Exp $ + @version $Id: FrameBufferSoft.hxx,v 1.14 2005-05-30 16:25:46 stephena Exp $ */ class FrameBufferSoft : public FrameBuffer { @@ -58,6 +58,11 @@ class FrameBufferSoft : public FrameBuffer */ virtual bool initSubsystem(); + /** + This routine is called to set the aspect ratio of the screen. + */ + virtual void setAspectRatio(); + /** This routine is called whenever the screen needs to be recreated. It updates the global screen variable. diff --git a/stella/src/emucore/FrameBuffer.cxx b/stella/src/emucore/FrameBuffer.cxx index 42dc2a30a..6a0199693 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.40 2005-05-28 17:25:41 stephena Exp $ +// $Id: FrameBuffer.cxx,v 1.41 2005-05-30 16:25:46 stephena Exp $ //============================================================================ #include @@ -41,7 +41,6 @@ FrameBuffer::FrameBuffer(OSystem* osystem) theZoomLevel(2), theMaxZoomLevel(2), theAspectRatio(1.0), - theUseAspectRatioFlag(true), myFrameRate(0), myPauseStatus(false), theOverlayChangedIndicator(false), @@ -132,8 +131,10 @@ void FrameBuffer::initialize(const string& title, uInt32 width, uInt32 height, // Set window title setWindowTitle(title); - // Indicate whether we want to use aspect ratio correction - theUseAspectRatioFlag = useAspect; + // Get the aspect ratio for the display if it's been enabled + theAspectRatio = 1.0; + if(useAspect) + setAspectRatio(); // Get the maximum size of a window for the current desktop theMaxZoomLevel = maxWindowSizeForScreen(); @@ -420,7 +421,7 @@ uInt32 FrameBuffer::maxWindowSizeForScreen() { uInt32 sWidth = myDesktopDim.w; uInt32 sHeight = myDesktopDim.h; - uInt32 multiplier = sWidth / myBaseDim.w; + uInt32 multiplier = 10; // If screenwidth or height could not be found, use default zoom value if(sWidth == 0 || sHeight == 0) @@ -430,7 +431,7 @@ uInt32 FrameBuffer::maxWindowSizeForScreen() while(!found && (multiplier > 0)) { // Figure out the desired size of the window - uInt32 width = myBaseDim.w * multiplier; + uInt32 width = (uInt32) (myBaseDim.w * multiplier * theAspectRatio); uInt32 height = myBaseDim.h * multiplier; if((width < sWidth) && (height < sHeight)) diff --git a/stella/src/emucore/FrameBuffer.hxx b/stella/src/emucore/FrameBuffer.hxx index 1e90a5773..c1f438a85 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.35 2005-05-28 17:25:41 stephena Exp $ +// $Id: FrameBuffer.hxx,v 1.36 2005-05-30 16:25:47 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_HXX @@ -40,7 +40,7 @@ class OSystem; All GUI elements (ala ScummVM) are drawn here as well. @author Stephen Anthony - @version $Id: FrameBuffer.hxx,v 1.35 2005-05-28 17:25:41 stephena Exp $ + @version $Id: FrameBuffer.hxx,v 1.36 2005-05-30 16:25:47 stephena Exp $ */ class FrameBuffer { @@ -187,16 +187,6 @@ class FrameBuffer */ bool fullScreen(); - /** - Answers the current zoom level of the framebuffer image in the X axis. - */ - inline const float zoomLevelX() { return theZoomLevel * theAspectRatio; } - - /** - Answers the current zoom level of the framebuffer image in the X axis. - */ - inline const float zoomLevelY() { return (float) theZoomLevel; } - /** Calculate the maximum window size that the current screen can hold. Only works in X11/Win32 for now, otherwise always return 4. @@ -252,6 +242,11 @@ class FrameBuffer */ virtual bool initSubsystem() = 0; + /** + This routine is called to set the aspect ratio of the screen. + */ + virtual void setAspectRatio() = 0; + /** This routine is called whenever the screen needs to be recreated. It updates the global screen variable. @@ -415,9 +410,6 @@ class FrameBuffer // The aspect ratio of the window float theAspectRatio; - // Indicates whether to use aspect ratio correction - bool theUseAspectRatioFlag; - // The font object to use StellaFont* myFont;