mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-10 03:40:25 +00:00
Added constructor, destructor. Made some variables and methods public. Removed toggleMouseGrab (now in events). Added feature methods. Fixed missing code for displayMessageOnOSD.
svn-id: r49472
This commit is contained in:
parent
eee8e6960e
commit
280c18f96e
@ -24,6 +24,7 @@
|
||||
*/
|
||||
|
||||
#include "backends/graphics/sdl/sdl-graphics.h"
|
||||
#include "common/config-manager.h"
|
||||
#include "common/mutex.h"
|
||||
#include "common/util.h"
|
||||
#ifdef USE_RGB_COLOR
|
||||
@ -85,6 +86,150 @@ static const int s_gfxModeSwitchTable[][4] = {
|
||||
static int cursorStretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, int srcY, int origSrcY);
|
||||
#endif
|
||||
|
||||
AspectRatio::AspectRatio(int w, int h) {
|
||||
// TODO : Validation and so on...
|
||||
// Currently, we just ensure the program don't instantiate non-supported aspect ratios
|
||||
_kw = w;
|
||||
_kh = h;
|
||||
}
|
||||
|
||||
#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) && defined(USE_SCALERS)
|
||||
static const size_t AR_COUNT = 4;
|
||||
static const char* desiredAspectRatioAsStrings[AR_COUNT] = { "auto", "4/3", "16/9", "16/10" };
|
||||
static const AspectRatio desiredAspectRatios[AR_COUNT] = { AspectRatio(0, 0), AspectRatio(4,3), AspectRatio(16,9), AspectRatio(16,10) };
|
||||
|
||||
static AspectRatio getDesiredAspectRatio() {
|
||||
//TODO : We could parse an arbitrary string, if we code enough proper validation
|
||||
Common::String desiredAspectRatio = ConfMan.get("desired_screen_aspect_ratio");
|
||||
|
||||
for (size_t i = 0; i < AR_COUNT; i++) {
|
||||
assert(desiredAspectRatioAsStrings[i] != NULL);
|
||||
|
||||
if (!scumm_stricmp(desiredAspectRatio.c_str(), desiredAspectRatioAsStrings[i])) {
|
||||
return desiredAspectRatios[i];
|
||||
}
|
||||
}
|
||||
// TODO : Report a warning
|
||||
return AspectRatio(0, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
SdlGraphicsManager::SdlGraphicsManager()
|
||||
:
|
||||
#ifdef USE_OSD
|
||||
_osdSurface(0), _osdAlpha(SDL_ALPHA_TRANSPARENT), _osdFadeStartTime(0),
|
||||
#endif
|
||||
_hwscreen(0), _screen(0), _tmpscreen(0),
|
||||
#ifdef USE_RGB_COLOR
|
||||
_screenFormat(Graphics::PixelFormat::createFormatCLUT8()),
|
||||
_cursorFormat(Graphics::PixelFormat::createFormatCLUT8()),
|
||||
#endif
|
||||
_overlayVisible(false),
|
||||
_overlayscreen(0), _tmpscreen2(0),
|
||||
_scalerProc(0), _modeChanged(false), _screenChangeCount(0),
|
||||
_mouseVisible(false), _mouseNeedsRedraw(false), _mouseData(0), _mouseSurface(0),
|
||||
_mouseOrigSurface(0), _cursorTargetScale(1), _cursorPaletteDisabled(true),
|
||||
_currentShakePos(0), _newShakePos(0),
|
||||
_paletteDirtyStart(0), _paletteDirtyEnd(0),
|
||||
_screenIsLocked(false),
|
||||
_graphicsMutex(0), _transactionMode(kTransactionNone) {
|
||||
|
||||
if (SDL_InitSubSystem(SDL_INIT_VIDEO) == -1) {
|
||||
error("Could not initialize SDL: %s", SDL_GetError());
|
||||
}
|
||||
|
||||
// allocate palette storage
|
||||
_currentPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256);
|
||||
_cursorPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256);
|
||||
|
||||
_mouseBackup.x = _mouseBackup.y = _mouseBackup.w = _mouseBackup.h = 0;
|
||||
|
||||
memset(&_mouseCurState, 0, sizeof(_mouseCurState));
|
||||
|
||||
_graphicsMutex = g_system->createMutex();
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
if (ConfMan.hasKey("use_GDI") && ConfMan.getBool("use_GDI")) {
|
||||
SDL_VideoInit("windib", 0);
|
||||
sdlFlags ^= SDL_INIT_VIDEO;
|
||||
}
|
||||
#endif
|
||||
|
||||
SDL_ShowCursor(SDL_DISABLE);
|
||||
|
||||
memset(&_oldVideoMode, 0, sizeof(_oldVideoMode));
|
||||
memset(&_videoMode, 0, sizeof(_videoMode));
|
||||
memset(&_transactionDetails, 0, sizeof(_transactionDetails));
|
||||
|
||||
#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) && defined(USE_SCALERS)
|
||||
_videoMode.mode = GFX_DOUBLESIZE;
|
||||
_videoMode.scaleFactor = 2;
|
||||
_videoMode.aspectRatioCorrection = ConfMan.getBool("aspect_ratio");
|
||||
_videoMode.desiredAspectRatio = getDesiredAspectRatio();
|
||||
_scalerProc = Normal2x;
|
||||
#else // for small screen platforms
|
||||
_videoMode.mode = GFX_NORMAL;
|
||||
_videoMode.scaleFactor = 1;
|
||||
_videoMode.aspectRatioCorrection = false;
|
||||
_scalerProc = Normal1x;
|
||||
#endif
|
||||
_scalerType = 0;
|
||||
|
||||
#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__)
|
||||
_videoMode.fullscreen = ConfMan.getBool("fullscreen");
|
||||
#else
|
||||
_videoMode.fullscreen = true;
|
||||
#endif
|
||||
}
|
||||
|
||||
SdlGraphicsManager::~SdlGraphicsManager() {
|
||||
unloadGFXMode();
|
||||
g_system->deleteMutex(_graphicsMutex);
|
||||
|
||||
free(_currentPalette);
|
||||
free(_cursorPalette);
|
||||
free(_mouseData);
|
||||
}
|
||||
|
||||
bool SdlGraphicsManager::hasFeature(OSystem::Feature f) {
|
||||
return
|
||||
(f == OSystem::kFeatureFullscreenMode) ||
|
||||
(f == OSystem::kFeatureAspectRatioCorrection) ||
|
||||
(f == OSystem::kFeatureAutoComputeDirtyRects) ||
|
||||
(f == OSystem::kFeatureCursorHasPalette) ||
|
||||
(f == OSystem::kFeatureIconifyWindow);
|
||||
}
|
||||
|
||||
void SdlGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) {
|
||||
switch (f) {
|
||||
case OSystem::kFeatureFullscreenMode:
|
||||
setFullscreenMode(enable);
|
||||
break;
|
||||
case OSystem::kFeatureAspectRatioCorrection:
|
||||
setAspectRatioCorrection(enable);
|
||||
break;
|
||||
case OSystem::kFeatureIconifyWindow:
|
||||
if (enable)
|
||||
SDL_WM_IconifyWindow();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool SdlGraphicsManager::getFeatureState(OSystem::Feature f) {
|
||||
assert (_transactionMode == kTransactionNone);
|
||||
|
||||
switch (f) {
|
||||
case OSystem::kFeatureFullscreenMode:
|
||||
return _videoMode.fullscreen;
|
||||
case OSystem::kFeatureAspectRatioCorrection:
|
||||
return _videoMode.aspectRatioCorrection;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const OSystem::GraphicsMode *SdlGraphicsManager::getSupportedGraphicsModes() const {
|
||||
return s_supportedGraphicsModes;
|
||||
}
|
||||
@ -1645,14 +1790,6 @@ static int cursorStretch200To240(uint8 *buf, uint32 pitch, int width, int height
|
||||
}
|
||||
#endif
|
||||
|
||||
// Move to events
|
||||
/*void SdlGraphicsManager::toggleMouseGrab() {
|
||||
if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF)
|
||||
SDL_WM_GrabInput(SDL_GRAB_ON);
|
||||
else
|
||||
SDL_WM_GrabInput(SDL_GRAB_OFF);
|
||||
}*/
|
||||
|
||||
void SdlGraphicsManager::undrawMouse() {
|
||||
const int x = _mouseBackup.x;
|
||||
const int y = _mouseBackup.y;
|
||||
@ -1883,7 +2020,7 @@ bool SdlGraphicsManager::handleScalerHotkeys(const SDL_KeyboardEvent &key) {
|
||||
#ifdef USE_OSD
|
||||
if (_osdSurface) {
|
||||
const char *newScalerName = 0;
|
||||
const GraphicsMode *g = getSupportedGraphicsModes();
|
||||
const OSystem::GraphicsMode *g = getSupportedGraphicsModes();
|
||||
while (g->name) {
|
||||
if (g->id == _videoMode.mode) {
|
||||
newScalerName = g->description;
|
||||
|
@ -36,6 +36,11 @@
|
||||
#include <SDL.h>
|
||||
#endif
|
||||
|
||||
#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__)
|
||||
// Uncomment this to enable the 'on screen display' code.
|
||||
#define USE_OSD 1
|
||||
#endif
|
||||
|
||||
enum {
|
||||
GFX_NORMAL = 0,
|
||||
GFX_DOUBLESIZE = 1,
|
||||
@ -68,14 +73,13 @@ public:
|
||||
SdlGraphicsManager();
|
||||
~SdlGraphicsManager();
|
||||
|
||||
bool hasGraphicsFeature(OSystem::Feature f);
|
||||
void setGraphicsFeatureState(OSystem::Feature f, bool enable);
|
||||
bool getGraphicsFeatureState(OSystem::Feature f);
|
||||
bool hasFeature(OSystem::Feature f);
|
||||
void setFeatureState(OSystem::Feature f, bool enable);
|
||||
bool getFeatureState(OSystem::Feature f);
|
||||
|
||||
const OSystem::GraphicsMode *getSupportedGraphicsModes() const;
|
||||
int getDefaultGraphicsMode() const;
|
||||
bool setGraphicsMode(int mode);
|
||||
bool setGraphicsMode(const char *name);
|
||||
int getGraphicsMode() const;
|
||||
|
||||
#ifdef USE_RGB_COLOR
|
||||
@ -116,6 +120,23 @@ public:
|
||||
}
|
||||
virtual int getScreenChangeID() const { return _screenChangeCount; }
|
||||
|
||||
#ifdef USE_OSD
|
||||
void displayMessageOnOSD(const char *msg);
|
||||
#endif
|
||||
|
||||
// Accessed from OSystem_SDL::pollEvent for EVENT_SCREEN_CHANGED
|
||||
// The way this event works should be changed
|
||||
bool _modeChanged;
|
||||
|
||||
// Accessed from OSystem_SDL::dispatchSDLEvent
|
||||
// A function here for toggling it should be made for this
|
||||
bool _forceFull;
|
||||
|
||||
bool handleScalerHotkeys(const SDL_KeyboardEvent &key); // Move this?
|
||||
bool isScalerHotkey(const Common::Event &event); // Move this?
|
||||
|
||||
void setMousePos(int x, int y);
|
||||
|
||||
protected:
|
||||
#ifdef USE_OSD
|
||||
SDL_Surface *_osdSurface;
|
||||
@ -187,7 +208,6 @@ protected:
|
||||
virtual void setGraphicsModeIntern(); // overloaded by CE backend
|
||||
|
||||
/** Force full redraw on next updateScreen */
|
||||
bool _forceFull;
|
||||
ScalerProc *_scalerProc;
|
||||
int _scalerType;
|
||||
int _transactionMode;
|
||||
@ -195,8 +215,6 @@ protected:
|
||||
bool _screenIsLocked;
|
||||
Graphics::Surface _framebuffer;
|
||||
|
||||
/** Current video mode flags (see DF_* constants) */
|
||||
bool _modeChanged;
|
||||
int _screenChangeCount;
|
||||
|
||||
enum {
|
||||
@ -208,8 +226,6 @@ protected:
|
||||
SDL_Rect _dirtyRectList[NUM_DIRTY_RECT];
|
||||
int _numDirtyRects;
|
||||
|
||||
void setMousePos(int x, int y);
|
||||
|
||||
struct MousePos {
|
||||
// The mouse position, using either virtual (game) or real
|
||||
// (overlay) coordinates.
|
||||
@ -288,11 +304,6 @@ protected:
|
||||
virtual bool saveScreenshot(const char *filename); // overloaded by CE backend
|
||||
|
||||
int effectiveScreenHeight() const;
|
||||
|
||||
void setupIcon();
|
||||
|
||||
bool handleScalerHotkeys(const SDL_KeyboardEvent &key); // Move to events?
|
||||
bool isScalerHotkey(const Common::Event &event); // Move to events?
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user