Added new commandline options -ssdir and -ssname to snapshot support.

-ssdir <path>  : Path which specifies where snapshots are saved.
-ssname <name> : Can be either "romname" or "md5sum".  Will name the snapshot
   file according to the specified option (from stella.pro file).

Some cleanups of the snapshot code.

Fixed bug where segmentation fault occurred if there was no stella.pro
present.  Now an error is printed.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@39 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2002-02-01 02:13:08 +00:00
parent cccf418bc6
commit de2df715ea
3 changed files with 158 additions and 30 deletions

View File

@ -24,3 +24,5 @@
;paddle = <0|1|2|3|real> ;paddle = <0|1|2|3|real>
;showfps = <0|1> ;showfps = <0|1>
;fullscreen = <0|1> ;fullscreen = <0|1>
;ssdir = <pathname>
;ssname = <romname|md5sum>

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.5 2002-01-19 02:17:19 stephena Exp $ // $Id: mainSDL.cxx,v 1.6 2002-02-01 02:13:08 stephena Exp $
//============================================================================ //============================================================================
#include <assert.h> #include <assert.h>
@ -42,6 +42,12 @@
#ifdef IMLIB2_SNAPSHOT #ifdef IMLIB2_SNAPSHOT
#include <Imlib2.h> #include <Imlib2.h>
// The path to save snapshot files
string theSnapShotDir = "";
// What the snapshot should be called (romname or md5sum)
string theSnapShotName = "";
#endif #endif
SDL_Joystick* theLeftJoystick; SDL_Joystick* theLeftJoystick;
@ -65,7 +71,7 @@ void takeSnapshot();
void togglePause(); void togglePause();
uInt32 maxWindowSizeForScreen(); uInt32 maxWindowSizeForScreen();
void setupProperties(PropertiesSet& set); bool setupProperties(PropertiesSet& set);
void handleCommandLineArguments(int ac, char* av[]); void handleCommandLineArguments(int ac, char* av[]);
void handleRCFile(); void handleRCFile();
void parseRCOptions(istream& in); void parseRCOptions(istream& in);
@ -352,6 +358,13 @@ bool setupDisplay()
imlib_context_set_drawable(theX11Window); imlib_context_set_drawable(theX11Window);
imlib_context_set_visual(DefaultVisual(theX11Display, theX11Screen)); imlib_context_set_visual(DefaultVisual(theX11Display, theX11Screen));
imlib_context_set_colormap(DefaultColormap(theX11Display, theX11Screen)); imlib_context_set_colormap(DefaultColormap(theX11Display, theX11Screen));
// By default, snapshot dir is HOME and name is ROMNAME, assuming that
// they haven't been specified on the commandline
if(theSnapShotDir == "")
theSnapShotDir = getenv("HOME");
if(theSnapShotName == "")
theSnapShotName = "romname";
} }
} }
#endif #endif
@ -1009,11 +1022,12 @@ void handleEvents()
/** /**
Called when the user wants to take a snapshot of the current display. Called when the user wants to take a snapshot of the current display.
Currently, images are stored in png format in the users home directory Images are stored in png format in the directory specified by the 'ssdir'
name consecutively as "Cartridge.Name".png. If that name exists, they are argument, or in $HOME by default.
named as Cartridge.Name"_x.png, where x starts with 1 and Images are named consecutively as "NAME".png, where name is specified by
increases if the previous name already exists. All spaces in filenames the 'ssname' argument. If that name exists, they are named as "Name"_x.png,
are converted to underscore '_'. where x starts with 1 and increases if the previous name already exists.
All spaces in filenames are converted to underscore '_'.
*/ */
void takeSnapshot() void takeSnapshot()
{ {
@ -1031,8 +1045,17 @@ void takeSnapshot()
} }
// Now find the correct name for the snapshot // Now find the correct name for the snapshot
string filename = getenv("HOME"); string filename = theSnapShotDir;
filename = filename + "/" + theConsole->properties().get("Cartridge.Name"); if(theSnapShotName == "romname")
filename = filename + "/" + theConsole->properties().get("Cartridge.Name");
else if(theSnapShotName == "md5sum")
filename = filename + "/" + theConsole->properties().get("Cartridge.MD5");
else
{
cerr << "ERROR: unknown name " << theSnapShotName
<< " for snapshot type" << endl;
return;
}
// Replace all spaces in name with underscores // Replace all spaces in name with underscores
replace(filename.begin(), filename.end(), ' ', '_'); replace(filename.begin(), filename.end(), ' ', '_');
@ -1062,7 +1085,10 @@ void takeSnapshot()
imlib_save_image(filename.c_str()); imlib_save_image(filename.c_str());
imlib_free_image(); imlib_free_image();
cerr << "Snapshot saved as " << filename << endl; if(access(filename.c_str(), F_OK) == 0)
cerr << "Snapshot saved as " << filename << endl;
else
cerr << "Couldn't create snapshot " << filename << endl;
#else #else
cerr << "Snapshot mode not supported.\n"; cerr << "Snapshot mode not supported.\n";
#endif #endif
@ -1139,6 +1165,10 @@ void usage()
" -paddle <0|1|2|3|real> Indicates which paddle the mouse should emulate", " -paddle <0|1|2|3|real> Indicates which paddle the mouse should emulate",
" or that real Atari 2600 paddles are being used", " or that real Atari 2600 paddles are being used",
" -showfps Shows some game info on exit", " -showfps Shows some game info on exit",
#ifdef IMLIB2_SNAPSHOT
" -ssdir <path> The directory to save snapshot files to",
" -ssname <name> How to name the snapshot (romname or md5sum)",
#endif
"", "",
0 0
}; };
@ -1153,11 +1183,12 @@ void usage()
/** /**
Setup the properties set by first checking for a user file ".stella.pro", Setup the properties set by first checking for a user file ".stella.pro",
then a system-wide file "/etc/stella.pro". then a system-wide file "/etc/stella.pro". Return false if neither file
is found, else return true.
@param set The properties set to setup @param set The properties set to setup
*/ */
void setupProperties(PropertiesSet& set) bool setupProperties(PropertiesSet& set)
{ {
string homePropertiesFile = getenv("HOME"); string homePropertiesFile = getenv("HOME");
homePropertiesFile += "/.stella.pro"; homePropertiesFile += "/.stella.pro";
@ -1166,10 +1197,17 @@ void setupProperties(PropertiesSet& set)
if(access(homePropertiesFile.c_str(), R_OK) == 0) if(access(homePropertiesFile.c_str(), R_OK) == 0)
{ {
set.load(homePropertiesFile, &Console::defaultProperties(), false); set.load(homePropertiesFile, &Console::defaultProperties(), false);
return true;
} }
else if(access(systemPropertiesFile.c_str(), R_OK) == 0) else if(access(systemPropertiesFile.c_str(), R_OK) == 0)
{ {
set.load(systemPropertiesFile, &Console::defaultProperties(), false); set.load(systemPropertiesFile, &Console::defaultProperties(), false);
return true;
}
else
{
cerr << "ERROR: Couldn't find stella.pro file." << endl;
return false;
} }
} }
@ -1253,6 +1291,16 @@ void handleCommandLineArguments(int argc, char* argv[])
theDesiredVolume = volume; theDesiredVolume = volume;
} }
#ifdef IMLIB2_SNAPSHOT
else if(string(argv[i]) == "-ssdir")
{
theSnapShotDir = argv[++i];
}
else if(string(argv[i]) == "-ssname")
{
theSnapShotName = argv[++i];
}
#endif
else else
{ {
cout << "Undefined option " << argv[i] << endl; cout << "Undefined option " << argv[i] << endl;
@ -1403,6 +1451,16 @@ void parseRCOptions(istream& in)
theDesiredVolume = volume; theDesiredVolume = volume;
} }
#ifdef IMLIB2_SNAPSHOT
else if(key == "ssdir")
{
theSnapShotDir = value;
}
else if(key == "ssname")
{
theSnapShotName = value;
}
#endif
} }
} }
@ -1451,7 +1509,11 @@ int main(int argc, char* argv[])
// Create a properties set for us to use and set it up // Create a properties set for us to use and set it up
PropertiesSet propertiesSet; PropertiesSet propertiesSet;
setupProperties(propertiesSet); if(!setupProperties(propertiesSet))
{
delete[] image;
exit(1);
}
// Create a sound object for use with the console // Create a sound object for use with the console
SoundUnix sound(theDesiredVolume); SoundUnix sound(theDesiredVolume);

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: mainX11.cxx,v 1.5 2002-01-16 15:09:21 stephena Exp $ // $Id: mainX11.cxx,v 1.6 2002-02-01 02:13:08 stephena Exp $
//============================================================================ //============================================================================
#include <assert.h> #include <assert.h>
@ -45,6 +45,12 @@
#ifdef IMLIB2_SNAPSHOT #ifdef IMLIB2_SNAPSHOT
#include <Imlib2.h> #include <Imlib2.h>
// The path to save snapshot files
string theSnapShotDir = "";
// What the snapshot should be called (romname or md5sum)
string theSnapShotName = "";
#endif #endif
#ifdef LINUX_JOYSTICK #ifdef LINUX_JOYSTICK
@ -88,12 +94,14 @@ void grabMouse(bool grab);
void toggleFullscreen(); void toggleFullscreen();
void takeSnapshot(); void takeSnapshot();
void togglePause(); void togglePause();
void setupProperties(PropertiesSet& set); uInt32 maxWindowSizeForScreen();
bool setupProperties(PropertiesSet& set);
void handleCommandLineArguments(int argc, char* argv[]); void handleCommandLineArguments(int argc, char* argv[]);
void handleRCFile(); void handleRCFile();
void parseRCOptions(istream& in); void parseRCOptions(istream& in);
void usage(); void usage();
uInt32 maxWindowSizeForScreen();
// Global event stuff // Global event stuff
struct Switches struct Switches
@ -385,6 +393,13 @@ bool setupDisplay()
imlib_context_set_colormap(thePrivateColormap); imlib_context_set_colormap(thePrivateColormap);
else else
imlib_context_set_colormap(DefaultColormap(theDisplay, theScreen)); imlib_context_set_colormap(DefaultColormap(theDisplay, theScreen));
// By default, snapshot dir is HOME and name is ROMNAME, assuming that
// they haven't been specified on the commandline
if(theSnapShotDir == "")
theSnapShotDir = getenv("HOME");
if(theSnapShotName == "")
theSnapShotName = "romname";
#endif #endif
return true; return true;
@ -985,11 +1000,12 @@ bool createCursors()
/** /**
Called when the user wants to take a snapshot of the current display. Called when the user wants to take a snapshot of the current display.
Currently, images are stored in png format in the users home directory Images are stored in png format in the directory specified by the 'ssdir'
name consecutively as "Cartridge.Name".png. If that name exists, they are argument, or in $HOME by default.
named as Cartridge.Name"_x.png, where x starts with 1 and Images are named consecutively as "NAME".png, where name is specified by
increases if the previous name already exists. All spaces in filenames the 'ssname' argument. If that name exists, they are named as "Name"_x.png,
are converted to underscore '_'. where x starts with 1 and increases if the previous name already exists.
All spaces in filenames are converted to underscore '_'.
*/ */
void takeSnapshot() void takeSnapshot()
{ {
@ -1007,8 +1023,17 @@ void takeSnapshot()
} }
// Now find the correct name for the snapshot // Now find the correct name for the snapshot
string filename = getenv("HOME"); string filename = theSnapShotDir;
filename = filename + "/" + theConsole->properties().get("Cartridge.Name"); if(theSnapShotName == "romname")
filename = filename + "/" + theConsole->properties().get("Cartridge.Name");
else if(theSnapShotName == "md5sum")
filename = filename + "/" + theConsole->properties().get("Cartridge.MD5");
else
{
cerr << "ERROR: unknown name " << theSnapShotName
<< " for snapshot type" << endl;
return;
}
// Replace all spaces in name with underscores // Replace all spaces in name with underscores
replace(filename.begin(), filename.end(), ' ', '_'); replace(filename.begin(), filename.end(), ' ', '_');
@ -1038,7 +1063,10 @@ void takeSnapshot()
imlib_save_image(filename.c_str()); imlib_save_image(filename.c_str());
imlib_free_image(); imlib_free_image();
cerr << "Snapshot saved as " << filename << endl; if(access(filename.c_str(), F_OK) == 0)
cerr << "Snapshot saved as " << filename << endl;
else
cerr << "Couldn't create snapshot " << filename << endl;
#else #else
cerr << "Snapshot mode not supported.\n"; cerr << "Snapshot mode not supported.\n";
#endif #endif
@ -1080,9 +1108,9 @@ void usage()
{ {
static const char* message[] = { static const char* message[] = {
"", "",
"XStella version 1.2", "X Stella version 1.2",
"", "",
"Usage: xstella [option ...] file", "Usage: stella.x11 [option ...] file",
"", "",
"Valid options are:", "Valid options are:",
"", "",
@ -1090,7 +1118,7 @@ void usage()
" -fps <number> Display the given number of frames per second", " -fps <number> Display the given number of frames per second",
" -owncmap Install a private colormap", " -owncmap Install a private colormap",
" -winsize <size> Makes initial window be 'size' times normal", " -winsize <size> Makes initial window be 'size' times normal",
" -fullscreen Play the game in fullscreen mode", // " -fullscreen Play the game in fullscreen mode",
" -grabmouse Keeps the mouse in the game window", " -grabmouse Keeps the mouse in the game window",
" -hidecursor Hides the mouse cursor in the game window", " -hidecursor Hides the mouse cursor in the game window",
" -center Centers the game window onscreen", " -center Centers the game window onscreen",
@ -1102,6 +1130,10 @@ void usage()
" -paddle <0|1|2|3> Indicates which paddle the mouse should emulate", " -paddle <0|1|2|3> Indicates which paddle the mouse should emulate",
#endif #endif
" -showfps Shows some game info on exit", " -showfps Shows some game info on exit",
#ifdef IMLIB2_SNAPSHOT
" -ssdir <path> The directory to save snapshot files to",
" -ssname <name> How to name the snapshot (romname or md5sum)",
#endif
"", "",
0 0
}; };
@ -1115,11 +1147,12 @@ void usage()
/** /**
Setup the properties set by first checking for a user file ".stella.pro", Setup the properties set by first checking for a user file ".stella.pro",
then a system-wide file "/etc/stella.pro". then a system-wide file "/etc/stella.pro". Return false if neither file
is found, else return true.
@param set The properties set to setup @param set The properties set to setup
*/ */
void setupProperties(PropertiesSet& set) bool setupProperties(PropertiesSet& set)
{ {
string homePropertiesFile = getenv("HOME"); string homePropertiesFile = getenv("HOME");
homePropertiesFile += "/.stella.pro"; homePropertiesFile += "/.stella.pro";
@ -1128,10 +1161,17 @@ void setupProperties(PropertiesSet& set)
if(access(homePropertiesFile.c_str(), R_OK) == 0) if(access(homePropertiesFile.c_str(), R_OK) == 0)
{ {
set.load(homePropertiesFile, &Console::defaultProperties(), false); set.load(homePropertiesFile, &Console::defaultProperties(), false);
return true;
} }
else if(access(systemPropertiesFile.c_str(), R_OK) == 0) else if(access(systemPropertiesFile.c_str(), R_OK) == 0)
{ {
set.load(systemPropertiesFile, &Console::defaultProperties(), false); set.load(systemPropertiesFile, &Console::defaultProperties(), false);
return true;
}
else
{
cerr << "ERROR: Couldn't find stella.pro file." << endl;
return false;
} }
} }
@ -1222,6 +1262,16 @@ void handleCommandLineArguments(int argc, char* argv[])
theDesiredVolume = volume; theDesiredVolume = volume;
} }
#ifdef IMLIB2_SNAPSHOT
else if(string(argv[i]) == "-ssdir")
{
theSnapShotDir = argv[++i];
}
else if(string(argv[i]) == "-ssname")
{
theSnapShotName = argv[++i];
}
#endif
else else
{ {
cout << "Undefined option " << argv[i] << endl; cout << "Undefined option " << argv[i] << endl;
@ -1382,6 +1432,16 @@ void parseRCOptions(istream& in)
theDesiredVolume = volume; theDesiredVolume = volume;
} }
#ifdef IMLIB2_SNAPSHOT
else if(key == "ssdir")
{
theSnapShotDir = value;
}
else if(key == "ssname")
{
theSnapShotName = value;
}
#endif
} }
} }
@ -1440,7 +1500,11 @@ int main(int argc, char* argv[])
// Create a properties set for us to use and set it up // Create a properties set for us to use and set it up
PropertiesSet propertiesSet; PropertiesSet propertiesSet;
setupProperties(propertiesSet); if(!setupProperties(propertiesSet))
{
delete[] image;
exit(1);
}
// Create a sound object for use with the console // Create a sound object for use with the console
SoundUnix sound(theDesiredVolume); SoundUnix sound(theDesiredVolume);