mirror of https://github.com/stella-emu/stella.git
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:
parent
829375de34
commit
3f81dd2c93
|
@ -605,8 +605,8 @@
|
|||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><pre>-gl_fsmax <never|always|ui|tia></pre></td>
|
||||
<td>OpenGL mode only. Stretch fullscreen image while in the given mode.</td>
|
||||
<td><pre>-gl_fsmax <0|1></pre></td>
|
||||
<td>OpenGL mode only. Stretch TIA image while in fullscreen mode.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue