Changed behaviour of 'gl_fsmax' argument again. It's now a boolean,

which only applies to TIA mode (in fullscreen, of course).

Some code/debugging cleanups across the various FrameBuffer classes.

Finally fixed software rendering mode crashes.  It now works just as
well as OpenGL mode, with all dialog positioning working the same in
both.

Reactivated OpenGL filtering (GL_LINEAR and GL_NEAREST).  Only the TIA
image can be changed; the UI dialogs are always using GL_NEAREST).


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1579 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2008-12-28 21:01:55 +00:00
parent 829375de34
commit 3f81dd2c93
17 changed files with 165 additions and 249 deletions

View File

@ -605,8 +605,8 @@
</tr>
<tr>
<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><pre>-gl_fsmax &lt;0|1&gt;</pre></td>
<td>OpenGL mode only. Stretch TIA image while in fullscreen mode.</td>
</tr>
<tr>

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: FrameBufferGL.cxx,v 1.126 2008-12-27 23:27:32 stephena Exp $
// $Id: FrameBufferGL.cxx,v 1.127 2008-12-28 21:01:55 stephena Exp $
//============================================================================
#ifdef DISPLAY_OPENGL
@ -74,8 +74,6 @@ FrameBufferGL::FrameBufferGL(OSystem* osystem)
: FrameBuffer(osystem),
myTiaSurface(NULL),
myFilterParamName("GL_NEAREST"),
myWidthScaleFactor(1.0),
myHeightScaleFactor(1.0),
myHaveTexRectEXT(false),
myDirtyFlag(true)
{
@ -188,8 +186,6 @@ bool FrameBufferGL::loadFuncs()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool FrameBufferGL::initSubsystem(VideoMode& mode)
{
cerr << "FrameBufferGL::initSubsystem\n";
mySDLFlags |= SDL_OPENGL;
// Set up the OpenGL attributes
@ -244,8 +240,6 @@ string FrameBufferGL::about() const
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool FrameBufferGL::setVidMode(VideoMode& mode)
{
cerr << "setVidMode: w = " << mode.screen_w << ", h = " << mode.screen_h << endl;
bool inUIMode =
myOSystem->eventHandler().state() == EventHandler::S_LAUNCHER ||
myOSystem->eventHandler().state() == EventHandler::S_DEBUGGER;
@ -254,32 +248,19 @@ cerr << "setVidMode: w = " << mode.screen_w << ", h = " << mode.screen_h << endl
uInt32 baseWidth = mode.image_w / mode.gfxmode.zoom;
uInt32 baseHeight = mode.image_h / mode.gfxmode.zoom;
// FIXME - look at actual videomode type
// Normally, we just scale to the given zoom level
myWidthScaleFactor = (float) mode.gfxmode.zoom;
myHeightScaleFactor = (float) mode.gfxmode.zoom;
// Activate aspect ratio correction in TIA mode
int iaspect = myOSystem->settings().getInt("gl_aspect");
if(!inUIMode && iaspect < 100)
// Aspect ratio and fullscreen stretching only applies to the TIA
if(!inUIMode)
{
float aspectFactor = float(iaspect) / 100.0;
myWidthScaleFactor *= aspectFactor;
mode.image_w = (uInt16)(float(mode.image_w) * aspectFactor);
}
// Aspect ratio
int aspect = myOSystem->settings().getInt("gl_aspect");
if(aspect < 100)
mode.image_w = (uInt16)(float(mode.image_w * aspect) / 100.0);
// Activate stretching if its been requested in fullscreen mode
float stretchFactor = 1.0;
if(fullScreen() && (mode.image_w < mode.screen_w) &&
(mode.image_h < mode.screen_h))
{
const string& gl_fsmax = myOSystem->settings().getString("gl_fsmax");
// Only stretch in certain modes
if((gl_fsmax == "always") ||
(inUIMode && gl_fsmax == "ui") ||
(!inUIMode && gl_fsmax == "tia"))
// Fullscreen mode stretching
if(fullScreen() && myOSystem->settings().getBool("gl_fsmax") &&
(mode.image_w < mode.screen_w) && (mode.image_h < mode.screen_h))
{
float stretchFactor = 1.0;
float scaleX = float(mode.image_w) / mode.screen_w;
float scaleY = float(mode.image_h) / mode.screen_h;
@ -287,14 +268,13 @@ cerr << "setVidMode: w = " << mode.screen_w << ", h = " << mode.screen_h << endl
stretchFactor = float(mode.screen_w) / mode.image_w;
else
stretchFactor = float(mode.screen_h) / mode.image_h;
mode.image_w = (Uint16) (stretchFactor * mode.image_w);
mode.image_h = (Uint16) (stretchFactor * mode.image_h);
}
}
myWidthScaleFactor *= stretchFactor;
myHeightScaleFactor *= stretchFactor;
// Now re-calculate the dimensions
mode.image_w = (Uint16) (stretchFactor * mode.image_w);
mode.image_h = (Uint16) (stretchFactor * mode.image_h);
if(!fullScreen()) mode.screen_w = mode.image_w;
mode.image_x = (mode.screen_w - mode.image_w) >> 1;
mode.image_y = (mode.screen_h - mode.image_h) >> 1;
@ -390,6 +370,7 @@ cerr << "dimensions: " << (fullScreen() ? "(full)" : "") << endl
myTiaSurface = new FBSurfaceGL(*this, baseWidth>>1, baseHeight,
mode.image_w, mode.image_h);
myTiaSurface->setPos(mode.image_x, mode.image_y);
myTiaSurface->setFilter(myOSystem->settings().getString("gl_filter"));
}
// Make sure any old parts of the screen are erased
@ -474,14 +455,11 @@ void FrameBufferGL::drawMediaSource(bool fullRedraw)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FrameBufferGL::postFrameUpdate()
{
//static int FCOUNT = 0;
if(myDirtyFlag)
{
// Now show all changes made to the texture
SDL_GL_SwapBuffers();
myDirtyFlag = false;
//cerr << FCOUNT++ % 2 << " : SWAP buffers" << endl;
//cerr << "--------------------------------------------------------------------" << endl;
}
}
@ -494,34 +472,6 @@ void FrameBufferGL::enablePhosphor(bool enable, int blend)
myRedrawEntireFrame = true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FrameBufferGL::toggleFilter()
{
/*
if(myBuffer.filter == GL_NEAREST)
{
myBuffer.filter = GL_LINEAR;
myOSystem->settings().setString("gl_filter", "linear");
showMessage("Filtering: GL_LINEAR");
}
else
{
myBuffer.filter = GL_NEAREST;
myOSystem->settings().setString("gl_filter", "nearest");
showMessage("Filtering: GL_NEAREST");
}
p_glBindTexture(myBuffer.target, myBuffer.texture);
p_glTexParameteri(myBuffer.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
p_glTexParameteri(myBuffer.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
p_glTexParameteri(myBuffer.target, GL_TEXTURE_MAG_FILTER, myBuffer.filter);
p_glTexParameteri(myBuffer.target, GL_TEXTURE_MIN_FILTER, myBuffer.filter);
// The filtering has changed, so redraw the entire screen
myRedrawEntireFrame = true;
*/
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FBSurface* FrameBufferGL::createSurface(int w, int h, bool isBase) const
{
@ -561,8 +511,6 @@ FBSurfaceGL::FBSurfaceGL(FrameBufferGL& buffer,
myWidth(scaleWidth),
myHeight(scaleHeight)
{
//cerr << " FBSurfaceGL::FBSurfaceGL: w = " << baseWidth << ", h = " << baseHeight << " : " << this << endl;
// Fill buffer struct with valid data
// This changes depending on the texturing used
myTexCoord[0] = 0.0f;
@ -612,8 +560,6 @@ FBSurfaceGL::FBSurfaceGL(FrameBufferGL& buffer,
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FBSurfaceGL::~FBSurfaceGL()
{
//cerr << " FBSurfaceGL::~FBSurfaceGL(): myTexID = " << myTexID << " @ " << this << endl;
if(myTexture)
SDL_FreeSurface(myTexture);
@ -720,6 +666,8 @@ void FBSurfaceGL::drawBitmap(uInt32* bitmap, Int32 tx, Int32 ty,
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FBSurfaceGL::addDirtyRect(uInt32 x, uInt32 y, uInt32 w, uInt32 h)
{
// OpenGL mode doesn't make use of dirty rectangles
// It's faster to just update the entire surface
mySurfaceIsDirty = true;
}
@ -740,8 +688,6 @@ void FBSurfaceGL::setPos(uInt32 x, uInt32 y)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FBSurfaceGL::setWidth(uInt32 w)
{
//cerr << " BEFORE: w = " << myWidth <<", texcoord[2] = " << myTexCoord[2] << endl;
// This method can't be used with 'scaled' surface (aka TIA surfaces)
// That shouldn't really matter, though, as all the UI stuff isn't scaled,
// and it's the only thing that uses it
@ -751,15 +697,11 @@ void FBSurfaceGL::setWidth(uInt32 w)
myTexCoord[2] = (GLfloat) myWidth;
else
myTexCoord[2] = (GLfloat) myWidth / myTexWidth;
//cerr << " AFTER: w = " << myWidth <<", texcoord[2] = " << myTexCoord[2] << endl;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FBSurfaceGL::setHeight(uInt32 h)
{
//cerr << " BEFORE: h = " << myHeight <<", texcoord[3] = " << myTexCoord[3] << endl;
// This method can't be used with 'scaled' surface (aka TIA surfaces)
// That shouldn't really matter, though, as all the UI stuff isn't scaled,
// and it's the only thing that uses it
@ -769,22 +711,13 @@ void FBSurfaceGL::setHeight(uInt32 h)
myTexCoord[3] = (GLfloat) myHeight;
else
myTexCoord[3] = (GLfloat) myHeight / myTexHeight;
//cerr << " AFTER: h = " << myHeight <<", texcoord[3] = " << myTexCoord[3] << endl;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FBSurfaceGL::translateCoords(Int32& x, Int32& y) const
{
#if 1
x = x - myXOrig;
y = y - myYOrig;
#else
// Wow, what a mess :)
const GUI::Rect& image = myFB.imageRect();
x = (Int32) ((x - myXOrig - image.x()) / myWidthScaleFactor);
y = (Int32) ((y - myXOrig - image.y()) / myHeightScaleFactor);
#endif
x -= myXOrig;
y -= myYOrig;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -792,8 +725,6 @@ void FBSurfaceGL::update()
{
if(mySurfaceIsDirty)
{
//cerr << " --> FBSurfaceGL::update(): w = " << myWidth << ", h = " << myHeight << endl;
// Texturemap complete texture to surface so we have free scaling
// and antialiasing
p_glBindTexture(myTexTarget, myTexID);
@ -823,8 +754,6 @@ void FBSurfaceGL::update()
void FBSurfaceGL::free()
{
p_glDeleteTextures(1, &myTexID);
//cerr << " ==> FBSurfaceGL::free(): myTexID = " << myTexID << " @ " << this << endl;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -839,26 +768,10 @@ void FBSurfaceGL::reload()
// Basically, all that needs to be done is to re-call glTexImage2D with a
// new texture ID, so that's what we do here
/*
// Create an OpenGL texture from the SDL texture
const string& filter = myOSystem->settings().getString("gl_filter");
if(filter == "linear")
{
myBuffer.filter = GL_LINEAR;
myFilterParamName = "GL_LINEAR";
}
else if(filter == "nearest")
{
myBuffer.filter = GL_NEAREST;
myFilterParamName = "GL_NEAREST";
}
*/
p_glGenTextures(1, &myTexID);
p_glBindTexture(myTexTarget, myTexID);
p_glTexParameteri(myTexTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
p_glTexParameteri(myTexTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// p_glTexParameteri(myTexTarget, GL_TEXTURE_MIN_FILTER, myBuffer.filter);
// p_glTexParameteri(myTexTarget, GL_TEXTURE_MAG_FILTER, myBuffer.filter);
p_glTexParameteri(myTexTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
p_glTexParameteri(myTexTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
@ -868,10 +781,35 @@ void FBSurfaceGL::reload()
GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, myTexture->pixels);
p_glEnable(myTexTarget);
//cerr << " ==> FBSurfaceGL::reload(): myTexID = " << myTexID << " @ " << this << endl;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FBSurfaceGL::setFilter(const string& name)
{
// We only do GL_NEAREST or GL_LINEAR for now
GLint filter = GL_NEAREST;
if(name == "linear")
filter = GL_LINEAR;
p_glBindTexture(myTexTarget, myTexID);
p_glTexParameteri(myTexTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
p_glTexParameteri(myTexTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
p_glTexParameteri(myTexTarget, GL_TEXTURE_MIN_FILTER, filter);
p_glTexParameteri(myTexTarget, GL_TEXTURE_MAG_FILTER, filter);
// The filtering has changed, so redraw the entire screen
mySurfaceIsDirty = true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool FrameBufferGL::myLibraryLoaded = false;
#endif // DISPLAY_OPENGL
#if 0
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
GUI::Surface* FrameBufferGL::createSurface(int width, int height) const
@ -884,7 +822,6 @@ GUI::Surface* FrameBufferGL::createSurface(int width, int height) const
return data ? new GUI::Surface(width, height, data) : NULL;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FrameBufferGL::drawSurface(const GUI::Surface* surface, Int32 x, Int32 y)
{
@ -912,8 +849,3 @@ void FrameBufferGL::bytesToSurface(GUI::Surface* surface, int row,
*pixels++ = SDL_MapRGB(s->format, data[c], data[c+1], data[c+2]);
}
#endif
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool FrameBufferGL::myLibraryLoaded = false;
#endif // DISPLAY_OPENGL

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: FrameBufferGL.hxx,v 1.65 2008-12-27 23:27:32 stephena Exp $
// $Id: FrameBufferGL.hxx,v 1.66 2008-12-28 21:01:55 stephena Exp $
//============================================================================
#ifndef FRAMEBUFFER_GL_HXX
@ -35,7 +35,7 @@ class FBSurfaceGL;
This class implements an SDL OpenGL framebuffer.
@author Stephen Anthony
@version $Id: FrameBufferGL.hxx,v 1.65 2008-12-27 23:27:32 stephena Exp $
@version $Id: FrameBufferGL.hxx,v 1.66 2008-12-28 21:01:55 stephena Exp $
*/
class FrameBufferGL : public FrameBuffer
{
@ -126,12 +126,6 @@ class FrameBufferGL : public FrameBuffer
*/
FBSurface* createSurface(int w, int h, bool useBase = false) const;
/**
Switches between the two filtering options in OpenGL.
Currently, these are GL_NEAREST and GL_LINEAR.
*/
void toggleFilter();
/**
This method should be called anytime the MediaSource needs to be redrawn
to the screen (full indicating that a full redraw is required).
@ -168,9 +162,6 @@ class FrameBufferGL : public FrameBuffer
// The name of the texture filtering to use
string myFilterParamName;
// The amount by which to scale the image in each dimension in fullscreen mode
float myWidthScaleFactor, myHeightScaleFactor;
// Optional GL extensions that may increase performance
bool myHaveTexRectEXT;
@ -185,7 +176,7 @@ class FrameBufferGL : public FrameBuffer
A surface suitable for OpenGL rendering mode.
@author Stephen Anthony
@version $Id: FrameBufferGL.hxx,v 1.65 2008-12-27 23:27:32 stephena Exp $
@version $Id: FrameBufferGL.hxx,v 1.66 2008-12-28 21:01:55 stephena Exp $
*/
class FBSurfaceGL : public FBSurface
{
@ -215,6 +206,8 @@ class FBSurfaceGL : public FBSurface
void reload();
private:
void setFilter(const string& name);
inline void* pixels() const { return myTexture->pixels; }
inline uInt32 pitch() const { return myPitch; }
@ -231,15 +224,12 @@ class FBSurfaceGL : public FBSurface
SDL_Surface* myTexture;
GLuint myTexID;
GLenum myTexTarget;
GLsizei myTexWidth;
GLsizei myTexHeight;
GLfloat myTexCoord[4];
GLenum myTexTarget;
GLint myTexFilter;
uInt32 myXOrig, myYOrig;
uInt32 myWidth, myHeight;
uInt32 myXOrig, myYOrig, myWidth, myHeight;
bool mySurfaceIsDirty;
uInt32 myPitch;
};

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: FrameBufferSoft.cxx,v 1.85 2008-12-27 23:27:32 stephena Exp $
// $Id: FrameBufferSoft.cxx,v 1.86 2008-12-28 21:01:55 stephena Exp $
//============================================================================
#include <sstream>
@ -102,19 +102,32 @@ bool FrameBufferSoft::setVidMode(VideoMode& mode)
myFormat = myScreen->format;
myBytesPerPixel = myFormat->BytesPerPixel;
// Make sure drawMediaSource() knows which renderer to use
switch(myBytesPerPixel)
{
case 2: // 16-bit
myPitch = myScreen->pitch >> 1;
myRenderType = myUsePhosphor ? kPhosphor_16 : kSoftZoom_16;
break;
case 3: // 24-bit
myPitch = myScreen->pitch;
myRenderType = myUsePhosphor ? kPhosphor_24 : kSoftZoom_24;
break;
case 4: // 32-bit
myPitch = myScreen->pitch >> 2;
myRenderType = myUsePhosphor ? kPhosphor_32 : kSoftZoom_32;
break;
}
myBaseOffset = mode.image_y * myPitch + mode.image_x;
// If software mode can open the given screen, it will always be in the
// requested format, or not at all; we only update mode when the screen
// is successfully created
mode.screen_w = myScreen->w;
mode.screen_h = myScreen->h;
myZoomLevel = mode.gfxmode.zoom;
// FIXME - look at gfxmode directly
// Make sure drawMediaSource() knows which renderer to use
stateChanged(myOSystem->eventHandler().state());
myBaseOffset = mode.image_y * myPitch + mode.image_x;
// Erase old rects, since they've probably been scaled for
// a different sized screen
myRectList->start();
@ -376,11 +389,12 @@ void FrameBufferSoft::postFrameUpdate()
{
if(myTiaDirty && !myInUIMode)
{
SDL_Flip(myScreen);
SDL_UpdateRect(myScreen, 0, 0, 0, 0);
myTiaDirty = false;
}
else if(myRectList->numRects() > 0)
{
//myRectList->print(myScreen->w, myScreen->h);
SDL_UpdateRects(myScreen, myRectList->numRects(), myRectList->rects());
}
myRectList->start();
@ -392,37 +406,26 @@ void FrameBufferSoft::enablePhosphor(bool enable, int blend)
myUsePhosphor = enable;
myPhosphorBlend = blend;
stateChanged(myOSystem->eventHandler().state());
// Make sure drawMediaSource() knows which renderer to use
switch(myBytesPerPixel)
{
case 2: // 16-bit
myRenderType = myUsePhosphor ? kPhosphor_16 : kSoftZoom_16;
break;
case 3: // 24-bit
myRenderType = myUsePhosphor ? kPhosphor_24 : kSoftZoom_24;
break;
case 4: // 32-bit
myRenderType = myUsePhosphor ? kPhosphor_32 : kSoftZoom_32;
break;
}
myRedrawEntireFrame = true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FrameBufferSoft::stateChanged(EventHandler::State state)
{
if(!myScreen)
return;
myInUIMode = (state == EventHandler::S_LAUNCHER ||
state == EventHandler::S_DEBUGGER);
// Make sure drawMediaSource() knows which renderer to use
switch(myBytesPerPixel)
{
case 2: // 16-bit
myPitch = myScreen->pitch >> 1;
myRenderType = myUsePhosphor ? kPhosphor_16 : kSoftZoom_16;
break;
case 3: // 24-bit
myPitch = myScreen->pitch;
myRenderType = myUsePhosphor ? kPhosphor_24 : kSoftZoom_24;
break;
case 4: // 32-bit
myPitch = myScreen->pitch >> 2;
myRenderType = myUsePhosphor ? kPhosphor_32 : kSoftZoom_32;
break;
}
// Have the changes take effect
refresh();
myRedrawEntireFrame = true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -594,7 +597,7 @@ void FBSurfaceSoft::drawChar(const GUI::Font* font, uInt8 chr,
case 2:
{
// Get buffer position where upper-left pixel of the character will be drawn
uInt16* buffer = (uInt16*) mySurface->pixels +
uInt16* buffer = (uInt16*) mySurface->pixels + myBaseOffset +
(ty + desc.ascent - bby - bbh) * myPitch +
tx + bbx;
@ -654,7 +657,7 @@ void FBSurfaceSoft::drawChar(const GUI::Font* font, uInt8 chr,
case 4:
{
// Get buffer position where upper-left pixel of the character will be drawn
uInt32* buffer = (uInt32*) mySurface->pixels +
uInt32* buffer = (uInt32*) mySurface->pixels + myBaseOffset +
(ty + desc.ascent - bby - bbh) * myPitch +
tx + bbx;
@ -702,6 +705,8 @@ void FBSurfaceSoft::drawBitmap(uInt32* bitmap, Int32 tx, Int32 ty,
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FBSurfaceSoft::addDirtyRect(uInt32 x, uInt32 y, uInt32 w, uInt32 h)
{
//cerr << " -> addDirtyRect: x = " << x << ", y = " << y << ", w = " << w << ", h = " << h << endl;
// Base surfaces use dirty-rectangle updates, since they can be quite
// large, and updating the entire surface each frame would be too slow
// Non-base surfaces are usually smaller, and can be updated entirely
@ -824,6 +829,9 @@ void FBSurfaceSoft::recalc()
}
#if 0
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FrameBufferSoft::drawSurface(const GUI::Surface* surface, Int32 x, Int32 y)

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: FrameBufferSoft.hxx,v 1.58 2008-12-27 23:27:32 stephena Exp $
// $Id: FrameBufferSoft.hxx,v 1.59 2008-12-28 21:01:55 stephena Exp $
//============================================================================
#ifndef FRAMEBUFFER_SOFT_HXX
@ -32,7 +32,7 @@ class RectList;
This class implements an SDL software framebuffer.
@author Stephen Anthony
@version $Id: FrameBufferSoft.hxx,v 1.58 2008-12-27 23:27:32 stephena Exp $
@version $Id: FrameBufferSoft.hxx,v 1.59 2008-12-28 21:01:55 stephena Exp $
*/
class FrameBufferSoft : public FrameBuffer
{
@ -114,12 +114,6 @@ class FrameBufferSoft : public FrameBuffer
*/
FBSurface* createSurface(int w, int h, bool useBase = false) const;
/**
Switches between the filtering options in software mode.
Currently, none exist.
*/
void toggleFilter() { /* No filter added yet */ }
/**
This method should be called anytime the MediaSource needs to be redrawn
to the screen (full indicating that a full redraw is required).
@ -172,7 +166,7 @@ class FrameBufferSoft : public FrameBuffer
A surface suitable for software rendering mode.
@author Stephen Anthony
@version $Id: FrameBufferSoft.hxx,v 1.58 2008-12-27 23:27:32 stephena Exp $
@version $Id: FrameBufferSoft.hxx,v 1.59 2008-12-28 21:01:55 stephena Exp $
*/
class FBSurfaceSoft : public FBSurface
{

View File

@ -13,10 +13,11 @@
// 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.4 2008-02-06 13:45:19 stephena Exp $
// $Id: RectList.cxx,v 1.5 2008-12-28 21:01:55 stephena Exp $
//============================================================================
#include <SDL.h>
#include "bspf.hxx"
#include "RectList.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -74,3 +75,21 @@ void RectList::start()
{
currentRect = 0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RectList::print(int boundWidth, int boundHeight)
{
cerr << "RectList: rects = " << numRects() << endl;
for(Uint32 i = 0; i < currentRect; ++i)
{
cerr << "Rect " << i << endl
<< " x = " << rectArray[i].x << endl
<< " y = " << rectArray[i].y << endl
<< " w = " << rectArray[i].w << endl
<< " h = " << rectArray[i].h << endl;
if((rectArray[i].x + rectArray[i].w) > boundWidth ||
(rectArray[i].y + rectArray[i].h) > boundHeight)
cerr << " TOO LARGE" << endl;
cerr << endl;
}
}

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: RectList.hxx,v 1.4 2008-02-06 13:45:19 stephena Exp $
// $Id: RectList.hxx,v 1.5 2008-12-28 21:01:55 stephena Exp $
//============================================================================
#ifndef RECTLIST_HXX
@ -24,7 +24,7 @@
class RectList
{
public:
RectList(Uint32 size = 512);
RectList(Uint32 size = 256);
~RectList();
void add(SDL_Rect* rect);
@ -32,6 +32,7 @@ class RectList
SDL_Rect* rects();
Uint32 numRects();
void start();
void print(int boundWidth, int boundHeight);
private:
Uint32 currentSize, currentRect;

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: FrameBuffer.cxx,v 1.148 2008-12-27 23:27:32 stephena Exp $
// $Id: FrameBuffer.cxx,v 1.149 2008-12-28 21:01:55 stephena Exp $
//============================================================================
#include <algorithm>
@ -60,7 +60,6 @@ FrameBuffer::~FrameBuffer(void)
// Free all allocated surfaces
while(!mySurfaceList.empty())
{
//cerr << " delete id = " << (*mySurfaceList.begin()).first << ", " << (*mySurfaceList.begin()).second << endl;
delete (*mySurfaceList.begin()).second;
mySurfaceList.erase(mySurfaceList.begin());
}
@ -88,8 +87,6 @@ bool FrameBuffer::initialize(const string& title, uInt32 width, uInt32 height)
mySDLFlags = 0;
#endif
cerr << " <== FrameBuffer::initialize: w = " << width << ", h = " << height << endl;
// Set the available video modes for this framebuffer
setAvailableVidModes(width, height);
@ -372,8 +369,6 @@ inline void FrameBuffer::drawMessage()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FrameBuffer::refresh()
{
cerr << "FrameBuffer::refresh() : " << myOSystem->eventHandler().state() << endl;
// This method partly duplicates the behaviour in ::update()
// Here, however, make sure to redraw *all* surfaces applicable to the
// current EventHandler state
@ -592,8 +587,8 @@ bool FrameBuffer::changeVidMode(int direction)
if(saveModeChange)
myOSystem->settings().setString("tia_filter", vidmode.gfxmode.name);
myOSystem->eventHandler().handleResizeEvent();
refresh(); // _FIXME myOSystem->eventHandler().refreshDisplay(true);
myOSystem->eventHandler().handleResizeEvent(); // FIXME - this may no longer be required
refresh();
}
else
return false;

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: FrameBuffer.hxx,v 1.108 2008-12-27 23:27:32 stephena Exp $
// $Id: FrameBuffer.hxx,v 1.109 2008-12-28 21:01:55 stephena Exp $
//============================================================================
#ifndef FRAMEBUFFER_HXX
@ -91,7 +91,7 @@ enum {
turn drawn here as well.
@author Stephen Anthony
@version $Id: FrameBuffer.hxx,v 1.108 2008-12-27 23:27:32 stephena Exp $
@version $Id: FrameBuffer.hxx,v 1.109 2008-12-28 21:01:55 stephena Exp $
*/
class FrameBuffer
{
@ -365,11 +365,6 @@ class FrameBuffer
*/
virtual FBSurface* createSurface(int w, int h, bool useBase = false) const = 0;
/**
Switches between the filtering options in the video subsystem.
*/
virtual void toggleFilter() = 0;
/**
This method should be called anytime the MediaSource needs to be redrawn
to the screen (full indicating that a full redraw is required).
@ -549,7 +544,7 @@ class FrameBuffer
FrameBuffer type.
@author Stephen Anthony
@version $Id: FrameBuffer.hxx,v 1.108 2008-12-27 23:27:32 stephena Exp $
@version $Id: FrameBuffer.hxx,v 1.109 2008-12-28 21:01:55 stephena Exp $
*/
// Text alignment modes for drawString()
enum TextAlignment {

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: Settings.cxx,v 1.149 2008-07-22 14:54:39 stephena Exp $
// $Id: Settings.cxx,v 1.150 2008-12-28 21:01:55 stephena Exp $
//============================================================================
#include <cassert>
@ -41,7 +41,7 @@ Settings::Settings(OSystem* osystem)
// OpenGL specific options
setInternal("gl_filter", "nearest");
setInternal("gl_aspect", "100");
setInternal("gl_fsmax", "never");
setInternal("gl_fsmax", "false");
setInternal("gl_lib", "libGL.so");
setInternal("gl_vsync", "false");
setInternal("gl_texrect", "false");
@ -226,10 +226,6 @@ void Settings::validate()
i = getInt("gl_aspect");
if(i < 50 || i > 100)
setInternal("gl_aspect", "100");
s = getString("gl_fsmax");
if(s != "never" && s != "ui" && s != "tia" && s != "always")
setInternal("gl_fsmax", "never");
#endif
#ifdef SOUND_SUPPORT
@ -287,8 +283,7 @@ void Settings::usage()
<< " nearest Normal scaling (GL_NEAREST)\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"
<< " ui|tia\n"
<< " -gl_fsmax <1|0> Stretch GL image in fullscreen emulation mode\n"
<< " -gl_vsync <1|0> Enable synchronize to vertical blank interrupt\n"
<< " -gl_texrect <1|0> Enable GL_TEXTURE_RECTANGLE extension\n"
<< endl

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: Dialog.cxx,v 1.72 2008-12-27 23:27:32 stephena Exp $
// $Id: Dialog.cxx,v 1.73 2008-12-28 21:01:55 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -249,7 +249,7 @@ void Dialog::drawDialog()
if(_dirty)
{
cerr << "Dialog::drawDialog(): w = " << _w << ", h = " << _h << " @ " << &s << endl << endl;
// cerr << "Dialog::drawDialog(): w = " << _w << ", h = " << _h << " @ " << &s << endl << endl;
s.fillRect(_x+1, _y+1, _w-2, _h-2, kDlgColor);
s.box(_x, _y, _w, _h, kColor, kShadowColor);

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: DialogContainer.cxx,v 1.50 2008-12-27 23:27:32 stephena Exp $
// $Id: DialogContainer.cxx,v 1.51 2008-12-28 21:01:55 stephena Exp $
//============================================================================
#include "OSystem.hxx"
@ -28,8 +28,7 @@
DialogContainer::DialogContainer(OSystem* osystem)
: myOSystem(osystem),
myBaseDialog(NULL),
myTime(0),
myRefreshFlag(false)
myTime(0)
{
reset();
}
@ -98,7 +97,6 @@ void DialogContainer::draw(bool full)
myDialogStack[i]->setDirty();
myDialogStack[i]->drawDialog();
}
myRefreshFlag = false;
}
else if(!myDialogStack.empty())
{
@ -109,7 +107,6 @@ void DialogContainer::draw(bool full)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void DialogContainer::addDialog(Dialog* d)
{
cerr << "DialogContainer::addDialog : w = " << d->getWidth() << ", h = " << d->getHeight() << endl;
myDialogStack.push(d);
d->open();

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: DialogContainer.hxx,v 1.25 2008-12-27 23:27:32 stephena Exp $
// $Id: DialogContainer.hxx,v 1.26 2008-12-28 21:01:55 stephena Exp $
//============================================================================
#ifndef DIALOG_CONTAINER_HXX
@ -36,7 +36,7 @@ class OSystem;
a stack, and handles their events.
@author Stephen Anthony
@version $Id: DialogContainer.hxx,v 1.25 2008-12-27 23:27:32 stephena Exp $
@version $Id: DialogContainer.hxx,v 1.26 2008-12-28 21:01:55 stephena Exp $
*/
class DialogContainer
{
@ -143,11 +143,6 @@ class DialogContainer
*/
void reStack();
/**
Redraw all dialogs on the stack.
*/
void refresh() { myRefreshFlag = true; }
/**
Return the bottom-most dialog of this container.
*/
@ -171,9 +166,6 @@ class DialogContainer
// Indicates the most current time (in milliseconds) as set by updateTime()
int myTime;
// Indicates a full refresh of all dialogs is required
bool myRefreshFlag;
// For continuous 'key down' events
struct {
int ascii;

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: OptionsDialog.cxx,v 1.74 2008-12-26 21:39:17 stephena Exp $
// $Id: OptionsDialog.cxx,v 1.75 2008-12-28 21:01:55 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -119,7 +119,7 @@ OptionsDialog::OptionsDialog(OSystem* osystem, DialogContainer* parent,
int x = 0, y = 0, w, h;
// Now create all the dialogs attached to each menu button
w = 410; h = 300;
w = 410; h = 275;
myVideoDialog = new VideoDialog(osystem, parent, font, x, y, w, h);
w = 285; h = 200;

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: RomInfoWidget.cxx,v 1.9 2008-06-19 12:01:31 stephena Exp $
// $Id: RomInfoWidget.cxx,v 1.10 2008-12-28 21:01:55 stephena Exp $
//============================================================================
#include <cstring>
@ -68,6 +68,7 @@ void RomInfoWidget::loadConfig()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RomInfoWidget::setProperties(const Properties& props)
{
return;
myHaveProperties = true;
myProperties = props;
@ -82,6 +83,7 @@ void RomInfoWidget::setProperties(const Properties& props)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RomInfoWidget::clearProperties()
{
return;
myHaveProperties = myDrawSurface = false;
// Decide whether the information should be shown immediately

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: VideoDialog.cxx,v 1.57 2008-12-26 21:39:17 stephena Exp $
// $Id: VideoDialog.cxx,v 1.58 2008-12-28 21:01:55 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -109,18 +109,6 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent,
wid.push_back(myGLFilterPopup);
ypos += lineHeight + 4;
// GL FS stretch
items.clear();
items.push_back("Never", "never");
items.push_back("UI mode", "ui");
items.push_back("TIA mode", "tia");
items.push_back("Always", "always");
myGLStretchPopup = new PopUpWidget(this, font, xpos, ypos, pwidth, lineHeight,
items, "GL Stretch: ", lwidth);
wid.push_back(myGLStretchPopup);
ypos += lineHeight + 4;
// GL aspect ratio
myAspectRatioSlider =
new SliderWidget(this, font, xpos, ypos, pwidth, lineHeight,
@ -160,6 +148,12 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent,
wid.push_back(myColorLossCheckbox);
ypos += lineHeight + 4;
// GL FS stretch
myGLStretchCheckbox = new CheckboxWidget(this, font, xpos, ypos,
"GL FS Stretch");
wid.push_back(myGLStretchCheckbox);
ypos += lineHeight + 4;
// Use sync to vblank in OpenGL
myUseVSyncCheckbox = new CheckboxWidget(this, font, xpos, ypos,
"GL VSync");
@ -190,9 +184,9 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent,
// Disable certain functions when we know they aren't present
#ifndef DISPLAY_GL
myGLFilterPopup->clearFlags(WIDGET_ENABLED);
myGLStretchPopup->clearFlags(WIDGET_ENABLED);
myAspectRatioSlider->clearFlags(WIDGET_ENABLED);
myAspectRatioLabel->clearFlags(WIDGET_ENABLED);
myGLStretchCheckbox->clearFlags(WIDGET_ENABLED);
myUseVSyncCheckbox->clearFlags(WIDGET_ENABLED);
#endif
#ifndef WINDOWED_SUPPORT
@ -242,11 +236,6 @@ void VideoDialog::loadConfig()
instance().settings().getString("gl_filter"), "linear");
myGLFilterPopup->setEnabled(gl);
// GL stretch setting
myGLStretchPopup->setSelected(
instance().settings().getString("gl_fsmax"), "never");
myGLStretchPopup->setEnabled(gl);
// GL aspect ratio setting
myAspectRatioSlider->setValue(instance().settings().getInt("gl_aspect"));
myAspectRatioSlider->setEnabled(gl);
@ -267,6 +256,9 @@ void VideoDialog::loadConfig()
// PAL color-loss effect
myColorLossCheckbox->setState(instance().settings().getBool("colorloss"));
// GL stretch setting (item is enabled/disabled in ::handleFullscreenChange)
myGLStretchCheckbox->setState(instance().settings().getBool("gl_fsmax"));
// Use sync to vertical blank (GL mode only)
myUseVSyncCheckbox->setState(instance().settings().getBool("gl_vsync"));
myUseVSyncCheckbox->setEnabled(gl);
@ -293,9 +285,6 @@ void VideoDialog::saveConfig()
// GL Filter setting
instance().settings().setString("gl_filter", myGLFilterPopup->getSelectedTag());
// GL stretch setting
instance().settings().setString("gl_fsmax", myGLStretchPopup->getSelectedTag());
// GL aspect ratio setting
instance().settings().setString("gl_aspect", myAspectRatioLabel->getLabel());
@ -315,6 +304,9 @@ void VideoDialog::saveConfig()
// PAL color-loss effect
instance().settings().setBool("colorloss", myColorLossCheckbox->getState());
// GL stretch setting
instance().settings().setBool("gl_fsmax", myGLStretchCheckbox->getState());
// Use sync to vertical blank (GL mode only)
instance().settings().setBool("gl_vsync", myUseVSyncCheckbox->getState());
@ -338,7 +330,6 @@ void VideoDialog::setDefaults()
myTIAPalettePopup->setSelected("standard", "");
myFSResPopup->setSelected("auto", "");
myGLFilterPopup->setSelected("linear", "");
myGLStretchPopup->setSelected("never", "");
myAspectRatioSlider->setValue(100);
myAspectRatioLabel->setLabel("100");
myFrameRateSlider->setValue(0);
@ -346,6 +337,7 @@ void VideoDialog::setDefaults()
myFullscreenCheckbox->setState(false);
myColorLossCheckbox->setState(false);
myGLStretchCheckbox->setState(false);
myUseVSyncCheckbox->setState(true);
myCenterCheckbox->setState(true);
@ -359,6 +351,10 @@ void VideoDialog::handleFullscreenChange(bool enable)
#ifdef WINDOWED_SUPPORT
myFSResPopup->setEnabled(enable);
// GL stretch is only enabled in OpenGL mode
myGLStretchCheckbox->setEnabled(
enable && instance().frameBuffer().type() == kGLBuffer);
_dirty = true;
#endif
}

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: VideoDialog.hxx,v 1.25 2008-12-26 21:39:17 stephena Exp $
// $Id: VideoDialog.hxx,v 1.26 2008-12-28 21:01:55 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -56,7 +56,6 @@ class VideoDialog : public Dialog
PopUpWidget* myTIAPalettePopup;
PopUpWidget* myFSResPopup;
PopUpWidget* myGLFilterPopup;
PopUpWidget* myGLStretchPopup;
SliderWidget* myAspectRatioSlider;
StaticTextWidget* myAspectRatioLabel;
@ -64,6 +63,7 @@ class VideoDialog : public Dialog
StaticTextWidget* myFrameRateLabel;
CheckboxWidget* myFullscreenCheckbox;
CheckboxWidget* myColorLossCheckbox;
CheckboxWidget* myGLStretchCheckbox;
CheckboxWidget* myUseVSyncCheckbox;
CheckboxWidget* myCenterCheckbox;