[Scummvm-cvs-logs] SF.net SVN: scummvm: [28520] scummvm/trunk/backends/platform/sdl
fingolfin at users.sourceforge.net
fingolfin at users.sourceforge.net
Sat Aug 11 10:44:43 CEST 2007
Revision: 28520
http://scummvm.svn.sourceforge.net/scummvm/?rev=28520&view=rev
Author: fingolfin
Date: 2007-08-11 01:44:43 -0700 (Sat, 11 Aug 2007)
Log Message:
-----------
SDL backend cleanup (minor)
Modified Paths:
--------------
scummvm/trunk/backends/platform/sdl/events.cpp
scummvm/trunk/backends/platform/sdl/graphics.cpp
scummvm/trunk/backends/platform/sdl/module.mk
scummvm/trunk/backends/platform/sdl/sdl.cpp
Added Paths:
-----------
scummvm/trunk/backends/platform/sdl/main.cpp
scummvm/trunk/backends/platform/sdl/sdl.h
Removed Paths:
-------------
scummvm/trunk/backends/platform/sdl/sdl-common.h
Modified: scummvm/trunk/backends/platform/sdl/events.cpp
===================================================================
--- scummvm/trunk/backends/platform/sdl/events.cpp 2007-08-11 08:31:26 UTC (rev 28519)
+++ scummvm/trunk/backends/platform/sdl/events.cpp 2007-08-11 08:44:43 UTC (rev 28520)
@@ -23,7 +23,7 @@
*
*/
-#include "backends/platform/sdl/sdl-common.h"
+#include "backends/platform/sdl/sdl.h"
#include "common/util.h"
#include "common/events.h"
Modified: scummvm/trunk/backends/platform/sdl/graphics.cpp
===================================================================
--- scummvm/trunk/backends/platform/sdl/graphics.cpp 2007-08-11 08:31:26 UTC (rev 28519)
+++ scummvm/trunk/backends/platform/sdl/graphics.cpp 2007-08-11 08:44:43 UTC (rev 28520)
@@ -23,7 +23,7 @@
*
*/
-#include "backends/platform/sdl/sdl-common.h"
+#include "backends/platform/sdl/sdl.h"
#include "common/util.h"
#include "graphics/font.h"
#include "graphics/fontman.h"
@@ -310,7 +310,6 @@
void OSystem_SDL::loadGFXMode() {
assert(_inited);
_forceFull = true;
- _modeFlags |= DF_UPDATE_EXPAND_1_PIXEL;
int hwW, hwH;
@@ -606,65 +605,55 @@
uint32 srcPitch, dstPitch;
SDL_Rect *lastRect = _dirtyRectList + _numDirtyRects;
- if (scalerProc == Normal1x && !_adjustAspectRatio && 0) {
- for (r = _dirtyRectList; r != lastRect; ++r) {
- dst = *r;
+ for (r = _dirtyRectList; r != lastRect; ++r) {
+ dst = *r;
+ dst.x++; // Shift rect by one since 2xSai needs to acces the data around
+ dst.y++; // any pixel to scale it, and we want to avoid mem access crashes.
- dst.y += _currentShakePos;
- if (SDL_BlitSurface(origSurf, r, _hwscreen, &dst) != 0)
- error("SDL_BlitSurface failed: %s", SDL_GetError());
- }
- } else {
- for (r = _dirtyRectList; r != lastRect; ++r) {
- dst = *r;
- dst.x++; // Shift rect by one since 2xSai needs to acces the data around
- dst.y++; // any pixel to scale it, and we want to avoid mem access crashes.
+ if (SDL_BlitSurface(origSurf, r, srcSurf, &dst) != 0)
+ error("SDL_BlitSurface failed: %s", SDL_GetError());
+ }
- if (SDL_BlitSurface(origSurf, r, srcSurf, &dst) != 0)
- error("SDL_BlitSurface failed: %s", SDL_GetError());
- }
+ SDL_LockSurface(srcSurf);
+ SDL_LockSurface(_hwscreen);
- SDL_LockSurface(srcSurf);
- SDL_LockSurface(_hwscreen);
+ srcPitch = srcSurf->pitch;
+ dstPitch = _hwscreen->pitch;
- srcPitch = srcSurf->pitch;
- dstPitch = _hwscreen->pitch;
+ for (r = _dirtyRectList; r != lastRect; ++r) {
+ register int dst_y = r->y + _currentShakePos;
+ register int dst_h = 0;
+ register int orig_dst_y = 0;
+ register int rx1 = r->x * scale1;
- for (r = _dirtyRectList; r != lastRect; ++r) {
- register int dst_y = r->y + _currentShakePos;
- register int dst_h = 0;
- register int orig_dst_y = 0;
- register int rx1 = r->x * scale1;
+ if (dst_y < height) {
+ dst_h = r->h;
+ if (dst_h > height - dst_y)
+ dst_h = height - dst_y;
- if (dst_y < height) {
- dst_h = r->h;
- if (dst_h > height - dst_y)
- dst_h = height - dst_y;
+ orig_dst_y = dst_y;
+ dst_y = dst_y * scale1;
- orig_dst_y = dst_y;
- dst_y = dst_y * scale1;
+ if (_adjustAspectRatio && !_overlayVisible)
+ dst_y = real2Aspect(dst_y);
- if (_adjustAspectRatio && !_overlayVisible)
- dst_y = real2Aspect(dst_y);
+ assert(scalerProc != NULL);
+ scalerProc((byte *)srcSurf->pixels + (r->x * 2 + 2) + (r->y + 1) * srcPitch, srcPitch,
+ (byte *)_hwscreen->pixels + rx1 * 2 + dst_y * dstPitch, dstPitch, r->w, dst_h);
+ }
- assert(scalerProc != NULL);
- scalerProc((byte *)srcSurf->pixels + (r->x * 2 + 2) + (r->y + 1) * srcPitch, srcPitch,
- (byte *)_hwscreen->pixels + rx1 * 2 + dst_y * dstPitch, dstPitch, r->w, dst_h);
- }
+ r->x = rx1;
+ r->y = dst_y;
+ r->w = r->w * scale1;
+ r->h = dst_h * scale1;
- r->x = rx1;
- r->y = dst_y;
- r->w = r->w * scale1;
- r->h = dst_h * scale1;
-
#ifndef DISABLE_SCALERS
- if (_adjustAspectRatio && orig_dst_y < height && !_overlayVisible)
- r->h = stretch200To240((uint8 *) _hwscreen->pixels, dstPitch, r->w, r->h, r->x, r->y, orig_dst_y * scale1);
+ if (_adjustAspectRatio && orig_dst_y < height && !_overlayVisible)
+ r->h = stretch200To240((uint8 *) _hwscreen->pixels, dstPitch, r->w, r->h, r->x, r->y, orig_dst_y * scale1);
#endif
- }
- SDL_UnlockSurface(srcSurf);
- SDL_UnlockSurface(_hwscreen);
}
+ SDL_UnlockSurface(srcSurf);
+ SDL_UnlockSurface(_hwscreen);
// Readjust the dirty rect list in case we are doing a full update.
// This is necessary if shaking is active.
@@ -893,7 +882,7 @@
// Extend the dirty region by 1 pixel for scalers
// that "smear" the screen, e.g. 2xSAI
- if ((_modeFlags & DF_UPDATE_EXPAND_1_PIXEL) && !realCoordinates) {
+ if (!realCoordinates) {
x--;
y--;
w+=2;
Added: scummvm/trunk/backends/platform/sdl/main.cpp
===================================================================
--- scummvm/trunk/backends/platform/sdl/main.cpp (rev 0)
+++ scummvm/trunk/backends/platform/sdl/main.cpp 2007-08-11 08:44:43 UTC (rev 28520)
@@ -0,0 +1,112 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "backends/platform/sdl/sdl.h"
+#include "base/main.h"
+
+#if defined(WIN32)
+#include <windows.h>
+// winnt.h defines ARRAYSIZE, but we want our own one...
+#undef ARRAYSIZE
+#endif
+
+#if defined(__SYMBIAN32__)
+#include "SymbianOs.h"
+#endif
+
+#if !defined(__MAEMO__) && !defined(_WIN32_WCE)
+
+#if defined (WIN32)
+int __stdcall WinMain(HINSTANCE /*hInst*/, HINSTANCE /*hPrevInst*/, LPSTR /*lpCmdLine*/, int /*iShowCmd*/) {
+ SDL_SetModuleHandle(GetModuleHandle(NULL));
+ return main(__argc, __argv);
+}
+#endif
+
+int main(int argc, char *argv[]) {
+
+#if defined(__SYMBIAN32__)
+ //
+ // Set up redirects for stdout/stderr under Windows and Symbian.
+ // Code copied from SDL_main.
+ //
+
+ // Symbian does not like any output to the console through any *print* function
+ char STDOUT_FILE[256], STDERR_FILE[256]; // shhh, don't tell anybody :)
+ strcpy(STDOUT_FILE, Symbian::GetExecutablePath());
+ strcpy(STDERR_FILE, Symbian::GetExecutablePath());
+ strcat(STDOUT_FILE, "scummvm.stdout.txt");
+ strcat(STDERR_FILE, "scummvm.stderr.txt");
+
+ /* Flush the output in case anything is queued */
+ fclose(stdout);
+ fclose(stderr);
+
+ /* Redirect standard input and standard output */
+ FILE *newfp = freopen(STDOUT_FILE, "w", stdout);
+ if (newfp == NULL) { /* This happens on NT */
+#if !defined(stdout)
+ stdout = fopen(STDOUT_FILE, "w");
+#else
+ newfp = fopen(STDOUT_FILE, "w");
+ if (newfp) {
+ *stdout = *newfp;
+ }
+#endif
+ }
+ newfp = freopen(STDERR_FILE, "w", stderr);
+ if (newfp == NULL) { /* This happens on NT */
+#if !defined(stderr)
+ stderr = fopen(STDERR_FILE, "w");
+#else
+ newfp = fopen(STDERR_FILE, "w");
+ if (newfp) {
+ *stderr = *newfp;
+ }
+#endif
+ }
+ setbuf(stderr, NULL); /* No buffering */
+
+#endif // defined(__SYMBIAN32__)
+
+ // Create our OSystem instance
+#if defined(__SYMBIAN32__)
+ g_system = new OSystem_SDL_Symbian();
+#else
+ g_system = new OSystem_SDL();
+#endif
+ assert(g_system);
+
+#ifdef DYNAMIC_MODULES
+ PluginManager::instance().addPluginProvider(new SDLPluginProvider());
+#endif
+
+ // Invoke the actual ScummVM main entry point:
+ int res = scummvm_main(argc, argv);
+ g_system->quit(); // TODO: Consider removing / replacing this!
+ return res;
+}
+
+#endif
Property changes on: scummvm/trunk/backends/platform/sdl/main.cpp
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:keywords
+ Date Rev Author URL Id
Name: svn:eol-style
+ native
Modified: scummvm/trunk/backends/platform/sdl/module.mk
===================================================================
--- scummvm/trunk/backends/platform/sdl/module.mk 2007-08-11 08:31:26 UTC (rev 28519)
+++ scummvm/trunk/backends/platform/sdl/module.mk 2007-08-11 08:44:43 UTC (rev 28520)
@@ -3,6 +3,7 @@
MODULE_OBJS := \
events.o \
graphics.o \
+ main.o \
sdl.o
MODULE_DIRS += \
Deleted: scummvm/trunk/backends/platform/sdl/sdl-common.h
===================================================================
--- scummvm/trunk/backends/platform/sdl/sdl-common.h 2007-08-11 08:31:26 UTC (rev 28519)
+++ scummvm/trunk/backends/platform/sdl/sdl-common.h 2007-08-11 08:44:43 UTC (rev 28520)
@@ -1,416 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifndef SDL_COMMON_H
-#define SDL_COMMON_H
-
-#include <SDL.h>
-
-#include "common/stdafx.h"
-#include "common/scummsys.h"
-#include "common/system.h"
-#include "graphics/scaler.h"
-#include "backends/intern.h"
-
-
-namespace Audio {
- class Mixer;
-}
-
-namespace Common {
- class SaveFileManager;
- class TimerManager;
-}
-
-#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,
- GFX_TRIPLESIZE = 2,
- GFX_2XSAI = 3,
- GFX_SUPER2XSAI = 4,
- GFX_SUPEREAGLE = 5,
- GFX_ADVMAME2X = 6,
- GFX_ADVMAME3X = 7,
- GFX_HQ2X = 8,
- GFX_HQ3X = 9,
- GFX_TV2X = 10,
- GFX_DOTMATRIX = 11
-};
-
-
-class OSystem_SDL : public OSystem {
-public:
- OSystem_SDL();
- virtual ~OSystem_SDL();
-
- virtual void initBackend();
-
- void beginGFXTransaction(void);
- void endGFXTransaction(void);
-
- // Set the size of the video bitmap.
- // Typically, 320x200
- virtual void initSize(uint w, uint h); // overloaded by CE backend
-
- virtual int getScreenChangeID() const { return _screenChangeCount; }
-
- // Set colors of the palette
- void setPalette(const byte *colors, uint start, uint num);
-
- // Get colors of the palette
- void grabPalette(byte *colors, uint start, uint num);
-
- // Draw a bitmap to screen.
- // The screen will not be updated to reflect the new bitmap
- virtual void copyRectToScreen(const byte *src, int pitch, int x, int y, int w, int h); // overloaded by CE backend (FIXME)
-
- virtual Graphics::Surface *lockScreen();
- virtual void unlockScreen();
-
- // Update the dirty areas of the screen
- void updateScreen();
-
- // Either show or hide the mouse cursor
- bool showMouse(bool visible);
-
- // Warp the mouse cursor. Where set_mouse_pos() only informs the
- // backend of the mouse cursor's current position, this function
- // actually moves the cursor to the specified position.
- virtual void warpMouse(int x, int y); // overloaded by CE backend (FIXME)
-
- // Set the bitmap that's used when drawing the cursor.
- virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, byte keycolor, int cursorTargetScale); // overloaded by CE backend (FIXME)
-
- // Set colors of cursor palette
- void setCursorPalette(const byte *colors, uint start, uint num);
-
- // Disables or enables cursor palette
- void disableCursorPalette(bool disable) {
- _cursorPaletteDisabled = disable;
- blitCursor();
- }
-
- // Shaking is used in SCUMM. Set current shake position.
- void setShakePos(int shake_pos);
-
- // Get the number of milliseconds since the program was started.
- uint32 getMillis();
-
- // Delay for a specified amount of milliseconds
- void delayMillis(uint msecs);
-
- // Get the next event.
- // Returns true if an event was retrieved.
- virtual bool pollEvent(Common::Event &event); // overloaded by CE backend
-
- // Set function that generates samples
- typedef void (*SoundProc)(void *param, byte *buf, int len);
- virtual bool setSoundCallback(SoundProc proc, void *param); // overloaded by CE backend
- virtual Audio::Mixer *getMixer();
-
- // Poll CD status
- // Returns true if cd audio is playing
- bool pollCD();
-
- // Play CD audio track
- void playCD(int track, int num_loops, int start_frame, int duration);
-
- // Stop CD audio track
- void stopCD();
-
- // Update CD audio status
- void updateCD();
-
- // Quit
- virtual void quit(); // overloaded by CE backend
-
- virtual Common::TimerManager *getTimerManager();
-
- // Mutex handling
- MutexRef createMutex();
- void lockMutex(MutexRef mutex);
- void unlockMutex(MutexRef mutex);
- void deleteMutex(MutexRef mutex);
-
- // Overlay
- virtual void showOverlay(); // WinCE FIXME
- virtual void hideOverlay(); // WinCE FIXME
- virtual void clearOverlay();
- virtual void grabOverlay(OverlayColor *buf, int pitch);
- virtual void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h); // WinCE FIXME
- virtual int16 getHeight();
- virtual int16 getWidth();
- virtual int16 getOverlayHeight() { return _overlayHeight; }
- virtual int16 getOverlayWidth() { return _overlayWidth; }
-
- // Methods that convert RGB to/from colors suitable for the overlay.
- virtual OverlayColor RGBToColor(uint8 r, uint8 g, uint8 b);
- virtual void colorToRGB(OverlayColor color, uint8 &r, uint8 &g, uint8 &b);
-
-
- virtual const GraphicsMode *getSupportedGraphicsModes() const;
- virtual int getDefaultGraphicsMode() const;
- virtual bool setGraphicsMode(int mode);
- virtual int getGraphicsMode() const;
-
- virtual void setWindowCaption(const char *caption);
- virtual bool openCD(int drive);
- virtual int getOutputSampleRate() const;
-
- virtual bool hasFeature(Feature f);
- virtual void setFeatureState(Feature f, bool enable);
- virtual bool getFeatureState(Feature f);
-
-#ifdef USE_OSD
- void displayMessageOnOSD(const char *msg);
-#endif
-
- virtual Common::SaveFileManager *getSavefileManager();
-
-protected:
- bool _inited;
-
-#ifdef USE_OSD
- SDL_Surface *_osdSurface;
- Uint8 _osdAlpha; // Transparency level of the OSD
- uint32 _osdFadeStartTime; // When to start the fade out
- enum {
- kOSDFadeOutDelay = 2 * 1000, // Delay before the OSD is faded out (in milliseconds)
- kOSDFadeOutDuration = 500, // Duration of the OSD fade out (in milliseconds)
- kOSDColorKey = 1,
- kOSDInitialAlpha = 80 // Initial alpha level, in percent
- };
-#endif
-
- // hardware screen
- SDL_Surface *_hwscreen;
-
- // unseen game screen
- SDL_Surface *_screen;
-
- // TODO: We could get rid of the following two vars and just use _screen instead
- int _screenWidth, _screenHeight;
-
- // temporary screen (for scalers)
- SDL_Surface *_tmpscreen;
- SDL_Surface *_tmpscreen2;
-
- // overlay
- SDL_Surface *_overlayscreen;
- int _overlayWidth, _overlayHeight;
- bool _overlayVisible;
-
- // Audio
- int _samplesPerSec;
-
- // CD Audio
- SDL_CD *_cdrom;
- int _cdTrack, _cdNumLoops, _cdStartFrame, _cdDuration;
- uint32 _cdEndTime, _cdStopTime;
-
- enum {
- DF_WANT_RECT_OPTIM = 1 << 0,
- DF_UPDATE_EXPAND_1_PIXEL = 1 << 1
- };
-
- enum {
- kTransactionNone = 0,
- kTransactionCommit = 1,
- kTransactionActive = 2
- };
-
- struct TransactionDetails {
- int mode;
- bool modeChanged;
- int w;
- int h;
- bool sizeChanged;
- bool fs;
- bool fsChanged;
- bool ar;
- bool arChanged;
- bool needHotswap;
- bool needUpdatescreen;
- bool needUnload;
- bool needToggle;
- bool normal1xScaler;
- };
- TransactionDetails _transactionDetails;
-
- /** Force full redraw on next updateScreen */
- bool _forceFull;
- ScalerProc *_scalerProc;
- int _scalerType;
- int _scaleFactor;
- int _mode;
- int _transactionMode;
- bool _fullscreen;
-
- bool _screenIsLocked;
- Graphics::Surface _framebuffer;
-
- /** Current video mode flags (see DF_* constants) */
- uint32 _modeFlags;
- bool _modeChanged;
- int _screenChangeCount;
-
- /** True if aspect ratio correction is enabled. */
- bool _adjustAspectRatio;
-
- enum {
- NUM_DIRTY_RECT = 100,
- MAX_SCALING = 3
- };
-
- // Dirty rect management
- SDL_Rect _dirtyRectList[NUM_DIRTY_RECT];
- int _numDirtyRects;
- uint32 *_dirtyChecksums;
- bool _cksumValid;
- int _cksumNum;
-
- // Keyboard mouse emulation. Disabled by fingolfin 2004-12-18.
- // I am keeping the rest of the code in for now, since the joystick
- // code (or rather, "hack") uses it, too.
- struct KbdMouse {
- int16 x, y, x_vel, y_vel, x_max, y_max, x_down_count, y_down_count;
- uint32 last_time, delay_time, x_down_time, y_down_time;
- };
-
- struct MousePos {
- // The mouse position, using either virtual (game) or real
- // (overlay) coordinates.
- int16 x, y;
-
- // The size and hotspot of the original cursor image.
- int16 w, h;
- int16 hotX, hotY;
-
- // The size and hotspot of the pre-scaled cursor image, in real
- // coordinates.
- int16 rW, rH;
- int16 rHotX, rHotY;
-
- // The size and hotspot of the pre-scaled cursor image, in game
- // coordinates.
- int16 vW, vH;
- int16 vHotX, vHotY;
-
- MousePos() : x(0), y(0), w(0), h(0), hotX(0), hotY(0),
- rW(0), rH(0), rHotX(0), rHotY(0), vW(0), vH(0),
- vHotX(0), vHotY(0)
- { }
- };
-
- // mouse
- KbdMouse _km;
- bool _mouseVisible;
- bool _mouseDrawn;
- byte *_mouseData;
- SDL_Rect _mouseBackup;
- MousePos _mouseCurState;
- byte _mouseKeyColor;
- int _cursorTargetScale;
- bool _cursorPaletteDisabled;
- SDL_Surface *_mouseOrigSurface;
- SDL_Surface *_mouseSurface;
- enum {
- kMouseColorKey = 1
- };
-
- // joystick
- SDL_Joystick *_joystick;
-
- // Shake mode
- int _currentShakePos;
- int _newShakePos;
-
- // Palette data
- SDL_Color *_currentPalette;
- uint _paletteDirtyStart, _paletteDirtyEnd;
-
- // Cursor palette data
- SDL_Color *_cursorPalette;
-
- /**
- * Mutex which prevents multiple threads from interfering with each other
- * when accessing the screen.
- */
- MutexRef _graphicsMutex;
-
-
- Common::SaveFileManager *_savefile;
- Audio::Mixer *_mixer;
-
- SDL_TimerID _timerID;
- Common::TimerManager *_timer;
-
-
-
- void addDirtyRgnAuto(const byte *buf);
- void makeChecksums(const byte *buf);
-
- virtual void addDirtyRect(int x, int y, int w, int h, bool realCoordinates = false); // overloaded by CE backend
-
- virtual void drawMouse(); // overloaded by CE backend
- virtual void undrawMouse(); // overloaded by CE backend (FIXME)
- virtual void blitCursor(); // overloaded by CE backend (FIXME)
-
- /** Set the position of the virtual mouse cursor. */
- void setMousePos(int x, int y);
- virtual void fillMouseEvent(Common::Event &event, int x, int y); // overloaded by CE backend
- void toggleMouseGrab();
-
- virtual void internUpdateScreen(); // overloaded by CE backend
-
- virtual void loadGFXMode(); // overloaded by CE backend
- virtual void unloadGFXMode(); // overloaded by CE backend
- virtual void hotswapGFXMode(); // overloaded by CE backend
-
- void setFullscreenMode(bool enable);
- void setAspectRatioCorrection(bool enable);
-
- virtual bool saveScreenshot(const char *filename); // overloaded by CE backend
-
- int effectiveScreenHeight() const {
- return (_adjustAspectRatio ? real2Aspect(_screenHeight) : _screenHeight)
- * _scaleFactor;
- }
-
- void setupIcon();
- void handleKbdMouse();
-
- virtual bool remapKey(SDL_Event &ev, Common::Event &event);
-
- void handleScalerHotkeys(const SDL_KeyboardEvent &key);
-};
-
-#endif
Modified: scummvm/trunk/backends/platform/sdl/sdl.cpp
===================================================================
--- scummvm/trunk/backends/platform/sdl/sdl.cpp 2007-08-11 08:31:26 UTC (rev 28519)
+++ scummvm/trunk/backends/platform/sdl/sdl.cpp 2007-08-11 08:44:43 UTC (rev 28520)
@@ -23,17 +23,10 @@
*
*/
-#if defined(WIN32)
-#include <windows.h>
-// winnt.h defines ARRAYSIZE, but we want our own one...
-#undef ARRAYSIZE
-#endif
-
-#include "backends/platform/sdl/sdl-common.h"
+#include "backends/platform/sdl/sdl.h"
#include "backends/plugins/sdl/sdl-provider.h"
#include "common/config-manager.h"
#include "common/util.h"
-#include "base/main.h"
#include "backends/saves/default/default-saves.h"
#include "backends/timer/default/default-timer.h"
@@ -41,92 +34,11 @@
#include "icons/scummvm.xpm"
-#if defined(__SYMBIAN32__)
-#include "SymbianOs.h"
-#endif
-
-#ifndef __MAEMO__
-
static Uint32 timer_handler(Uint32 interval, void *param) {
((DefaultTimerManager *)param)->handler();
return interval;
}
-#ifndef _WIN32_WCE
-
-#if defined (WIN32)
-int __stdcall WinMain(HINSTANCE /*hInst*/, HINSTANCE /*hPrevInst*/, LPSTR /*lpCmdLine*/, int /*iShowCmd*/) {
- SDL_SetModuleHandle(GetModuleHandle(NULL));
- return main(__argc, __argv);
-}
-#endif
-
-int main(int argc, char *argv[]) {
-
-#if defined(__SYMBIAN32__)
- //
- // Set up redirects for stdout/stderr under Windows and Symbian.
- // Code copied from SDL_main.
- //
-
- // Symbian does not like any output to the console through any *print* function
- char STDOUT_FILE[256], STDERR_FILE[256]; // shhh, don't tell anybody :)
- strcpy(STDOUT_FILE, Symbian::GetExecutablePath());
- strcpy(STDERR_FILE, Symbian::GetExecutablePath());
- strcat(STDOUT_FILE, "scummvm.stdout.txt");
- strcat(STDERR_FILE, "scummvm.stderr.txt");
-
- /* Flush the output in case anything is queued */
- fclose(stdout);
- fclose(stderr);
-
- /* Redirect standard input and standard output */
- FILE *newfp = freopen(STDOUT_FILE, "w", stdout);
- if (newfp == NULL) { /* This happens on NT */
-#if !defined(stdout)
- stdout = fopen(STDOUT_FILE, "w");
-#else
- newfp = fopen(STDOUT_FILE, "w");
- if (newfp) {
- *stdout = *newfp;
- }
-#endif
- }
- newfp = freopen(STDERR_FILE, "w", stderr);
- if (newfp == NULL) { /* This happens on NT */
-#if !defined(stderr)
- stderr = fopen(STDERR_FILE, "w");
-#else
- newfp = fopen(STDERR_FILE, "w");
- if (newfp) {
- *stderr = *newfp;
- }
-#endif
- }
- setbuf(stderr, NULL); /* No buffering */
-
-#endif // defined(__SYMBIAN32__)
-
- // Create our OSystem instance
-#if defined(__SYMBIAN32__)
- g_system = new OSystem_SDL_Symbian();
-#else
- g_system = new OSystem_SDL();
-#endif
- assert(g_system);
-
-#ifdef DYNAMIC_MODULES
- PluginManager::instance().addPluginProvider(new SDLPluginProvider());
-#endif
-
- // Invoke the actual ScummVM main entry point:
- int res = scummvm_main(argc, argv);
- g_system->quit(); // TODO: Consider removing / replacing this!
- return res;
-}
-#endif // defined(_WIN32_WCE)
-#endif // defined(__MAEMO__)
-
void OSystem_SDL::initBackend() {
assert(!_inited);
@@ -162,12 +74,15 @@
_mode = GFX_DOUBLESIZE;
_scaleFactor = 2;
_scalerProc = Normal2x;
- _fullscreen = ConfMan.getBool("fullscreen");
_adjustAspectRatio = ConfMan.getBool("aspect_ratio");
#else // for small screen platforms
_mode = GFX_NORMAL;
_scaleFactor = 1;
_scalerProc = Normal1x;
+ _adjustAspectRatio = false;
+#endif
+ _scalerType = 0;
+ _modeFlags = 0;
#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__)
_fullscreen = ConfMan.getBool("fullscreen");
@@ -175,15 +90,13 @@
_fullscreen = true;
#endif
- _adjustAspectRatio = false;
+#if !defined(MACOSX) && !defined(__SYMBIAN32__)
+ // Setup a custom program icon.
+ // Don't set icon on OS X, as we use a nicer external icon there.
+ // Don't for Symbian: it uses the EScummVM.aif file for the icon.
+ setupIcon();
#endif
- _scalerType = 0;
- _modeFlags = 0;
-#if !defined(MACOSX) && !defined(__SYMBIAN32__) // Don't set icon on OS X, as we use a nicer external icon there
- setupIcon(); // Don't for Symbian: it uses the EScummVM.aif file for the icon
-#endif
-
// enable joystick
if (joystick_num > -1 && SDL_NumJoysticks() > 0) {
printf("Using joystick: %s\n", SDL_JoystickName(0));
@@ -208,17 +121,18 @@
// Create and hook up the timer manager, if none exists yet (we check for
// this to allow subclasses to provide their own).
if (_timer == 0) {
- // TODO: We could implement a custom SDLTimerManager by using
+ // Note: We could implement a custom SDLTimerManager by using
// SDL_AddTimer. That might yield better timer resolution, but it would
// also change the semantics of a timer: Right now, ScummVM timers
// *never* run in parallel, due to the way they are implemented. If we
// switched to SDL_AddTimer, each timer might run in a separate thread.
- // Unfortunately, not all our code is prepared for that, so we can't just
- // switch. But it's a long term goal to do just that!
+ // However, not all our code is prepared for that, so we can't just
+ // switch. Still, it's a potential future change to keep in mind.
_timer = new DefaultTimerManager();
_timerID = SDL_AddTimer(10, &timer_handler, _timer);
}
+ // Invoke parent implementation of this method
OSystem::initBackend();
_inited = true;
@@ -427,28 +341,22 @@
SDL_AudioSpec desired;
SDL_AudioSpec obtained;
- memset(&desired, 0, sizeof(desired));
-
+ // Determine the desired output sampling frequency.
_samplesPerSec = 0;
-
if (ConfMan.hasKey("output_rate"))
_samplesPerSec = ConfMan.getInt("output_rate");
-
if (_samplesPerSec <= 0)
_samplesPerSec = SAMPLES_PER_SEC;
- // Originally, we always used 2048 samples. This loop will produce the
- // same result at 22050 Hz, and should hopefully produce something
- // sensible for other frequencies. Note that it must be a power of two.
-
- uint32 samples = 0x8000;
-
- for (;;) {
- if ((1000 * samples) / _samplesPerSec < 100)
- break;
+ // Determine the sample buffer size. We want it to store enough data for
+ // about 1/10th of a second. Note that it must be a power of two.
+ // So e.g. at 22050 Hz, we request a sample buffer size of 2048.
+ int samples = 0x8000;
+ while (10 * samples >= _samplesPerSec) {
samples >>= 1;
}
+ memset(&desired, 0, sizeof(desired));
desired.freq = _samplesPerSec;
desired.format = AUDIO_S16SYS;
desired.channels = 2;
Copied: scummvm/trunk/backends/platform/sdl/sdl.h (from rev 28514, scummvm/trunk/backends/platform/sdl/sdl-common.h)
===================================================================
--- scummvm/trunk/backends/platform/sdl/sdl.h (rev 0)
+++ scummvm/trunk/backends/platform/sdl/sdl.h 2007-08-11 08:44:43 UTC (rev 28520)
@@ -0,0 +1,415 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#ifndef SDL_COMMON_H
+#define SDL_COMMON_H
+
+#include <SDL.h>
+
+#include "common/stdafx.h"
+#include "common/scummsys.h"
+#include "common/system.h"
+#include "graphics/scaler.h"
+#include "backends/intern.h"
+
+
+namespace Audio {
+ class Mixer;
+}
+
+namespace Common {
+ class SaveFileManager;
+ class TimerManager;
+}
+
+#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,
+ GFX_TRIPLESIZE = 2,
+ GFX_2XSAI = 3,
+ GFX_SUPER2XSAI = 4,
+ GFX_SUPEREAGLE = 5,
+ GFX_ADVMAME2X = 6,
+ GFX_ADVMAME3X = 7,
+ GFX_HQ2X = 8,
+ GFX_HQ3X = 9,
+ GFX_TV2X = 10,
+ GFX_DOTMATRIX = 11
+};
+
+
+class OSystem_SDL : public OSystem {
+public:
+ OSystem_SDL();
+ virtual ~OSystem_SDL();
+
+ virtual void initBackend();
+
+ void beginGFXTransaction(void);
+ void endGFXTransaction(void);
+
+ // Set the size of the video bitmap.
+ // Typically, 320x200
+ virtual void initSize(uint w, uint h); // overloaded by CE backend
+
+ virtual int getScreenChangeID() const { return _screenChangeCount; }
+
+ // Set colors of the palette
+ void setPalette(const byte *colors, uint start, uint num);
+
+ // Get colors of the palette
+ void grabPalette(byte *colors, uint start, uint num);
+
+ // Draw a bitmap to screen.
+ // The screen will not be updated to reflect the new bitmap
+ virtual void copyRectToScreen(const byte *src, int pitch, int x, int y, int w, int h); // overloaded by CE backend (FIXME)
+
+ virtual Graphics::Surface *lockScreen();
+ virtual void unlockScreen();
+
+ // Update the dirty areas of the screen
+ void updateScreen();
+
+ // Either show or hide the mouse cursor
+ bool showMouse(bool visible);
+
+ // Warp the mouse cursor. Where set_mouse_pos() only informs the
+ // backend of the mouse cursor's current position, this function
+ // actually moves the cursor to the specified position.
+ virtual void warpMouse(int x, int y); // overloaded by CE backend (FIXME)
+
+ // Set the bitmap that's used when drawing the cursor.
+ virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, byte keycolor, int cursorTargetScale); // overloaded by CE backend (FIXME)
+
+ // Set colors of cursor palette
+ void setCursorPalette(const byte *colors, uint start, uint num);
+
+ // Disables or enables cursor palette
+ void disableCursorPalette(bool disable) {
+ _cursorPaletteDisabled = disable;
+ blitCursor();
+ }
+
+ // Shaking is used in SCUMM. Set current shake position.
+ void setShakePos(int shake_pos);
+
+ // Get the number of milliseconds since the program was started.
+ uint32 getMillis();
+
+ // Delay for a specified amount of milliseconds
+ void delayMillis(uint msecs);
+
+ // Get the next event.
+ // Returns true if an event was retrieved.
+ virtual bool pollEvent(Common::Event &event); // overloaded by CE backend
+
+ // Set function that generates samples
+ typedef void (*SoundProc)(void *param, byte *buf, int len);
+ virtual bool setSoundCallback(SoundProc proc, void *param); // overloaded by CE backend
+ virtual Audio::Mixer *getMixer();
+
+ // Poll CD status
+ // Returns true if cd audio is playing
+ bool pollCD();
+
+ // Play CD audio track
+ void playCD(int track, int num_loops, int start_frame, int duration);
+
+ // Stop CD audio track
+ void stopCD();
+
+ // Update CD audio status
+ void updateCD();
+
+ // Quit
+ virtual void quit(); // overloaded by CE backend
+
+ virtual Common::TimerManager *getTimerManager();
+
+ // Mutex handling
+ MutexRef createMutex();
+ void lockMutex(MutexRef mutex);
+ void unlockMutex(MutexRef mutex);
+ void deleteMutex(MutexRef mutex);
+
+ // Overlay
+ virtual void showOverlay(); // WinCE FIXME
+ virtual void hideOverlay(); // WinCE FIXME
+ virtual void clearOverlay();
+ virtual void grabOverlay(OverlayColor *buf, int pitch);
+ virtual void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h); // WinCE FIXME
+ virtual int16 getHeight();
+ virtual int16 getWidth();
+ virtual int16 getOverlayHeight() { return _overlayHeight; }
+ virtual int16 getOverlayWidth() { return _overlayWidth; }
+
+ // Methods that convert RGB to/from colors suitable for the overlay.
+ virtual OverlayColor RGBToColor(uint8 r, uint8 g, uint8 b);
+ virtual void colorToRGB(OverlayColor color, uint8 &r, uint8 &g, uint8 &b);
+
+
+ virtual const GraphicsMode *getSupportedGraphicsModes() const;
+ virtual int getDefaultGraphicsMode() const;
+ virtual bool setGraphicsMode(int mode);
+ virtual int getGraphicsMode() const;
+
+ virtual void setWindowCaption(const char *caption);
+ virtual bool openCD(int drive);
+ virtual int getOutputSampleRate() const;
+
+ virtual bool hasFeature(Feature f);
+ virtual void setFeatureState(Feature f, bool enable);
+ virtual bool getFeatureState(Feature f);
+
+#ifdef USE_OSD
+ void displayMessageOnOSD(const char *msg);
+#endif
+
+ virtual Common::SaveFileManager *getSavefileManager();
+
+protected:
+ bool _inited;
+
+#ifdef USE_OSD
+ SDL_Surface *_osdSurface;
+ Uint8 _osdAlpha; // Transparency level of the OSD
+ uint32 _osdFadeStartTime; // When to start the fade out
+ enum {
+ kOSDFadeOutDelay = 2 * 1000, // Delay before the OSD is faded out (in milliseconds)
+ kOSDFadeOutDuration = 500, // Duration of the OSD fade out (in milliseconds)
+ kOSDColorKey = 1,
+ kOSDInitialAlpha = 80 // Initial alpha level, in percent
+ };
+#endif
+
+ // hardware screen
+ SDL_Surface *_hwscreen;
+
+ // unseen game screen
+ SDL_Surface *_screen;
+
+ // TODO: We could get rid of the following two vars and just use _screen instead
+ int _screenWidth, _screenHeight;
+
+ // temporary screen (for scalers)
+ SDL_Surface *_tmpscreen;
+ SDL_Surface *_tmpscreen2;
+
+ // overlay
+ SDL_Surface *_overlayscreen;
+ int _overlayWidth, _overlayHeight;
+ bool _overlayVisible;
+
+ // Audio
+ int _samplesPerSec;
+
+ // CD Audio
+ SDL_CD *_cdrom;
+ int _cdTrack, _cdNumLoops, _cdStartFrame, _cdDuration;
+ uint32 _cdEndTime, _cdStopTime;
+
+ enum {
+ DF_WANT_RECT_OPTIM = 1 << 0
+ };
+
+ enum {
+ kTransactionNone = 0,
+ kTransactionCommit = 1,
+ kTransactionActive = 2
+ };
+
+ struct TransactionDetails {
+ int mode;
+ bool modeChanged;
+ int w;
+ int h;
+ bool sizeChanged;
+ bool fs;
+ bool fsChanged;
+ bool ar;
+ bool arChanged;
+ bool needHotswap;
+ bool needUpdatescreen;
+ bool needUnload;
+ bool needToggle;
+ bool normal1xScaler;
+ };
+ TransactionDetails _transactionDetails;
+
+ /** Force full redraw on next updateScreen */
+ bool _forceFull;
+ ScalerProc *_scalerProc;
+ int _scalerType;
+ int _scaleFactor;
+ int _mode;
+ int _transactionMode;
+ bool _fullscreen;
+
+ bool _screenIsLocked;
+ Graphics::Surface _framebuffer;
+
+ /** Current video mode flags (see DF_* constants) */
+ uint32 _modeFlags;
+ bool _modeChanged;
+ int _screenChangeCount;
+
+ /** True if aspect ratio correction is enabled. */
+ bool _adjustAspectRatio;
+
+ enum {
+ NUM_DIRTY_RECT = 100,
+ MAX_SCALING = 3
+ };
+
+ // Dirty rect management
+ SDL_Rect _dirtyRectList[NUM_DIRTY_RECT];
+ int _numDirtyRects;
+ uint32 *_dirtyChecksums;
+ bool _cksumValid;
+ int _cksumNum;
+
+ // Keyboard mouse emulation. Disabled by fingolfin 2004-12-18.
+ // I am keeping the rest of the code in for now, since the joystick
+ // code (or rather, "hack") uses it, too.
+ struct KbdMouse {
+ int16 x, y, x_vel, y_vel, x_max, y_max, x_down_count, y_down_count;
+ uint32 last_time, delay_time, x_down_time, y_down_time;
+ };
+
+ struct MousePos {
+ // The mouse position, using either virtual (game) or real
+ // (overlay) coordinates.
+ int16 x, y;
+
+ // The size and hotspot of the original cursor image.
+ int16 w, h;
+ int16 hotX, hotY;
+
+ // The size and hotspot of the pre-scaled cursor image, in real
+ // coordinates.
+ int16 rW, rH;
+ int16 rHotX, rHotY;
+
+ // The size and hotspot of the pre-scaled cursor image, in game
+ // coordinates.
+ int16 vW, vH;
+ int16 vHotX, vHotY;
+
+ MousePos() : x(0), y(0), w(0), h(0), hotX(0), hotY(0),
+ rW(0), rH(0), rHotX(0), rHotY(0), vW(0), vH(0),
+ vHotX(0), vHotY(0)
+ { }
+ };
+
+ // mouse
+ KbdMouse _km;
+ bool _mouseVisible;
+ bool _mouseDrawn;
+ byte *_mouseData;
+ SDL_Rect _mouseBackup;
+ MousePos _mouseCurState;
+ byte _mouseKeyColor;
+ int _cursorTargetScale;
+ bool _cursorPaletteDisabled;
+ SDL_Surface *_mouseOrigSurface;
+ SDL_Surface *_mouseSurface;
+ enum {
+ kMouseColorKey = 1
+ };
+
+ // joystick
+ SDL_Joystick *_joystick;
+
+ // Shake mode
+ int _currentShakePos;
+ int _newShakePos;
+
+ // Palette data
+ SDL_Color *_currentPalette;
+ uint _paletteDirtyStart, _paletteDirtyEnd;
+
+ // Cursor palette data
+ SDL_Color *_cursorPalette;
+
+ /**
+ * Mutex which prevents multiple threads from interfering with each other
+ * when accessing the screen.
+ */
+ MutexRef _graphicsMutex;
+
+
+ Common::SaveFileManager *_savefile;
+ Audio::Mixer *_mixer;
+
+ SDL_TimerID _timerID;
+ Common::TimerManager *_timer;
+
+
+
+ void addDirtyRgnAuto(const byte *buf);
+ void makeChecksums(const byte *buf);
+
+ virtual void addDirtyRect(int x, int y, int w, int h, bool realCoordinates = false); // overloaded by CE backend
+
+ virtual void drawMouse(); // overloaded by CE backend
+ virtual void undrawMouse(); // overloaded by CE backend (FIXME)
+ virtual void blitCursor(); // overloaded by CE backend (FIXME)
+
+ /** Set the position of the virtual mouse cursor. */
+ void setMousePos(int x, int y);
+ virtual void fillMouseEvent(Common::Event &event, int x, int y); // overloaded by CE backend
+ void toggleMouseGrab();
+
+ virtual void internUpdateScreen(); // overloaded by CE backend
+
+ virtual void loadGFXMode(); // overloaded by CE backend
+ virtual void unloadGFXMode(); // overloaded by CE backend
+ virtual void hotswapGFXMode(); // overloaded by CE backend
+
+ void setFullscreenMode(bool enable);
+ void setAspectRatioCorrection(bool enable);
+
+ virtual bool saveScreenshot(const char *filename); // overloaded by CE backend
+
+ int effectiveScreenHeight() const {
+ return (_adjustAspectRatio ? real2Aspect(_screenHeight) : _screenHeight)
+ * _scaleFactor;
+ }
+
+ void setupIcon();
+ void handleKbdMouse();
+
+ virtual bool remapKey(SDL_Event &ev, Common::Event &event);
+
+ void handleScalerHotkeys(const SDL_KeyboardEvent &key);
+};
+
+#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list