Added ability to dynamically switch between software and OpenGL rendering

modes while still in the emulation (without restarting the currently
running ROM).  Added the 'Alt g' key to do this, but it can also be
activated from the VideoDialog menu.

Except for the 'framerate' option, all video related changes can now be
done dynamically from within Stella.  They can still be specified on the
commandline, but that's no longer required (the framerate option will
be fixed shortly).


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@401 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2005-04-29 19:05:06 +00:00
parent 56c69d428a
commit b026a1e247
13 changed files with 254 additions and 144 deletions

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.19 2005-04-24 20:36:26 stephena Exp $ // $Id: FrameBufferGL.cxx,v 1.20 2005-04-29 19:05:04 stephena Exp $
//============================================================================ //============================================================================
#include <SDL.h> #include <SDL.h>
@ -62,15 +62,6 @@ bool FrameBufferGL::initSubsystem()
if(theAspectRatio <= 0.0) if(theAspectRatio <= 0.0)
theAspectRatio = 1.0; theAspectRatio = 1.0;
// Get the maximum size of a window for THIS screen
theMaxZoomLevel = maxWindowSizeForScreen();
// Check to see if window size will fit in the screen
if((uInt32)myOSystem->settings().getInt("zoom") > theMaxZoomLevel)
theZoomLevel = theMaxZoomLevel;
else
theZoomLevel = myOSystem->settings().getInt("zoom");
// Set up the OpenGL attributes // Set up the OpenGL attributes
myDepth = SDL_GetVideoInfo()->vfmt->BitsPerPixel; myDepth = SDL_GetVideoInfo()->vfmt->BitsPerPixel;
switch(myDepth) switch(myDepth)
@ -132,12 +123,11 @@ bool FrameBufferGL::initSubsystem()
SDL_GL_GetAttribute( SDL_GL_ALPHA_SIZE, (int*)&myRGB[3] ); SDL_GL_GetAttribute( SDL_GL_ALPHA_SIZE, (int*)&myRGB[3] );
#ifndef TEXTURES_ARE_LOST #ifndef TEXTURES_ARE_LOST
// Create the texture surface and texture fonts // Create the texture surface
createTextures(); createTextures();
#endif #endif
// Set up the palette *after* we know the color components // Set up the palette *after* we know the color components and the textures
// and the textures
setupPalette(); setupPalette();
// Show some OpenGL info // Show some OpenGL info

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: FrameBufferSoft.cxx,v 1.18 2005-04-24 20:36:35 stephena Exp $ // $Id: FrameBufferSoft.cxx,v 1.19 2005-04-29 19:05:04 stephena Exp $
//============================================================================ //============================================================================
#include <SDL.h> #include <SDL.h>
@ -55,15 +55,6 @@ bool FrameBufferSoft::initSubsystem()
return false; return false;
} }
// Get the maximum size of a window for the desktop
theMaxZoomLevel = maxWindowSizeForScreen();
// Check to see if window size will fit in the screen
if((uInt32)myOSystem->settings().getInt("zoom") > theMaxZoomLevel)
theZoomLevel = theMaxZoomLevel;
else
theZoomLevel = myOSystem->settings().getInt("zoom");
// Create the screen // Create the screen
if(!createScreen()) if(!createScreen())
return false; return false;

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: mainSDL.cxx,v 1.31 2005-04-28 19:28:32 stephena Exp $ // $Id: mainSDL.cxx,v 1.32 2005-04-29 19:05:05 stephena Exp $
//============================================================================ //============================================================================
#include <fstream> #include <fstream>
@ -74,9 +74,6 @@ static OSystem* theOSystem = (OSystem*) NULL;
// Pointer to the display object or the null pointer // Pointer to the display object or the null pointer
static EventHandler* theEventHandler = (EventHandler*) NULL; static EventHandler* theEventHandler = (EventHandler*) NULL;
// Pointer to the display object or the null pointer
static FrameBuffer* theDisplay = (FrameBuffer*) NULL;
// Pointer to the sound object or the null pointer // Pointer to the sound object or the null pointer
static Sound* theSound = (Sound*) NULL; static Sound* theSound = (Sound*) NULL;
@ -301,9 +298,6 @@ void Cleanup()
if(theSound) if(theSound)
delete theSound; delete theSound;
if(theDisplay)
delete theDisplay;
if(theEventHandler) if(theEventHandler)
delete theEventHandler; delete theEventHandler;
@ -370,30 +364,8 @@ int main(int argc, char* argv[])
// Request that the SDL window be centered, if possible // Request that the SDL window be centered, if possible
putenv("SDL_VIDEO_CENTERED=1"); putenv("SDL_VIDEO_CENTERED=1");
// Set the SDL_VIDEODRIVER environment variable, if possible // Create the SDL framebuffer
if(theSettings->getString("video_driver") != "") if(!theOSystem->createFrameBuffer())
{
ostringstream buf;
buf << "SDL_VIDEODRIVER=" << theSettings->getString("video_driver");
putenv((char*) buf.str().c_str());
buf.str("");
buf << "Video driver: " << theSettings->getString("video_driver");
ShowInfo(buf.str());
}
// Create an SDL window
string videodriver = theSettings->getString("video");
if(videodriver == "soft")
theDisplay = new FrameBufferSoft(theOSystem);
#ifdef DISPLAY_OPENGL
else if(videodriver == "gl")
theDisplay = new FrameBufferGL(theOSystem);
#endif
else // a driver that doesn't exist was requested, so use software mode
theDisplay = new FrameBufferSoft(theOSystem);
if(!theDisplay)
{ {
cerr << "ERROR: Couldn't set up display.\n"; cerr << "ERROR: Couldn't set up display.\n";
Cleanup(); Cleanup();

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: Console.cxx,v 1.46 2005-04-21 21:18:37 stephena Exp $ // $Id: Console.cxx,v 1.47 2005-04-29 19:05:05 stephena Exp $
//============================================================================ //============================================================================
#include <assert.h> #include <assert.h>
@ -174,11 +174,7 @@ Console::Console(const uInt8* image, uInt32 size, OSystem* osystem)
// Initialize the framebuffer interface. // Initialize the framebuffer interface.
// This must be done *after* a reset, since it needs updated values. // This must be done *after* a reset, since it needs updated values.
ostringstream title; initializeVideo();
title << "Stella: \"" << myProperties.get("Cartridge.Name") << "\"";
myOSystem->frameBuffer().initialize(title.str(),
myMediaSource->width() << 1,
myMediaSource->height());
// Initialize the sound interface. // Initialize the sound interface.
uInt32 soundFrameRate = (myProperties.get("Display.Format") == "PAL") ? 50 : 60; uInt32 soundFrameRate = (myProperties.get("Display.Format") == "PAL") ? 50 : 60;
@ -325,6 +321,15 @@ void Console::saveProperties(string filename, bool merge)
} }
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Console::initializeVideo()
{
string title = "Stella: \"" + myProperties.get("Cartridge.Name") + "\"";
myOSystem->frameBuffer().initialize(title,
myMediaSource->width() << 1,
myMediaSource->height());
}
#ifdef DEVELOPER_SUPPORT #ifdef DEVELOPER_SUPPORT
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Console::changeXStart(const uInt32 direction) void Console::changeXStart(const uInt32 direction)

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: Console.hxx,v 1.26 2005-04-21 21:18:37 stephena Exp $ // $Id: Console.hxx,v 1.27 2005-04-29 19:05:05 stephena Exp $
//============================================================================ //============================================================================
#ifndef CONSOLE_HXX #ifndef CONSOLE_HXX
@ -37,7 +37,7 @@ class OSystem;
This class represents the entire game console. This class represents the entire game console.
@author Bradford W. Mott @author Bradford W. Mott
@version $Id: Console.hxx,v 1.26 2005-04-21 21:18:37 stephena Exp $ @version $Id: Console.hxx,v 1.27 2005-04-29 19:05:05 stephena Exp $
*/ */
class Console class Console
{ {
@ -153,6 +153,11 @@ class Console
*/ */
void saveProperties(string filename, bool merge = false); void saveProperties(string filename, bool merge = false);
/**
Initialize this video subsystem wrt this class.
*/
void initializeVideo();
#ifdef DEVELOPER_SUPPORT #ifdef DEVELOPER_SUPPORT
public: public:
/** /**

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: EventHandler.cxx,v 1.44 2005-04-21 21:18:37 stephena Exp $ // $Id: EventHandler.cxx,v 1.45 2005-04-29 19:05:05 stephena Exp $
//============================================================================ //============================================================================
#include <algorithm> #include <algorithm>
@ -149,6 +149,10 @@ void EventHandler::poll() // FIXME - add modifiers for OSX
case SDLK_f: case SDLK_f:
myOSystem->frameBuffer().toggleFilter(); myOSystem->frameBuffer().toggleFilter();
break; break;
case SDLK_g:
myOSystem->toggleFrameBuffer();
break;
} }
} }
else if(mod & KMOD_CTRL && state) else if(mod & KMOD_CTRL && state)

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: FrameBuffer.cxx,v 1.27 2005-04-24 01:57:47 stephena Exp $ // $Id: FrameBuffer.cxx,v 1.28 2005-04-29 19:05:05 stephena Exp $
//============================================================================ //============================================================================
#include <sstream> #include <sstream>
@ -26,7 +26,6 @@
#include "Settings.hxx" #include "Settings.hxx"
#include "MediaSrc.hxx" #include "MediaSrc.hxx"
#include "FrameBuffer.hxx" #include "FrameBuffer.hxx"
#include "FontData.hxx"
#include "StellaFont.hxx" #include "StellaFont.hxx"
#include "GuiUtils.hxx" #include "GuiUtils.hxx"
#include "Menu.hxx" #include "Menu.hxx"
@ -49,9 +48,6 @@ FrameBuffer::FrameBuffer(OSystem* osystem)
myMenuRedraws(2), myMenuRedraws(2),
myNumRedraws(0) myNumRedraws(0)
{ {
// Add the framebuffer to the system
myOSystem->attach(this);
// Fill the GUI colors array // Fill the GUI colors array
// The specific video subsystem will know what to do with it // The specific video subsystem will know what to do with it
uInt8 colors[5][3] = { uInt8 colors[5][3] = {
@ -67,20 +63,7 @@ FrameBuffer::FrameBuffer(OSystem* osystem)
myGUIColors[i][j] = colors[i][j]; myGUIColors[i][j] = colors[i][j];
// Create a font to draw text // Create a font to draw text
const FontDesc desc = { myFont = new StellaFont(this);
"04b-16b-10",
9,
10,
8,
33,
94,
_font_bits,
0, /* no encode table*/
_sysfont_width,
33,
sizeof(_font_bits)/sizeof(uInt16)
};
myFont = new StellaFont(this, desc);
myBaseDim.x = myBaseDim.y = myBaseDim.w = myBaseDim.h = 0; myBaseDim.x = myBaseDim.y = myBaseDim.w = myBaseDim.h = 0;
myImageDim = myScreenDim = myDesktopDim = myBaseDim; myImageDim = myScreenDim = myDesktopDim = myBaseDim;
@ -110,39 +93,50 @@ void FrameBuffer::initialize(const string& title, uInt32 width, uInt32 height)
if(SDL_Init(initflags) < 0) if(SDL_Init(initflags) < 0)
return; return;
// Calculate the desktop size
myDesktopDim.w = myDesktopDim.h = 0;
// Get the system-specific WM information
SDL_SysWMinfo myWMInfo;
SDL_VERSION(&myWMInfo.version);
if(SDL_GetWMInfo(&myWMInfo) > 0)
{
#if defined(UNIX)
if(myWMInfo.subsystem == SDL_SYSWM_X11)
{
myWMInfo.info.x11.lock_func();
myDesktopDim.w = DisplayWidth(myWMInfo.info.x11.display,
DefaultScreen(myWMInfo.info.x11.display));
myDesktopDim.h = DisplayHeight(myWMInfo.info.x11.display,
DefaultScreen(myWMInfo.info.x11.display));
myWMInfo.info.x11.unlock_func();
}
#elif defined(WIN32)
myDesktopDim.w = (uInt16) GetSystemMetrics(SM_CXSCREEN);
myDesktopDim.h = (uInt16) GetSystemMetrics(SM_CYSCREEN);
#elif defined(MAC_OSX)
// FIXME - add OSX Desktop code here (I don't think SDL supports it yet)
#endif
}
setWindowIcon(); setWindowIcon();
} }
// Calculate the desktop size
myDesktopDim.w = myDesktopDim.h = 0;
// Get the system-specific WM information
SDL_SysWMinfo myWMInfo;
SDL_VERSION(&myWMInfo.version);
if(SDL_GetWMInfo(&myWMInfo) > 0)
{
#if defined(UNIX)
if(myWMInfo.subsystem == SDL_SYSWM_X11)
{
myWMInfo.info.x11.lock_func();
myDesktopDim.w = DisplayWidth(myWMInfo.info.x11.display,
DefaultScreen(myWMInfo.info.x11.display));
myDesktopDim.h = DisplayHeight(myWMInfo.info.x11.display,
DefaultScreen(myWMInfo.info.x11.display));
myWMInfo.info.x11.unlock_func();
}
#elif defined(WIN32)
myDesktopDim.w = (uInt16) GetSystemMetrics(SM_CXSCREEN);
myDesktopDim.h = (uInt16) GetSystemMetrics(SM_CYSCREEN);
#elif defined(MAC_OSX)
// FIXME - add OSX Desktop code here (I don't think SDL supports it yet)
#endif
}
// Set fullscreen flag
mySDLFlags = myOSystem->settings().getBool("fullscreen") ? SDL_FULLSCREEN : 0; mySDLFlags = myOSystem->settings().getBool("fullscreen") ? SDL_FULLSCREEN : 0;
// Set window title // Set window title
setWindowTitle(title); setWindowTitle(title);
// Get the maximum size of a window for the current desktop
theMaxZoomLevel = maxWindowSizeForScreen();
// Check to see if window size will fit in the screen
if((uInt32)myOSystem->settings().getInt("zoom") > theMaxZoomLevel)
theZoomLevel = theMaxZoomLevel;
else
theZoomLevel = myOSystem->settings().getInt("zoom");
// Initialize video subsystem // Initialize video subsystem
initSubsystem(); initSubsystem();

