mirror of https://github.com/stella-emu/stella.git
Big performance boost for SDL version. Switched from updating the whole
screen to only those parts that changed. Switched back to using native bpp mode in SDL, since emulating 8-bit display was causing a performance hit. Because of previous modifications, snapshot support in SDL in broken in both windowed and fullscreen mode again. Its on my TODO list :) SDL snapshot support now configurable in the makefile. Now you can use the SDL version without needing libpng (and without snapshot support). Fixed a bug in SDL version when no joysticks were present on system. Changed commandline argument from '-winsize' to '-zoom' since it more accurately describes whats happening (X11 and SDL versions). Removed F11 key (fullscreeen mode) in X11 version since that code hasn't actually been written yet. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@44 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
parent
cc8ea20d1e
commit
6e1e8f3870
|
@ -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: makefile,v 1.8 2002-02-17 04:41:41 stephena Exp $
|
## $Id: makefile,v 1.9 2002-03-05 22:39:47 stephena Exp $
|
||||||
##============================================================================
|
##============================================================================
|
||||||
|
|
||||||
##============================================================================
|
##============================================================================
|
||||||
|
@ -53,8 +53,9 @@ OPTIMIZATIONS =
|
||||||
# LINUX_JOYSTICK = 1
|
# LINUX_JOYSTICK = 1
|
||||||
|
|
||||||
### to include support for saving snapshots in png format
|
### to include support for saving snapshots in png format
|
||||||
### (X version requires Imlib)
|
### (X version requires Imlib, SDL version requires libpng)
|
||||||
# X11_SNAPSHOT = 1
|
# X11_SNAPSHOT = 1
|
||||||
|
# SDL_SNAPSHOT = 1
|
||||||
|
|
||||||
##============================================================================
|
##============================================================================
|
||||||
## All done, type make to get a list of frontends
|
## All done, type make to get a list of frontends
|
||||||
|
@ -71,6 +72,7 @@ OPTS.X11 =
|
||||||
LIBS.X11 =
|
LIBS.X11 =
|
||||||
CFLAGS.X11 =
|
CFLAGS.X11 =
|
||||||
|
|
||||||
|
OBJS.SDL =
|
||||||
OPTS.SDL =
|
OPTS.SDL =
|
||||||
LIBS.SDL = `sdl-config --libs`
|
LIBS.SDL = `sdl-config --libs`
|
||||||
CFLAGS.SDL = `sdl-config --cflags`
|
CFLAGS.SDL = `sdl-config --cflags`
|
||||||
|
@ -113,6 +115,12 @@ LIBS.X11 += `imlib-config --libs`
|
||||||
CFLAGS.X11 += `imlib-config --cflags`
|
CFLAGS.X11 += `imlib-config --cflags`
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef SDL_SNAPSHOT
|
||||||
|
OBJS.SDL += SnapSDL.o
|
||||||
|
OPTS.SDL += -DHAVE_PNG
|
||||||
|
LIBS.SDL += -lpng
|
||||||
|
endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "To build Stella type: 'make <version>'"
|
@echo "To build Stella type: 'make <version>'"
|
||||||
|
@ -173,10 +181,10 @@ linux-sdl:
|
||||||
OPTIONS+="$(OPTS.SDL)" \
|
OPTIONS+="$(OPTS.SDL)" \
|
||||||
LDFLAGS="-L/usr/X11R6/lib" \
|
LDFLAGS="-L/usr/X11R6/lib" \
|
||||||
LDFLAGS+="$(CFLAGS.SDL)" \
|
LDFLAGS+="$(CFLAGS.SDL)" \
|
||||||
LDLIBS="-lX11 -lXext -lpng" \
|
LDLIBS="-lX11 -lXext" \
|
||||||
LDLIBS+="$(LIBS.SDL)" \
|
LDLIBS+="$(LIBS.SDL)" \
|
||||||
OBJS="mainSDL.o SndUnix.o SnapSDL.o"
|
OBJS="mainSDL.o SndUnix.o RectList.o" \
|
||||||
|
OBJS+="$(OBJS.SDL)"
|
||||||
bsdi-x:
|
bsdi-x:
|
||||||
make stella.x11 \
|
make stella.x11 \
|
||||||
INCLUDES="$(INCLUDES) -I$(UI)/x11 -I$(UI)/sound" \
|
INCLUDES="$(INCLUDES) -I$(UI)/x11 -I$(UI)/sound" \
|
||||||
|
@ -385,6 +393,9 @@ mainSDL.o: $(UI)/sdl/mainSDL.cxx
|
||||||
SnapSDL.o: $(UI)/sdl/SnapSDL.cxx $(UI)/sdl/SnapSDL.hxx
|
SnapSDL.o: $(UI)/sdl/SnapSDL.cxx $(UI)/sdl/SnapSDL.hxx
|
||||||
$(CXX) -c $(CXXFLAGS) $(OPTIONS) $(LDFLAGS) $(UI)/sdl/SnapSDL.cxx
|
$(CXX) -c $(CXXFLAGS) $(OPTIONS) $(LDFLAGS) $(UI)/sdl/SnapSDL.cxx
|
||||||
|
|
||||||
|
RectList.o: $(UI)/sdl/RectList.cxx $(UI)/sdl/RectList.hxx
|
||||||
|
$(CXX) -c $(CXXFLAGS) $(OPTIONS) $(LDFLAGS) $(UI)/sdl/RectList.cxx
|
||||||
|
|
||||||
SndUnix.o: $(UI)/sound/SndUnix.cxx
|
SndUnix.o: $(UI)/sound/SndUnix.cxx
|
||||||
$(CXX) -c $(CXXFLAGS) $(OPTIONS) $(UI)/sound/SndUnix.cxx
|
$(CXX) -c $(CXXFLAGS) $(OPTIONS) $(UI)/sound/SndUnix.cxx
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
;display = <display>
|
;display = <display>
|
||||||
;fps = <number>
|
;fps = <number>
|
||||||
;owncmap = <0|1>
|
;owncmap = <0|1>
|
||||||
;winsize = <size>
|
;zoom = <size>
|
||||||
;grabmouse <0|1>
|
;grabmouse <0|1>
|
||||||
;hidecursor <0|1>
|
;hidecursor <0|1>
|
||||||
;center = <0|1>
|
;center = <0|1>
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// SSSS tt lll lll
|
||||||
|
// SS SS tt ll ll
|
||||||
|
// SS tttttt eeee ll ll aaaa
|
||||||
|
// SSSS tt ee ee ll ll aa
|
||||||
|
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
||||||
|
// SS SS tt ee ll ll aa aa
|
||||||
|
// SSSS ttt eeeee llll llll aaaaa
|
||||||
|
//
|
||||||
|
// Copyright (c) 1995-1999 by Bradford W. Mott
|
||||||
|
//
|
||||||
|
// 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.1 2002-03-05 22:39:47 stephena Exp $
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
|
||||||
|
#include "RectList.hxx"
|
||||||
|
|
||||||
|
|
||||||
|
RectList::RectList(Uint32 size)
|
||||||
|
{
|
||||||
|
currentSize = size;
|
||||||
|
currentRect = 0;
|
||||||
|
|
||||||
|
rectArray = new SDL_Rect[currentSize];
|
||||||
|
}
|
||||||
|
|
||||||
|
RectList::~RectList()
|
||||||
|
{
|
||||||
|
delete[] rectArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RectList::add(SDL_Rect* newRect)
|
||||||
|
{
|
||||||
|
if(currentRect >= currentSize)
|
||||||
|
{
|
||||||
|
currentSize = currentSize * 2;
|
||||||
|
SDL_Rect *temp = new SDL_Rect[currentSize];
|
||||||
|
|
||||||
|
for(Uint32 i = 0; i < currentRect; ++i)
|
||||||
|
temp[i] = rectArray[i];
|
||||||
|
|
||||||
|
delete[] rectArray;
|
||||||
|
rectArray = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
rectArray[currentRect].x = newRect->x;
|
||||||
|
rectArray[currentRect].y = newRect->y;
|
||||||
|
rectArray[currentRect].w = newRect->w;
|
||||||
|
rectArray[currentRect].h = newRect->h;
|
||||||
|
|
||||||
|
++currentRect;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Rect* RectList::rects()
|
||||||
|
{
|
||||||
|
return rectArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint32 RectList::numRects()
|
||||||
|
{
|
||||||
|
return currentRect;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RectList::start()
|
||||||
|
{
|
||||||
|
currentRect = 0;
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// SSSS tt lll lll
|
||||||
|
// SS SS tt ll ll
|
||||||
|
// SS tttttt eeee ll ll aaaa
|
||||||
|
// SSSS tt ee ee ll ll aa
|
||||||
|
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
||||||
|
// SS SS tt ee ll ll aa aa
|
||||||
|
// SSSS ttt eeeee llll llll aaaaa
|
||||||
|
//
|
||||||
|
// Copyright (c) 1995-1999 by Bradford W. Mott
|
||||||
|
//
|
||||||
|
// 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.1 2002-03-05 22:39:47 stephena Exp $
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
#ifndef RECT_LIST_HXX
|
||||||
|
#define RECT_LIST_HXX
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
|
||||||
|
class RectList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RectList(Uint32 size = 512);
|
||||||
|
~RectList();
|
||||||
|
|
||||||
|
void add(SDL_Rect* rect);
|
||||||
|
|
||||||
|
SDL_Rect* rects();
|
||||||
|
Uint32 numRects();
|
||||||
|
void start();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Uint32 currentSize, currentRect;
|
||||||
|
|
||||||
|
SDL_Rect* rectArray;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -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: SnapSDL.cxx,v 1.2 2002-02-23 16:05:52 stephena Exp $
|
// $Id: SnapSDL.cxx,v 1.3 2002-03-05 22:39:47 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
SnapshotSDL::SnapshotSDL()
|
SnapshotSDL::SnapshotSDL()
|
||||||
{
|
{
|
||||||
|
palette = (Uint32*) NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SnapshotSDL::~SnapshotSDL()
|
SnapshotSDL::~SnapshotSDL()
|
||||||
|
@ -175,3 +176,9 @@ int SnapshotSDL::IMG_SavePNG_RW(SDL_Surface *surface, SDL_RWops *src)
|
||||||
png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
|
png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SnapshotSDL::setPalette(Uint32 *palette)
|
||||||
|
{
|
||||||
|
this->palette = palette;
|
||||||
|
}
|
||||||
|
|
|
@ -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: SnapSDL.hxx,v 1.1 2002-02-17 04:41:41 stephena Exp $
|
// $Id: SnapSDL.hxx,v 1.2 2002-03-05 22:39:47 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#ifndef SNAPSHOTSDL_HXX
|
#ifndef SNAPSHOTSDL_HXX
|
||||||
|
@ -30,6 +30,7 @@ class SnapshotSDL
|
||||||
~SnapshotSDL();
|
~SnapshotSDL();
|
||||||
|
|
||||||
int savePNG(SDL_Surface *surface, const char *file);
|
int savePNG(SDL_Surface *surface, const char *file);
|
||||||
|
void setPalette(Uint32 *palette);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void png_write_data(png_structp ctx, png_bytep area, png_size_t size);
|
static void png_write_data(png_structp ctx, png_bytep area, png_size_t size);
|
||||||
|
@ -43,6 +44,8 @@ class SnapshotSDL
|
||||||
int png_colortype_from_surface(SDL_Surface *surface);
|
int png_colortype_from_surface(SDL_Surface *surface);
|
||||||
|
|
||||||
int IMG_SavePNG_RW(SDL_Surface *surface, SDL_RWops *src);
|
int IMG_SavePNG_RW(SDL_Surface *surface, SDL_RWops *src);
|
||||||
|
|
||||||
|
Uint32 *palette;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -13,20 +13,16 @@
|
||||||
// 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.10 2002-02-23 16:05:52 stephena Exp $
|
// $Id: mainSDL.cxx,v 1.11 2002-03-05 22:39:47 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <strstream>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string>
|
#include <time.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
|
@ -40,6 +36,15 @@
|
||||||
#include "System.hxx"
|
#include "System.hxx"
|
||||||
#include "SndUnix.hxx"
|
#include "SndUnix.hxx"
|
||||||
#include "SnapSDL.hxx"
|
#include "SnapSDL.hxx"
|
||||||
|
#include "RectList.hxx"
|
||||||
|
|
||||||
|
// Hack for SDL < 1.2.0
|
||||||
|
#ifndef SDL_ENABLE
|
||||||
|
#define SDL_ENABLE 1
|
||||||
|
#endif
|
||||||
|
#ifndef SDL_DISABLE
|
||||||
|
#define SDL_DISABLE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
SDL_Joystick* theLeftJoystick;
|
SDL_Joystick* theLeftJoystick;
|
||||||
|
@ -49,6 +54,8 @@ SDL_Joystick* theRightJoystick;
|
||||||
bool setupDisplay();
|
bool setupDisplay();
|
||||||
bool setupJoystick();
|
bool setupJoystick();
|
||||||
bool createScreen(int width, int height);
|
bool createScreen(int width, int height);
|
||||||
|
void recalculate8BitPalette();
|
||||||
|
void setupPalette();
|
||||||
void cleanup();
|
void cleanup();
|
||||||
|
|
||||||
void updateDisplay(MediaSource& mediaSource);
|
void updateDisplay(MediaSource& mediaSource);
|
||||||
|
@ -81,8 +88,11 @@ static int mouseX = 0;
|
||||||
static bool x11Available = false;
|
static bool x11Available = false;
|
||||||
static SDL_SysWMinfo info;
|
static SDL_SysWMinfo info;
|
||||||
static int sdlflags;
|
static int sdlflags;
|
||||||
static SnapshotSDL* snapshot;
|
static RectList* rectList;
|
||||||
|
|
||||||
|
#ifdef HAVE_PNG
|
||||||
|
static SnapshotSDL* snapshot;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct Switches
|
struct Switches
|
||||||
{
|
{
|
||||||
|
@ -221,15 +231,17 @@ uInt32 thePaddleMode = 0;
|
||||||
// An alternate properties file to use
|
// An alternate properties file to use
|
||||||
string theAlternateProFile = "";
|
string theAlternateProFile = "";
|
||||||
|
|
||||||
// The path to save snapshot files
|
#ifdef HAVE_PNG
|
||||||
string theSnapShotDir = "";
|
// The path to save snapshot files
|
||||||
|
string theSnapShotDir = "";
|
||||||
|
|
||||||
// What the snapshot should be called (romname or md5sum)
|
// What the snapshot should be called (romname or md5sum)
|
||||||
string theSnapShotName = "";
|
string theSnapShotName = "";
|
||||||
|
|
||||||
// Indicates whether to generate multiple snapshots or keep
|
// Indicates whether to generate multiple snapshots or keep
|
||||||
// overwriting the same file. Set to true by default.
|
// overwriting the same file. Set to true by default.
|
||||||
bool theMultipleSnapShotFlag = true;
|
bool theMultipleSnapShotFlag = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -256,9 +268,6 @@ bool setupDisplay()
|
||||||
sdlflags |= theUseFullScreenFlag ? SDL_FULLSCREEN : 0;
|
sdlflags |= theUseFullScreenFlag ? SDL_FULLSCREEN : 0;
|
||||||
sdlflags |= theUsePrivateColormapFlag ? SDL_HWPALETTE : 0;
|
sdlflags |= theUsePrivateColormapFlag ? SDL_HWPALETTE : 0;
|
||||||
|
|
||||||
// Always use an 8-bit screen since the Atari 2600 had less than 256 colors
|
|
||||||
bpp = 8;
|
|
||||||
|
|
||||||
// Get the desired width and height of the display
|
// Get the desired width and height of the display
|
||||||
theWidth = theConsole->mediaSource().width();
|
theWidth = theConsole->mediaSource().width();
|
||||||
theHeight = theConsole->mediaSource().height();
|
theHeight = theConsole->mediaSource().height();
|
||||||
|
@ -266,6 +275,7 @@ bool setupDisplay()
|
||||||
// Get the maximum size of a window for THIS screen
|
// Get the maximum size of a window for THIS screen
|
||||||
// Must be called after display and screen are known, as well as
|
// Must be called after display and screen are known, as well as
|
||||||
// theWidth and theHeight
|
// theWidth and theHeight
|
||||||
|
// Defaults to 3 on systems without X11, maximum of 4 on any system.
|
||||||
theMaxWindowSize = maxWindowSizeForScreen();
|
theMaxWindowSize = maxWindowSizeForScreen();
|
||||||
|
|
||||||
// If theWindowSize is not 0, then it must have been set on the commandline
|
// If theWindowSize is not 0, then it must have been set on the commandline
|
||||||
|
@ -285,6 +295,31 @@ bool setupDisplay()
|
||||||
theWindowSize = 2;
|
theWindowSize = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_PNG
|
||||||
|
// Take care of the snapshot stuff. Must be done before the screen is
|
||||||
|
// created.
|
||||||
|
snapshot = new SnapshotSDL();
|
||||||
|
|
||||||
|
if(theSnapShotDir == "")
|
||||||
|
theSnapShotDir = getenv("HOME");
|
||||||
|
if(theSnapShotName == "")
|
||||||
|
theSnapShotName = "romname";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Set up the rectangle list to be used in updateDisplay
|
||||||
|
rectList = new RectList();
|
||||||
|
if(!rectList)
|
||||||
|
{
|
||||||
|
cerr << "ERROR: Unable to get memory for SDL rects" << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the window title and icon
|
||||||
|
char name[512];
|
||||||
|
sprintf(name, "Stella: \"%s\"",
|
||||||
|
theConsole->properties().get("Cartridge.Name").c_str());
|
||||||
|
SDL_WM_SetCaption(name, "stella");
|
||||||
|
|
||||||
// Figure out the desired size of the window
|
// Figure out the desired size of the window
|
||||||
int width = theWidth * 2 * theWindowSize;
|
int width = theWidth * 2 * theWindowSize;
|
||||||
int height = theHeight * theWindowSize;
|
int height = theHeight * theWindowSize;
|
||||||
|
@ -292,12 +327,7 @@ bool setupDisplay()
|
||||||
// Create the screen
|
// Create the screen
|
||||||
if(!createScreen(width, height))
|
if(!createScreen(width, height))
|
||||||
return false;
|
return false;
|
||||||
|
setupPalette();
|
||||||
// set the window title and icon name
|
|
||||||
char name[512];
|
|
||||||
sprintf(name, "Stella: \"%s\"",
|
|
||||||
theConsole->properties().get("Cartridge.Name").c_str());
|
|
||||||
SDL_WM_SetCaption(name, "stella");
|
|
||||||
|
|
||||||
// Make sure that theUseFullScreenFlag sets up fullscreen mode correctly
|
// Make sure that theUseFullScreenFlag sets up fullscreen mode correctly
|
||||||
if(theUseFullScreenFlag)
|
if(theUseFullScreenFlag)
|
||||||
|
@ -319,16 +349,6 @@ bool setupDisplay()
|
||||||
if(theCenterWindowFlag && !theUseFullScreenFlag)
|
if(theCenterWindowFlag && !theUseFullScreenFlag)
|
||||||
centerWindow();
|
centerWindow();
|
||||||
|
|
||||||
// Take care of the snapshot stuff
|
|
||||||
snapshot = new SnapshotSDL();
|
|
||||||
|
|
||||||
// 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";
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,7 +362,6 @@ bool setupJoystick()
|
||||||
if(SDL_NumJoysticks() <= 0)
|
if(SDL_NumJoysticks() <= 0)
|
||||||
{
|
{
|
||||||
cout << "No joysticks present, use the keyboard.\n";
|
cout << "No joysticks present, use the keyboard.\n";
|
||||||
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
|
|
||||||
theLeftJoystick = theRightJoystick = 0;
|
theLeftJoystick = theRightJoystick = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -366,18 +385,34 @@ bool setupJoystick()
|
||||||
/**
|
/**
|
||||||
This routine is called whenever the screen needs to be recreated.
|
This routine is called whenever the screen needs to be recreated.
|
||||||
It updates the global screen variable. When this happens, the
|
It updates the global screen variable. When this happens, the
|
||||||
palette has to be recalculated as well.
|
8-bit palette needs to be recalculated.
|
||||||
*/
|
*/
|
||||||
bool createScreen(int w, int h)
|
bool createScreen(int w, int h)
|
||||||
{
|
{
|
||||||
screen = SDL_SetVideoMode(w, h, bpp, sdlflags);
|
screen = SDL_SetVideoMode(w, h, 0, sdlflags);
|
||||||
if(screen == NULL)
|
if(screen == NULL)
|
||||||
{
|
{
|
||||||
cerr << "ERROR: Unable to open SDL window: " << SDL_GetError() << endl;
|
cerr << "ERROR: Unable to open SDL window: " << SDL_GetError() << endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now set the screen palette
|
bpp = screen->format->BitsPerPixel;
|
||||||
|
if(bpp == 8)
|
||||||
|
recalculate8BitPalette();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Recalculates palette of an 8-bit (256 color) screen.
|
||||||
|
*/
|
||||||
|
void recalculate8BitPalette()
|
||||||
|
{
|
||||||
|
if(bpp != 8)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Map 2600 colors to the current screen
|
||||||
const uInt32* gamePalette = theConsole->mediaSource().palette();
|
const uInt32* gamePalette = theConsole->mediaSource().palette();
|
||||||
SDL_Color colors[256];
|
SDL_Color colors[256];
|
||||||
for(uInt32 i = 0; i < 256; i += 2)
|
for(uInt32 i = 0; i < 256; i += 2)
|
||||||
|
@ -407,7 +442,53 @@ bool createScreen(int w, int h)
|
||||||
palette[i] = palette[i+1] = SDL_MapRGB(format, r, g, b);
|
palette[i] = palette[i+1] = SDL_MapRGB(format, r, g, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
#ifdef HAVE_PNG
|
||||||
|
// Make sure that snapshots use this new palette
|
||||||
|
if(snapshot)
|
||||||
|
snapshot->setPalette(palette);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set up the palette for a screen with > 8 bits
|
||||||
|
*/
|
||||||
|
void setupPalette()
|
||||||
|
{
|
||||||
|
if(bpp == 8)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const uInt32* gamePalette = theConsole->mediaSource().palette();
|
||||||
|
for(uInt32 i = 0; i < 256; i += 2)
|
||||||
|
{
|
||||||
|
Uint8 r, g, b;
|
||||||
|
|
||||||
|
r = (Uint8) ((gamePalette[i] & 0x00ff0000) >> 16);
|
||||||
|
g = (Uint8) ((gamePalette[i] & 0x0000ff00) >> 8);
|
||||||
|
b = (Uint8) (gamePalette[i] & 0x000000ff);
|
||||||
|
|
||||||
|
switch(bpp)
|
||||||
|
{
|
||||||
|
case 15:
|
||||||
|
palette[i] = palette[i+1] = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 16:
|
||||||
|
palette[i] = palette[i+1] = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 24:
|
||||||
|
case 32:
|
||||||
|
palette[i] = palette[i+1] = (r << 16) | (g << 8) | b;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_PNG
|
||||||
|
// Make sure that snapshots use this new palette
|
||||||
|
if(snapshot)
|
||||||
|
snapshot->setPalette(palette);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -589,6 +670,9 @@ void updateDisplay(MediaSource& mediaSource)
|
||||||
uInt16 x, y, width, height;
|
uInt16 x, y, width, height;
|
||||||
} rectangles[2][160];
|
} rectangles[2][160];
|
||||||
|
|
||||||
|
// Start a new reclist on each display update
|
||||||
|
rectList->start();
|
||||||
|
|
||||||
// This array represents the rectangles that need displaying
|
// This array represents the rectangles that need displaying
|
||||||
// on the current scanline we're processing
|
// on the current scanline we're processing
|
||||||
Rectangle* currentRectangles = rectangles[0];
|
Rectangle* currentRectangles = rectangles[0];
|
||||||
|
@ -600,9 +684,6 @@ void updateDisplay(MediaSource& mediaSource)
|
||||||
// Indicates the number of active rectangles
|
// Indicates the number of active rectangles
|
||||||
uInt16 activeCount = 0;
|
uInt16 activeCount = 0;
|
||||||
|
|
||||||
// Used by SDL to update parts of the screen
|
|
||||||
SDL_Rect rect;
|
|
||||||
|
|
||||||
// This update procedure requires theWidth to be a multiple of four.
|
// This update procedure requires theWidth to be a multiple of four.
|
||||||
// This is validated when the properties are loaded.
|
// This is validated when the properties are loaded.
|
||||||
for(uInt16 y = 0; y < theHeight; ++y)
|
for(uInt16 y = 0; y < theHeight; ++y)
|
||||||
|
@ -671,11 +752,15 @@ void updateDisplay(MediaSource& mediaSource)
|
||||||
else if(current.x >= active.x)
|
else if(current.x >= active.x)
|
||||||
{
|
{
|
||||||
// Flush the active rectangle
|
// Flush the active rectangle
|
||||||
rect.x = active.x * 2 * screenMultiple;
|
SDL_Rect temp;
|
||||||
rect.y = active.y * screenMultiple;
|
|
||||||
rect.w = active.width * 2 * screenMultiple;
|
temp.x = active.x * 2 * screenMultiple;
|
||||||
rect.h = active.height * screenMultiple;
|
temp.y = active.y * screenMultiple;
|
||||||
SDL_FillRect(screen, &rect, palette[active.color]);
|
temp.w = active.width * 2 * screenMultiple;
|
||||||
|
temp.h = active.height * screenMultiple;
|
||||||
|
|
||||||
|
rectList->add(&temp);
|
||||||
|
SDL_FillRect(screen, &temp, palette[active.color]);
|
||||||
|
|
||||||
++activeIndex;
|
++activeIndex;
|
||||||
}
|
}
|
||||||
|
@ -686,11 +771,14 @@ void updateDisplay(MediaSource& mediaSource)
|
||||||
{
|
{
|
||||||
Rectangle& active = activeRectangles[s];
|
Rectangle& active = activeRectangles[s];
|
||||||
|
|
||||||
rect.x = active.x * 2 * screenMultiple;
|
SDL_Rect temp;
|
||||||
rect.y = active.y * screenMultiple;
|
temp.x = active.x * 2 * screenMultiple;
|
||||||
rect.w = active.width * 2 * screenMultiple;
|
temp.y = active.y * screenMultiple;
|
||||||
rect.h = active.height * screenMultiple;
|
temp.w = active.width * 2 * screenMultiple;
|
||||||
SDL_FillRect(screen, &rect, palette[active.color]);
|
temp.h = active.height * screenMultiple;
|
||||||
|
|
||||||
|
rectList->add(&temp);
|
||||||
|
SDL_FillRect(screen, &temp, palette[active.color]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We can now make the current rectangles into the active rectangles
|
// We can now make the current rectangles into the active rectangles
|
||||||
|
@ -708,14 +796,18 @@ void updateDisplay(MediaSource& mediaSource)
|
||||||
{
|
{
|
||||||
Rectangle& active = activeRectangles[t];
|
Rectangle& active = activeRectangles[t];
|
||||||
|
|
||||||
rect.x = active.x * 2 * screenMultiple;
|
SDL_Rect temp;
|
||||||
rect.y = active.y * screenMultiple;
|
temp.x = active.x * 2 * screenMultiple;
|
||||||
rect.w = active.width * 2 * screenMultiple;
|
temp.y = active.y * screenMultiple;
|
||||||
rect.h = active.height * screenMultiple;
|
temp.w = active.width * 2 * screenMultiple;
|
||||||
SDL_FillRect(screen, &rect, palette[active.color]);
|
temp.h = active.height * screenMultiple;
|
||||||
|
|
||||||
|
rectList->add(&temp);
|
||||||
|
SDL_FillRect(screen, &temp, palette[active.color]);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_UpdateRect(screen, 0, 0, screen->w, screen->h);
|
// Now update all the rectangles at once
|
||||||
|
SDL_UpdateRects(screen, rectList->numRects(), rectList->rects());
|
||||||
|
|
||||||
// The frame doesn't need to be completely redrawn anymore
|
// The frame doesn't need to be completely redrawn anymore
|
||||||
theRedrawEntireFrameFlag = false;
|
theRedrawEntireFrameFlag = false;
|
||||||
|
@ -888,10 +980,6 @@ void handleEvents()
|
||||||
{
|
{
|
||||||
doQuit();
|
doQuit();
|
||||||
}
|
}
|
||||||
else if(event.type == SDL_VIDEOEXPOSE)
|
|
||||||
{
|
|
||||||
theRedrawEntireFrameFlag = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read joystick events and modify event states
|
// Read joystick events and modify event states
|
||||||
if(theLeftJoystick)
|
if(theLeftJoystick)
|
||||||
|
@ -1037,15 +1125,13 @@ void handleEvents()
|
||||||
*/
|
*/
|
||||||
void takeSnapshot()
|
void takeSnapshot()
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_PNG
|
||||||
if(!snapshot)
|
if(!snapshot)
|
||||||
{
|
{
|
||||||
cerr << "Snapshot support disabled.\n";
|
cerr << "Snapshot support disabled.\n";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int width = screen->w;
|
|
||||||
int height = screen->h;
|
|
||||||
|
|
||||||
// Now find the correct name for the snapshot
|
// Now find the correct name for the snapshot
|
||||||
string filename = theSnapShotDir;
|
string filename = theSnapShotDir;
|
||||||
if(theSnapShotName == "romname")
|
if(theSnapShotName == "romname")
|
||||||
|
@ -1094,6 +1180,9 @@ void takeSnapshot()
|
||||||
cerr << "Snapshot saved as " << filename << endl;
|
cerr << "Snapshot saved as " << filename << endl;
|
||||||
else
|
else
|
||||||
cerr << "Couldn't create snapshot " << filename << endl;
|
cerr << "Couldn't create snapshot " << filename << endl;
|
||||||
|
#else
|
||||||
|
cerr << "Snapshot mode not supported.\n";
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1134,7 +1223,7 @@ uInt32 maxWindowSizeForScreen()
|
||||||
}
|
}
|
||||||
|
|
||||||
if(found)
|
if(found)
|
||||||
return multiplier;
|
return (multiplier > 4 ? 4 : multiplier);
|
||||||
else
|
else
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -1155,18 +1244,20 @@ 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",
|
" -zoom <size> Makes window be 'size' times normal (1 - 4)",
|
||||||
" -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",
|
||||||
" -volume <number> Set the volume from 0 to 100",
|
" -volume <number> Set the volume (0 - 100)",
|
||||||
" -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",
|
||||||
" -showinfo Shows some game info on exit",
|
" -showinfo Shows some game info on exit",
|
||||||
|
#ifdef HAVE_PNG
|
||||||
" -ssdir <path> The directory to save snapshot files to",
|
" -ssdir <path> The directory to save snapshot files to",
|
||||||
" -ssname <name> How to name the snapshot (romname or md5sum)",
|
" -ssname <name> How to name the snapshot (romname or md5sum)",
|
||||||
" -sssingle Generate single snapshot instead of many",
|
" -sssingle Generate single snapshot instead of many",
|
||||||
|
#endif
|
||||||
" -pro <props file> Use the given properties file instead of stella.pro",
|
" -pro <props file> Use the given properties file instead of stella.pro",
|
||||||
"",
|
"",
|
||||||
0
|
0
|
||||||
|
@ -1295,7 +1386,7 @@ void handleCommandLineArguments(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
theShowInfoFlag = true;
|
theShowInfoFlag = true;
|
||||||
}
|
}
|
||||||
else if(string(argv[i]) == "-winsize")
|
else if(string(argv[i]) == "-zoom")
|
||||||
{
|
{
|
||||||
uInt32 size = atoi(argv[++i]);
|
uInt32 size = atoi(argv[++i]);
|
||||||
theWindowSize = size;
|
theWindowSize = size;
|
||||||
|
@ -1311,6 +1402,7 @@ void handleCommandLineArguments(int argc, char* argv[])
|
||||||
|
|
||||||
theDesiredVolume = volume;
|
theDesiredVolume = volume;
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_PNG
|
||||||
else if(string(argv[i]) == "-ssdir")
|
else if(string(argv[i]) == "-ssdir")
|
||||||
{
|
{
|
||||||
theSnapShotDir = argv[++i];
|
theSnapShotDir = argv[++i];
|
||||||
|
@ -1323,6 +1415,7 @@ void handleCommandLineArguments(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
theMultipleSnapShotFlag = false;
|
theMultipleSnapShotFlag = false;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
else if(string(argv[i]) == "-pro")
|
else if(string(argv[i]) == "-pro")
|
||||||
{
|
{
|
||||||
theAlternateProFile = argv[++i];
|
theAlternateProFile = argv[++i];
|
||||||
|
@ -1467,7 +1560,7 @@ void parseRCOptions(istream& in)
|
||||||
else if(option == 0)
|
else if(option == 0)
|
||||||
theShowInfoFlag = false;
|
theShowInfoFlag = false;
|
||||||
}
|
}
|
||||||
else if(key == "winsize")
|
else if(key == "zoom")
|
||||||
{
|
{
|
||||||
// They're setting the initial window size
|
// They're setting the initial window size
|
||||||
// Don't do bounds checking here, it will be taken care of later
|
// Don't do bounds checking here, it will be taken care of later
|
||||||
|
@ -1485,6 +1578,7 @@ void parseRCOptions(istream& in)
|
||||||
|
|
||||||
theDesiredVolume = volume;
|
theDesiredVolume = volume;
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_PNG
|
||||||
else if(key == "ssdir")
|
else if(key == "ssdir")
|
||||||
{
|
{
|
||||||
theSnapShotDir = value;
|
theSnapShotDir = value;
|
||||||
|
@ -1501,6 +1595,7 @@ void parseRCOptions(istream& in)
|
||||||
else if(option == 0)
|
else if(option == 0)
|
||||||
theMultipleSnapShotFlag = true;
|
theMultipleSnapShotFlag = true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1513,8 +1608,13 @@ void cleanup()
|
||||||
if(theConsole)
|
if(theConsole)
|
||||||
delete theConsole;
|
delete theConsole;
|
||||||
|
|
||||||
|
#ifdef HAVE_PNG
|
||||||
if(snapshot)
|
if(snapshot)
|
||||||
delete snapshot;
|
delete snapshot;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if(rectList)
|
||||||
|
delete rectList;
|
||||||
|
|
||||||
if(SDL_JoystickOpened(0))
|
if(SDL_JoystickOpened(0))
|
||||||
SDL_JoystickClose(theLeftJoystick);
|
SDL_JoystickClose(theLeftJoystick);
|
||||||
|
@ -1588,6 +1688,7 @@ int main(int argc, char* argv[])
|
||||||
gettimeofday(&startingTime, 0);
|
gettimeofday(&startingTime, 0);
|
||||||
|
|
||||||
uInt32 numberOfFrames = 0;
|
uInt32 numberOfFrames = 0;
|
||||||
|
uInt32 frameTime = 1000000 / theDesiredFrameRate;
|
||||||
for( ; ; ++numberOfFrames)
|
for( ; ; ++numberOfFrames)
|
||||||
{
|
{
|
||||||
// Exit if the user wants to quit
|
// Exit if the user wants to quit
|
||||||
|
@ -1613,10 +1714,9 @@ int main(int argc, char* argv[])
|
||||||
uInt32 delta = (uInt32)((after.tv_sec - before.tv_sec) * 1000000 +
|
uInt32 delta = (uInt32)((after.tv_sec - before.tv_sec) * 1000000 +
|
||||||
(after.tv_usec - before.tv_usec));
|
(after.tv_usec - before.tv_usec));
|
||||||
|
|
||||||
if(delta > (1000000 / theDesiredFrameRate))
|
if(delta > frameTime)
|
||||||
{
|
|
||||||
break;
|
break;
|
||||||
}
|
//else SDL_Delay(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,17 +13,14 @@
|
||||||
// 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.10 2002-02-23 16:05:52 stephena Exp $
|
// $Id: mainX11.cxx,v 1.11 2002-03-05 22:39:47 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <strstream>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
@ -603,10 +600,12 @@ void handleEvents()
|
||||||
{
|
{
|
||||||
resizeWindow(0);
|
resizeWindow(0);
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
else if((key == XK_F11) && (event.type == KeyPress))
|
else if((key == XK_F11) && (event.type == KeyPress))
|
||||||
{
|
{
|
||||||
toggleFullscreen();
|
toggleFullscreen();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
else if((key == XK_F12) && (event.type == KeyPress))
|
else if((key == XK_F12) && (event.type == KeyPress))
|
||||||
{
|
{
|
||||||
takeSnapshot();
|
takeSnapshot();
|
||||||
|
@ -699,10 +698,6 @@ void handleEvents()
|
||||||
cerr << "todo: Pause on minimize.\n";
|
cerr << "todo: Pause on minimize.\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(event.type == ClientMessage)
|
|
||||||
{
|
|
||||||
cerr << "todo: detect and deal with WM_DELETE_WINDOW message\n";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef LINUX_JOYSTICK
|
#ifdef LINUX_JOYSTICK
|
||||||
|
@ -846,7 +841,7 @@ void doQuit()
|
||||||
A '1' argument indicates that the window should increase in size, while '0'
|
A '1' argument indicates that the window should increase in size, while '0'
|
||||||
indicates that the windows should decrease in size.
|
indicates that the windows should decrease in size.
|
||||||
Can't resize in fullscreen mode. Will only resize up to the maximum size
|
Can't resize in fullscreen mode. Will only resize up to the maximum size
|
||||||
for the '-winsize' argument.
|
for the '-zoom' argument.
|
||||||
*/
|
*/
|
||||||
void resizeWindow(int mode)
|
void resizeWindow(int mode)
|
||||||
{
|
{
|
||||||
|
@ -927,11 +922,7 @@ void centerWindow()
|
||||||
*/
|
*/
|
||||||
void toggleFullscreen()
|
void toggleFullscreen()
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
// code not yet written
|
|
||||||
#else
|
|
||||||
cerr << "Fullscreen mode not supported.\n";
|
cerr << "Fullscreen mode not supported.\n";
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1028,6 +1019,7 @@ bool createCursors()
|
||||||
the 'ssname' argument. If that name exists, they are named as "Name"_x.png,
|
the 'ssname' argument. If that name exists, they are named as "Name"_x.png,
|
||||||
where x starts with 1 and increases if the previous name already exists.
|
where x starts with 1 and increases if the previous name already exists.
|
||||||
All spaces in filenames are converted to underscore '_'.
|
All spaces in filenames are converted to underscore '_'.
|
||||||
|
If theMultipleSnapShotFlag is false, then consecutive images are overwritten.
|
||||||
*/
|
*/
|
||||||
void takeSnapshot()
|
void takeSnapshot()
|
||||||
{
|
{
|
||||||
|
@ -1143,12 +1135,12 @@ void usage()
|
||||||
" -display <display> Connect to the designated X display",
|
" -display <display> Connect to the designated X display",
|
||||||
" -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",
|
" -zoom <size> Makes window be 'size' times normal (1 - 4)",
|
||||||
// " -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",
|
||||||
" -volume <number> Set the volume from 0 to 100",
|
" -volume <number> Set the volume (0 - 100)",
|
||||||
#ifdef LINUX_JOYSTICK
|
#ifdef LINUX_JOYSTICK
|
||||||
" -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",
|
||||||
|
@ -1291,7 +1283,7 @@ void handleCommandLineArguments(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
theShowInfoFlag = true;
|
theShowInfoFlag = true;
|
||||||
}
|
}
|
||||||
else if(string(argv[i]) == "-winsize")
|
else if(string(argv[i]) == "-zoom")
|
||||||
{
|
{
|
||||||
uInt32 size = atoi(argv[++i]);
|
uInt32 size = atoi(argv[++i]);
|
||||||
theWindowSize = size;
|
theWindowSize = size;
|
||||||
|
@ -1467,7 +1459,7 @@ void parseRCOptions(istream& in)
|
||||||
else if(option == 0)
|
else if(option == 0)
|
||||||
theShowInfoFlag = false;
|
theShowInfoFlag = false;
|
||||||
}
|
}
|
||||||
else if(key == "winsize")
|
else if(key == "zoom")
|
||||||
{
|
{
|
||||||
// They're setting the initial window size
|
// They're setting the initial window size
|
||||||
// Don't do bounds checking here, it will be taken care of later
|
// Don't do bounds checking here, it will be taken care of later
|
||||||
|
@ -1597,8 +1589,7 @@ int main(int argc, char* argv[])
|
||||||
gettimeofday(&startingTime, 0);
|
gettimeofday(&startingTime, 0);
|
||||||
|
|
||||||
uInt32 numberOfFrames = 0;
|
uInt32 numberOfFrames = 0;
|
||||||
// uInt32 delayFactor = int(60.0 / float(theDesiredFrameRate) * 9500);
|
uInt32 frameTime = 1000000 / theDesiredFrameRate;
|
||||||
|
|
||||||
for( ; ; ++numberOfFrames)
|
for( ; ; ++numberOfFrames)
|
||||||
{
|
{
|
||||||
// Exit if the user wants to quit
|
// Exit if the user wants to quit
|
||||||
|
@ -1624,16 +1615,8 @@ int main(int argc, char* argv[])
|
||||||
uInt32 delta = (uInt32)((after.tv_sec - before.tv_sec) * 1000000 +
|
uInt32 delta = (uInt32)((after.tv_sec - before.tv_sec) * 1000000 +
|
||||||
(after.tv_usec - before.tv_usec));
|
(after.tv_usec - before.tv_usec));
|
||||||
|
|
||||||
if(delta > (1000000 / theDesiredFrameRate))
|
if(delta > frameTime)
|
||||||
{
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
/* else
|
|
||||||
{
|
|
||||||
after.tv_sec = 0;
|
|
||||||
after.tv_usec = delayFactor - delta;
|
|
||||||
select(0, NULL, NULL, NULL, &after);
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1658,4 +1641,5 @@ int main(int argc, char* argv[])
|
||||||
|
|
||||||
// Cleanup time ...
|
// Cleanup time ...
|
||||||
cleanup();
|
cleanup();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue