Re-added OpenGL aspect ratio setting; it ended up being much easier to do

than I thought.

Bumped version number to 2.4.1_cvs.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1356 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2007-08-21 17:58:26 +00:00
parent 664c6de88c
commit 88e76cfd6e
8 changed files with 99 additions and 44 deletions

View File

@ -604,15 +604,14 @@
GL_LINEAR introduces blurring.</td> GL_LINEAR introduces blurring.</td>
</tr> </tr>
<!--
<tr> <tr>
<td><pre>-gl_aspect &lt;number&gt;</pre></td> <td><pre>-gl_aspect &lt;number&gt;</pre></td>
<td>OpenGL mode only. Specify the aspect ratio of the window. Normal <td>OpenGL mode only. Specify the amount (as a percentage) to scale the
TV mode would be 4:3, so you would specify 1.3333. But since image width. Since many video modes do not use square pixels, you can
many video modes do not use square pixels, you may have to try reduce width until the pixels appear square. Allowable values are
different values. I find 1.6 or 1.7 gives the most authentic look.</td> 50 - 100; I find 85 - 90 gives the most authentic look.</td>
</tr> </tr>
-->
<tr> <tr>
<td><pre>-gl_fsmax &lt;never|always|ui|tia&gt;</pre></td> <td><pre>-gl_fsmax &lt;never|always|ui|tia&gt;</pre></td>
<td>OpenGL mode only. Stretch fullscreen image while in the given mode.</td> <td>OpenGL mode only. Stretch fullscreen image while in the given mode.</td>

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: FrameBufferGL.cxx,v 1.87 2007-06-20 16:33:22 stephena Exp $ // $Id: FrameBufferGL.cxx,v 1.88 2007-08-21 17:58:25 stephena Exp $
//============================================================================ //============================================================================
#ifdef DISPLAY_OPENGL #ifdef DISPLAY_OPENGL
@ -89,7 +89,8 @@ FrameBufferGL::FrameBufferGL(OSystem* osystem)
myTexture(NULL), myTexture(NULL),
myHaveTexRectEXT(false), myHaveTexRectEXT(false),
myFilterParamName("GL_NEAREST"), myFilterParamName("GL_NEAREST"),
myScaleFactor(1.0), myWidthScaleFactor(1.0),
myHeightScaleFactor(1.0),
myDirtyFlag(true) myDirtyFlag(true)
{ {
} }
@ -240,6 +241,10 @@ string FrameBufferGL::about()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool FrameBufferGL::setVidMode(VideoMode mode) bool FrameBufferGL::setVidMode(VideoMode mode)
{ {
bool inUIMode =
myOSystem->eventHandler().state() == EventHandler::S_LAUNCHER ||
myOSystem->eventHandler().state() == EventHandler::S_DEBUGGER;
myScreenDim.x = myScreenDim.y = 0; myScreenDim.x = myScreenDim.y = 0;
myScreenDim.w = mode.screen_w; myScreenDim.w = mode.screen_w;
myScreenDim.h = mode.screen_h; myScreenDim.h = mode.screen_h;
@ -249,15 +254,16 @@ bool FrameBufferGL::setVidMode(VideoMode mode)
myImageDim.w = mode.image_w; myImageDim.w = mode.image_w;
myImageDim.h = mode.image_h; myImageDim.h = mode.image_h;
// Activate stretching if its been requested and it makes sense to do so // Normally, we just scale to the given zoom level
myScaleFactor = 1.0; myWidthScaleFactor = (float) mode.zoom;
myHeightScaleFactor = (float) mode.zoom;
// Activate stretching if its been requested in fullscreen mode
float stretchFactor = 1.0;
if(fullScreen() && (mode.image_w < mode.screen_w) && if(fullScreen() && (mode.image_w < mode.screen_w) &&
(mode.image_h < mode.screen_h)) (mode.image_h < mode.screen_h))
{ {
const string& gl_fsmax = myOSystem->settings().getString("gl_fsmax"); const string& gl_fsmax = myOSystem->settings().getString("gl_fsmax");
bool inUIMode =
myOSystem->eventHandler().state() == EventHandler::S_LAUNCHER ||
myOSystem->eventHandler().state() == EventHandler::S_DEBUGGER;
// Only stretch in certain modes // Only stretch in certain modes
if((gl_fsmax == "always") || if((gl_fsmax == "always") ||
@ -268,24 +274,34 @@ bool FrameBufferGL::setVidMode(VideoMode mode)
float scaleY = float(myImageDim.h) / myScreenDim.h; float scaleY = float(myImageDim.h) / myScreenDim.h;
if(scaleX > scaleY) if(scaleX > scaleY)
myScaleFactor = float(myScreenDim.w) / myImageDim.w; stretchFactor = float(myScreenDim.w) / myImageDim.w;
else else
myScaleFactor = float(myScreenDim.h) / myImageDim.h; stretchFactor = float(myScreenDim.h) / myImageDim.h;
}
}
myWidthScaleFactor *= stretchFactor;
myHeightScaleFactor *= stretchFactor;
myImageDim.w = (Uint16) (myScaleFactor * myImageDim.w); // Activate aspect ratio correction in TIA mode
myImageDim.h = (Uint16) (myScaleFactor * myImageDim.h); int iaspect = myOSystem->settings().getInt("gl_aspect");
float aspectFactor = 1.0;
if(!inUIMode && iaspect < 100)
{
aspectFactor = float(iaspect) / 100.0;
myWidthScaleFactor *= aspectFactor;
}
// Now re-calculate the dimensions
myImageDim.w = (Uint16) (stretchFactor * aspectFactor * myImageDim.w);
myImageDim.h = (Uint16) (stretchFactor * myImageDim.h);
if(!fullScreen()) myScreenDim.w = myImageDim.w;
myImageDim.x = (myScreenDim.w - myImageDim.w) / 2; myImageDim.x = (myScreenDim.w - myImageDim.w) / 2;
myImageDim.y = (myScreenDim.h - myImageDim.h) / 2; myImageDim.y = (myScreenDim.h - myImageDim.h) / 2;
}
}
// Combine the zoom level and scaler into one quantity
myScaleFactor *= (float) mode.zoom;
GLdouble orthoWidth = (GLdouble) GLdouble orthoWidth = (GLdouble)
(myImageDim.w / myScaleFactor); (myImageDim.w / myWidthScaleFactor);
GLdouble orthoHeight = (GLdouble) GLdouble orthoHeight = (GLdouble)
(myImageDim.h / myScaleFactor); (myImageDim.h / myHeightScaleFactor);
SDL_GL_SetAttribute( SDL_GL_RED_SIZE, myRGB[0] ); SDL_GL_SetAttribute( SDL_GL_RED_SIZE, myRGB[0] );
SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, myRGB[1] ); SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, myRGB[1] );
@ -565,8 +581,8 @@ void FrameBufferGL::drawBitmap(uInt32* bitmap, Int32 tx, Int32 ty,
void FrameBufferGL::translateCoords(Int32& x, Int32& y) void FrameBufferGL::translateCoords(Int32& x, Int32& y)
{ {
// Wow, what a mess :) // Wow, what a mess :)
x = (Int32) ((x - myImageDim.x) / myScaleFactor); x = (Int32) ((x - myImageDim.x) / myWidthScaleFactor);
y = (Int32) ((y - myImageDim.y) / myScaleFactor); y = (Int32) ((y - myImageDim.y) / myHeightScaleFactor);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: FrameBufferGL.hxx,v 1.44 2007-06-20 16:33:22 stephena Exp $ // $Id: FrameBufferGL.hxx,v 1.45 2007-08-21 17:58:25 stephena Exp $
//============================================================================ //============================================================================
#ifndef FRAMEBUFFER_GL_HXX #ifndef FRAMEBUFFER_GL_HXX
@ -36,7 +36,7 @@ class GUI::Font;
This class implements an SDL OpenGL framebuffer. This class implements an SDL OpenGL framebuffer.
@author Stephen Anthony @author Stephen Anthony
@version $Id: FrameBufferGL.hxx,v 1.44 2007-06-20 16:33:22 stephena Exp $ @version $Id: FrameBufferGL.hxx,v 1.45 2007-08-21 17:58:25 stephena Exp $
*/ */
class FrameBufferGL : public FrameBuffer class FrameBufferGL : public FrameBuffer
{ {
@ -253,10 +253,10 @@ class FrameBufferGL : public FrameBuffer
// The name of the texture filtering to use // The name of the texture filtering to use
string myFilterParamName; string myFilterParamName;
// The amount by which to scale the imagein fullscreen mode // The amount by which to scale the image in each dimension in fullscreen mode
float myScaleFactor; float myWidthScaleFactor, myHeightScaleFactor;
// TODO - will be removed when textured dirty rect support is added // Indicates that the texture has been modified, and should be redrawn
bool myDirtyFlag; bool myDirtyFlag;
// Indicates if the OpenGL functions have been properly loaded // Indicates if the OpenGL functions have been properly loaded

View File

@ -13,13 +13,13 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: Version.hxx,v 1.27 2007-08-17 16:12:50 stephena Exp $ // $Id: Version.hxx,v 1.28 2007-08-21 17:58:25 stephena Exp $
//============================================================================ //============================================================================
#ifndef VERSION_HXX #ifndef VERSION_HXX
#define VERSION_HXX #define VERSION_HXX
#define STELLA_BASE_VERSION "2.4" #define STELLA_BASE_VERSION "2.4.1_cvs"
#ifdef NIGHTLY_BUILD #ifdef NIGHTLY_BUILD
#define STELLA_VERSION STELLA_BASE_VERSION "pre-" NIGHTLY_BUILD #define STELLA_VERSION STELLA_BASE_VERSION "pre-" NIGHTLY_BUILD

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: Settings.cxx,v 1.123 2007-08-15 17:43:51 stephena Exp $ // $Id: Settings.cxx,v 1.124 2007-08-21 17:58:25 stephena Exp $
//============================================================================ //============================================================================
#include <cassert> #include <cassert>
@ -37,6 +37,7 @@ Settings::Settings(OSystem* osystem)
setInternal("video", "soft"); setInternal("video", "soft");
setInternal("gl_filter", "nearest"); setInternal("gl_filter", "nearest");
setInternal("gl_aspect", "100");
setInternal("gl_fsmax", "never"); setInternal("gl_fsmax", "never");
setInternal("gl_lib", "libGL.so"); setInternal("gl_lib", "libGL.so");
setInternal("gl_vsync", "false"); setInternal("gl_vsync", "false");
@ -203,6 +204,10 @@ void Settings::validate()
if(s != "linear" && s != "nearest") if(s != "linear" && s != "nearest")
setInternal("gl_filter", "nearest"); setInternal("gl_filter", "nearest");
i = getInt("gl_aspect");
if(i < 50 || i > 100)
setInternal("gl_aspect", "100");
s = getString("gl_fsmax"); s = getString("gl_fsmax");
if(s != "never" && s != "ui" && s != "tia" && s != "always") if(s != "never" && s != "ui" && s != "tia" && s != "always")
setInternal("gl_fsmax", "never"); setInternal("gl_fsmax", "never");
@ -264,6 +269,7 @@ void Settings::usage()
<< " -gl_filter <type> Type is one of the following:\n" << " -gl_filter <type> Type is one of the following:\n"
<< " nearest Normal scaling (GL_NEAREST)\n" << " nearest Normal scaling (GL_NEAREST)\n"
<< " linear Blurred scaling (GL_LINEAR)\n" << " linear Blurred scaling (GL_LINEAR)\n"
<< " -gl_aspect <number> Scale the width by the given percentage\n"
<< " -gl_fsmax <never|always| Stretch GL image in fullscreen mode\n" << " -gl_fsmax <never|always| Stretch GL image in fullscreen mode\n"
<< " ui|tia\n" << " ui|tia\n"
<< " -gl_vsync <1|0> Enable synchronize to vertical blank interrupt\n" << " -gl_vsync <1|0> Enable synchronize to vertical blank interrupt\n"

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: OptionsDialog.cxx,v 1.57 2007-08-15 17:43:51 stephena Exp $ // $Id: OptionsDialog.cxx,v 1.58 2007-08-21 17:58:25 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -107,7 +107,7 @@ OptionsDialog::OptionsDialog(OSystem* osystem, DialogContainer* parent,
int x = 0, y = 0, w, h; int x = 0, y = 0, w, h;
// Now create all the dialogs attached to each menu button // Now create all the dialogs attached to each menu button
w = 230; h = 165; w = 230; h = 185;
myVideoDialog = new VideoDialog(myOSystem, parent, font, x, y, w, h); myVideoDialog = new VideoDialog(myOSystem, parent, font, x, y, w, h);
w = 200; h = 140; w = 200; h = 140;

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: VideoDialog.cxx,v 1.45 2007-08-05 15:34:26 stephena Exp $ // $Id: VideoDialog.cxx,v 1.46 2007-08-21 17:58:25 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -115,6 +115,18 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent,
ypos + 1, ypos + 1,
15, fontHeight, "", kTextAlignLeft); 15, fontHeight, "", kTextAlignLeft);
myTIAZoomLabel->setFlags(WIDGET_CLEARBG); myTIAZoomLabel->setFlags(WIDGET_CLEARBG);
ypos += lineHeight + 4;
// GL aspect ratio
myAspectRatioSlider =
new SliderWidget(this, font, xpos, ypos, pwidth, lineHeight,
"GL Aspect: ", lwidth, kAspectRatioChanged);
myAspectRatioSlider->setMinValue(50); myAspectRatioSlider->setMaxValue(100);
wid.push_back(myAspectRatioSlider);
myAspectRatioLabel =
new StaticTextWidget(this, font, xpos + myAspectRatioSlider->getWidth() + 4,
ypos + 1, 15, fontHeight, "", kTextAlignLeft);
myAspectRatioLabel->setFlags(WIDGET_CLEARBG);
// Move over to the next column // Move over to the next column
xpos += 115; ypos = 10; xpos += 115; ypos = 10;
@ -186,6 +198,8 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent,
// Disable certain functions when we know they aren't present // Disable certain functions when we know they aren't present
#ifndef DISPLAY_GL #ifndef DISPLAY_GL
myFilterPopup->clearFlags(WIDGET_ENABLED); myFilterPopup->clearFlags(WIDGET_ENABLED);
myAspectRatioSlider->clearFlags(WIDGET_ENABLED);
myAspectRatioLabel->clearFlags(WIDGET_ENABLED);
myFSStretchPopup->clearFlags(WIDGET_ENABLED); myFSStretchPopup->clearFlags(WIDGET_ENABLED);
myUseVSyncCheckbox->clearFlags(WIDGET_ENABLED); myUseVSyncCheckbox->clearFlags(WIDGET_ENABLED);
#endif #endif
@ -253,6 +267,12 @@ void VideoDialog::loadConfig()
myTIAZoomSlider->setValue(i); myTIAZoomSlider->setValue(i);
myTIAZoomLabel->setLabel(s); myTIAZoomLabel->setLabel(s);
// GL aspect ratio setting
s = instance()->settings().getString("gl_aspect");
i = instance()->settings().getInt("gl_aspect");
myAspectRatioSlider->setValue(i);
myAspectRatioLabel->setLabel(s);
// FIXME - what to do with this?? // FIXME - what to do with this??
myFrameRateSlider->setEnabled(false); myFrameRateSlider->setEnabled(false);
@ -324,6 +344,10 @@ void VideoDialog::saveConfig()
s = myTIAZoomLabel->getLabel(); s = myTIAZoomLabel->getLabel();
instance()->settings().setString("zoom_tia", s); instance()->settings().setString("zoom_tia", s);
// GL aspect ratio setting
s = myAspectRatioLabel->getLabel();
instance()->settings().setString("gl_aspect", s);
// Framerate FIXME - I haven't figured out what to do with this yet // Framerate FIXME - I haven't figured out what to do with this yet
/* /*
i = myFrameRateSlider->getValue(); i = myFrameRateSlider->getValue();
@ -363,6 +387,8 @@ void VideoDialog::setDefaults()
myUIZoomLabel->setLabel("2"); myUIZoomLabel->setLabel("2");
myTIAZoomSlider->setValue(2); myTIAZoomSlider->setValue(2);
myTIAZoomLabel->setLabel("2"); myTIAZoomLabel->setLabel("2");
myAspectRatioSlider->setValue(100);
myAspectRatioLabel->setLabel("100");
// myFrameRateSlider->setValue(0); // myFrameRateSlider->setValue(0);
// myFrameRateLabel->setLabel("0"); // myFrameRateLabel->setLabel("0");
@ -385,7 +411,8 @@ void VideoDialog::handleRendererChange(int item)
myFilterPopup->setEnabled(gl); myFilterPopup->setEnabled(gl);
myFSStretchPopup->setEnabled(gl); myFSStretchPopup->setEnabled(gl);
myFSStretchPopup->setEnabled(gl); myAspectRatioSlider->setEnabled(gl);
myAspectRatioLabel->setEnabled(gl);
myUseVSyncCheckbox->setEnabled(gl); myUseVSyncCheckbox->setEnabled(gl);
_dirty = true; _dirty = true;
@ -434,6 +461,10 @@ void VideoDialog::handleCommand(CommandSender* sender, int cmd,
myTIAZoomLabel->setValue(myTIAZoomSlider->getValue()); myTIAZoomLabel->setValue(myTIAZoomSlider->getValue());
break; break;
case kAspectRatioChanged:
myAspectRatioLabel->setValue(myAspectRatioSlider->getValue());
break;
case kFrameRateChanged: case kFrameRateChanged:
myFrameRateLabel->setValue(myFrameRateSlider->getValue()); myFrameRateLabel->setValue(myFrameRateSlider->getValue());
break; break;

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: VideoDialog.hxx,v 1.21 2007-06-21 12:27:00 stephena Exp $ // $Id: VideoDialog.hxx,v 1.22 2007-08-21 17:58:26 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -53,6 +53,8 @@ class VideoDialog : public Dialog
PopUpWidget* myRendererPopup; PopUpWidget* myRendererPopup;
PopUpWidget* myFilterPopup; PopUpWidget* myFilterPopup;
PopUpWidget* myFSStretchPopup; PopUpWidget* myFSStretchPopup;
SliderWidget* myAspectRatioSlider;
StaticTextWidget* myAspectRatioLabel;
PopUpWidget* myPalettePopup; PopUpWidget* myPalettePopup;
PopUpWidget* myFSResPopup; PopUpWidget* myFSResPopup;
SliderWidget* myUIZoomSlider; SliderWidget* myUIZoomSlider;
@ -69,6 +71,7 @@ class VideoDialog : public Dialog
enum { enum {
kRendererChanged = 'VDrd', kRendererChanged = 'VDrd',
kAspectRatioChanged = 'VDar',
kUIZoomChanged = 'VDui', kUIZoomChanged = 'VDui',
kTIAZoomChanged = 'VDti', kTIAZoomChanged = 'VDti',
kFrameRateChanged = 'VDfr', kFrameRateChanged = 'VDfr',