View File

@ -8,12 +8,12 @@
// SS SS tt ee ll ll aa aa // SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa // SSSS ttt eeeee llll llll aaaaa
// //
// Copyright (c) 1995-1999 by Bradford W. Mott // Copyright (c) 1995-2005 by Bradford W. Mott
// //
// 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: OSystem.cxx,v 1.6 2005-03-14 04:08:15 stephena Exp $ // $Id: OSystem.cxx,v 1.7 2005-04-29 19:05:05 stephena Exp $
//============================================================================ //============================================================================
#include <cassert> #include <cassert>
@ -21,6 +21,11 @@
#include <fstream> #include <fstream>
#include "FrameBuffer.hxx" #include "FrameBuffer.hxx"
#include "FrameBufferSoft.hxx"
#ifdef DISPLAY_OPENGL
#include "FrameBufferGL.hxx"
#endif
#include "Sound.hxx" #include "Sound.hxx"
#include "Settings.hxx" #include "Settings.hxx"
#include "PropsSet.hxx" #include "PropsSet.hxx"
@ -32,7 +37,13 @@
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
OSystem::OSystem() OSystem::OSystem()
: myMenu(NULL) : myEventHandler(NULL),
myFrameBuffer(NULL),
mySound(NULL),
mySettings(NULL),
myPropSet(NULL),
myConsole(NULL),
myMenu(NULL)
// myBrowser(NULL) // myBrowser(NULL)
{ {
// Create gui-related classes // Create gui-related classes
@ -48,6 +59,9 @@ OSystem::~OSystem()
// Remove any game console that is currently attached // Remove any game console that is currently attached
detachConsole(); detachConsole();
// OSystem takes responsibility for the framebuffer
delete myFrameBuffer;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -80,6 +94,93 @@ void OSystem::setConfigFiles(const string& userconfig,
myConfigInputFile = ""; myConfigInputFile = "";
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool OSystem::createFrameBuffer(bool showmessage)
{
// Set the SDL_VIDEODRIVER environment variable, if possible
string videodriver = mySettings->getString("video_driver");
if(videodriver != "")
{
string buf = "SDL_VIDEODRIVER=" + videodriver;
putenv((char*) buf.c_str());
if(mySettings->getBool("showinfo"))
{
buf = "Video driver: " + videodriver;
cout << buf << endl;
}
}
// Delete the old framebuffer
if(myFrameBuffer)
{
delete myFrameBuffer;
myFrameBuffer = NULL;
}
// And recreate a new one
string video = mySettings->getString("video");
if(video == "soft")
myFrameBuffer = new FrameBufferSoft(this);
#ifdef DISPLAY_OPENGL
else if(video == "gl")
myFrameBuffer = new FrameBufferGL(this);
#endif
else // a driver that doesn't exist was requested, so use software mode
myFrameBuffer = new FrameBufferSoft(this);
if(!myFrameBuffer)
return false;
// Re-initialize the framebuffer to current settings
switch(myEventHandler->state())
{
case EventHandler::S_EMULATE:
case EventHandler::S_MENU:
myConsole->initializeVideo();
if(showmessage)
{
if(video == "soft")
myFrameBuffer->showMessage("Software mode");
#ifdef DISPLAY_OPENGL
else if(video == "gl")
myFrameBuffer->showMessage("OpenGL mode");
#endif
else // a driver that doesn't exist was requested, so use software mode
myFrameBuffer->showMessage("Software mode");
}
break; // S_EMULATE, S_MENU
case EventHandler::S_BROWSER:
break; // S_BROWSER
case EventHandler::S_DEBUGGER:
break;
case EventHandler::S_NONE:
break;
}
return true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void OSystem::toggleFrameBuffer()
{
// First figure out which mode to switch to
string video = mySettings->getString("video");
if(video == "soft")
video = "gl";
else if(video == "gl")
video = "soft";
else // a driver that doesn't exist was requested, so use software mode
video = "soft";
// Update the settings and create the framebuffer
mySettings->setString("video", video);
createFrameBuffer(true); // show onscreen message
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
OSystem::OSystem(const OSystem& osystem) OSystem::OSystem(const OSystem& osystem)
{ {

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: OSystem.hxx,v 1.4 2005-03-10 22:59:40 stephena Exp $ // $Id: OSystem.hxx,v 1.5 2005-04-29 19:05:05 stephena Exp $
//============================================================================ //============================================================================
#ifndef OSYSTEM_HXX #ifndef OSYSTEM_HXX
@ -37,7 +37,7 @@ class Browser;
other objects belong. other objects belong.
@author Stephen Anthony @author Stephen Anthony
@version $Id: OSystem.hxx,v 1.4 2005-03-10 22:59:40 stephena Exp $ @version $Id: OSystem.hxx,v 1.5 2005-04-29 19:05:05 stephena Exp $
*/ */
class OSystem class OSystem
{ {
@ -232,6 +232,19 @@ class OSystem
*/ */
string configOutputFilename() { return myConfigOutputFile; } string configOutputFilename() { return myConfigOutputFile; }
/**
Creates the various framebuffers/renderers available in this system
(for now, that means either 'software' or 'opengl').
@return Success or failure of the framebuffer creation
*/
bool createFrameBuffer(bool showmessage = false);
/**
Switches between software and OpenGL framebuffer modes.
*/
void toggleFrameBuffer();
public: public:
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// The following methods are system-specific and must be implemented // The following methods are system-specific and must be implemented

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.11 2005-04-28 19:28:33 stephena Exp $ // $Id: OptionsDialog.cxx,v 1.12 2005-04-29 19:05:06 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
@ -78,7 +78,7 @@ OptionsDialog::OptionsDialog(OSystem* osystem)
uInt16 x, y, w, h; uInt16 x, y, 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 = 150; w = 230; h = 130;
checkBounds(fbWidth, fbHeight, &x, &y, &w, &h); checkBounds(fbWidth, fbHeight, &x, &y, &w, &h);
myVideoDialog = new VideoDialog(myOSystem, x, y, w, h); myVideoDialog = new VideoDialog(myOSystem, x, y, w, h);

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: StellaFont.cxx,v 1.1 2005-03-13 03:38:40 stephena Exp $ // $Id: StellaFont.cxx,v 1.2 2005-04-29 19:05:06 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
@ -21,8 +21,30 @@
#include "FrameBuffer.hxx" #include "FrameBuffer.hxx"
#include "GuiUtils.hxx" #include "GuiUtils.hxx"
#include "FontData.hxx"
#include "StellaFont.hxx" #include "StellaFont.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
StellaFont::StellaFont(FrameBuffer* buffer)
: myFrameBuffer(buffer)
{
const FontDesc desc = {
"04b-16b-10",
9,
10,
8,
33,
94,
_font_bits,
0, /* no encode table*/
_sysfont_width,
33,
sizeof(_font_bits)/sizeof(uInt16)
};
myFontDesc = desc;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Int32 StellaFont::getCharWidth(uInt8 chr) const Int32 StellaFont::getCharWidth(uInt8 chr) const
{ {

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: StellaFont.hxx,v 1.1 2005-03-13 03:38:41 stephena Exp $ // $Id: StellaFont.hxx,v 1.2 2005-04-29 19:05:06 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
@ -54,8 +54,7 @@ struct FontDesc
class StellaFont class StellaFont
{ {
public: public:
StellaFont(FrameBuffer* buffer, const FontDesc& desc) StellaFont(FrameBuffer* buffer);
: myFrameBuffer(buffer), myFontDesc(desc) {}
const FontDesc& desc() { return myFontDesc; } const FontDesc& desc() { return myFontDesc; }

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.6 2005-04-28 19:28:33 stephena Exp $ // $Id: VideoDialog.cxx,v 1.7 2005-04-29 19:05:06 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
@ -50,7 +50,7 @@ VideoDialog::VideoDialog(OSystem* osystem, uInt16 x, uInt16 y, uInt16 w, uInt16
// Video driver (query OSystem for what's supported) // Video driver (query OSystem for what's supported)
myDriverPopup = new PopUpWidget(this, xoff, yoff, woff, kLineHeight, myDriverPopup = new PopUpWidget(this, xoff, yoff, woff, kLineHeight,
"(*)Driver: ", labelWidth); "Driver: ", labelWidth);
// myDriverPopup->appendEntry("First one", 1); // myDriverPopup->appendEntry("First one", 1);
// myDriverPopup->appendEntry("Another one", 2); // myDriverPopup->appendEntry("Another one", 2);
yoff += kVideoRowHeight + 4; yoff += kVideoRowHeight + 4;
@ -123,13 +123,6 @@ VideoDialog::VideoDialog(OSystem* osystem, uInt16 x, uInt16 y, uInt16 w, uInt16
"Desktop Res in FS"); "Desktop Res in FS");
yoff += kVideoRowHeight + 20; yoff += kVideoRowHeight + 20;
// Add a short message about options that need a restart
new StaticTextWidget(this, _w - 175, yoff, 170, kLineHeight,
"* Note that these options take effect", kTextAlignLeft);
yoff += kVideoRowHeight;
new StaticTextWidget(this, _w - 175, yoff, 170, kLineHeight,
"the next time you restart Stella.", kTextAlignLeft);
// Add Defaults, OK and Cancel buttons // Add Defaults, OK and Cancel buttons
addButton( 10, _h - 24, "Defaults", kDefaultsCmd, 0); addButton( 10, _h - 24, "Defaults", kDefaultsCmd, 0);
#ifndef MAC_OSX #ifndef MAC_OSX
@ -176,12 +169,7 @@ void VideoDialog::loadConfig()
// Aspect ratio - another huge hack // Aspect ratio - another huge hack
s = instance()->settings().getString("gl_aspect"); s = instance()->settings().getString("gl_aspect");
f = instance()->settings().getFloat("gl_aspect"); f = instance()->settings().getFloat("gl_aspect");
if(f == -1.0) if(f < 1.1)
{
f = 1.1;
s = "1.1";
}
else if(f < 1.1)
{ {
f = 1.1; f = 1.1;
s = "1.1"; s = "1.1";
@ -231,30 +219,47 @@ void VideoDialog::saveConfig()
{ {
string s; string s;
uInt32 i; uInt32 i;
bool b; bool b, restart = false;
// Driver setting // Driver setting
s = myDriverPopup->getSelectedString(); s = myDriverPopup->getSelectedString();
instance()->settings().setString("video_driver", s); if(s != instance()->settings().getString("video_driver"))
{
instance()->settings().setString("video_driver", s);
restart = true;
}
// Renderer setting // Renderer setting
i = myRendererPopup->getSelectedTag(); i = myRendererPopup->getSelectedTag();
if(i == 1) if(i == 1)
instance()->settings().setString("video", "soft"); s = "soft";
else if(i == 2) else if(i == 2)
instance()->settings().setString("video", "gl"); s = "gl";
if(s != instance()->settings().getString("video"))
{
instance()->settings().setString("video", s);
restart = true;
}
// Filter setting // Filter setting
i = myFilterPopup->getSelectedTag(); i = myFilterPopup->getSelectedTag();
if(i == 1) if(i == 1)
instance()->settings().setString("gl_filter", "linear"); s = "linear";
else if(i == 2) else if(i == 2)
instance()->settings().setString("gl_filter", "nearest"); s = "nearest";
// FIXME - immediately change the filtering if(s != instance()->settings().getString("gl_filter"))
{
instance()->settings().setString("gl_filter", s);
restart = true;
}
// Aspect ratio // Aspect ratio
s = myAspectRatioLabel->getLabel(); s = myAspectRatioLabel->getLabel();
instance()->settings().setString("gl_aspect", s); if(s != instance()->settings().getString("gl_aspect"))
{
instance()->settings().setString("gl_aspect", s);
restart = true;
}
// Palette // Palette
i = myPalettePopup->getSelectedTag(); i = myPalettePopup->getSelectedTag();
@ -265,7 +270,7 @@ void VideoDialog::saveConfig()
else if(i == 3) else if(i == 3)
instance()->settings().setString("palette", "z26"); instance()->settings().setString("palette", "z26");
s = myPalettePopup->getSelectedString(); s = myPalettePopup->getSelectedString();
instance()->settings().setString("palette", s); // FIXME - make this more efficient instance()->settings().setString("palette", s);
instance()->console().togglePalette(s); instance()->console().togglePalette(s);
// Framerate // Framerate
@ -284,8 +289,17 @@ void VideoDialog::saveConfig()
// Use desktop resolution in fullscreen mode // Use desktop resolution in fullscreen mode
b = myUseDeskResCheckbox->getState(); b = myUseDeskResCheckbox->getState();
instance()->settings().setBool("gl_fsmax", b); if(b != instance()->settings().getBool("gl_fsmax"))
// FIXME - immediately toggle gl_fsmax {
instance()->settings().setBool("gl_fsmax", b);
restart = true;
}
// Finally, issue a complete framebuffer re-initialization
// Not all options may require a full re-initialization, so we only
// do it when necessary
if(restart)
instance()->createFrameBuffer();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -