diff options
Diffstat (limited to 'backends/platform/morphos/morphos.h')
-rw-r--r-- | backends/platform/morphos/morphos.h | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/backends/platform/morphos/morphos.h b/backends/platform/morphos/morphos.h new file mode 100644 index 0000000000..67ed8a481e --- /dev/null +++ b/backends/platform/morphos/morphos.h @@ -0,0 +1,232 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2002 Rüdiger Hanke (MorphOS port) + * + * 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. + * + * MorphOS-specific header file + * + * $URL$ + * $Id$ + * + */ + +#ifndef MORPHOS_MORPHOS_H +#define MORPHOS_MORPHOS_H + +#include <dos/dosextens.h> +#include <graphics/regions.h> +#include <intuition/intuition.h> +#include <intuition/screens.h> +#include <libraries/cdda.h> +#include <proto/exec.h> + +#include "backends/intern.h" +#include "morphos_scaler.h" + +class OSystem_MorphOS : public OSystem +{ + public: + OSystem_MorphOS(SCALERTYPE gfx_mode, bool full_screen); + virtual ~OSystem_MorphOS(); + + bool Initialise(); + + // Set colors of the palette + virtual void setPalette(const byte *colors, uint start, uint num); + + // Set the size of the video bitmap. + // Typically, 320x200 + virtual void initSize(uint w, uint h); + + // Draw a bitmap to screen. + // The screen will not be updated to reflect the new bitmap + virtual void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h); + + // Update the dirty areas of the screen + virtual void updateScreen(); + + // Either show or hide the mouse cursor + virtual bool showMouse(bool visible); + + // Set the position of the mouse cursor + virtual void set_mouse_pos(int x, int y); + + // 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); + + // Shaking is used in SCUMM. Set current shake position. + virtual void setShakePos(int shake_pos); + + // Overlay + virtual void showOverlay(); + virtual void hideOverlay(); + virtual void clearOverlay(); + virtual void grabOverlay(int16 *buf, int pitch); + virtual void copyRectToOverlay(const int16 *buf, int pitch, int x, int y, int w, int h); + virtual int16 getHeight(); + virtual int16 getWidth(); + + // Get the number of milliseconds since the program was started. + virtual uint32 getMillis(); + + // Delay for a specified amount of milliseconds + virtual void delayMillis(uint msecs); + + // Add a new callback timer + virtual void setTimerCallback(TimerProc callback, int timer); + + // Mutex handling + virtual MutexRef createMutex(); + virtual void lockMutex(MutexRef mutex); + virtual void unlockMutex(MutexRef mutex); + virtual void deleteMutex(MutexRef mutex); + + // Get the next event. + // Returns true if an event was retrieved. + virtual bool pollEvent(Event &event); + + // Moves mouse pointer to specified position + virtual void warpMouse(int x, int y); + + // Set the function to be invoked whenever samples need to be generated + virtual bool setSoundCallback(SoundProc proc, void *param); + void fill_sound (byte * stream, int len); + void clearSoundCallback(); + + virtual uint32 property(int param, Property *value); + + // Poll cdrom status + // Returns true if cd audio is playing + virtual bool pollCD(); + + // Play cdrom audio track + virtual void playCD(int track, int num_loops, int start_frame, int duration); + + // Stop cdrom audio track + virtual void stopCD(); + + // Update cdrom audio status + virtual void updateCD(); + + // Quit + virtual void quit(); + + static OSystem_MorphOS *create(SCALERTYPE gfx_scaler, bool full_screen); + + static bool OpenATimer(MsgPort **port, IORequest **req, ULONG unit, bool required = true); + + private: + typedef enum { CSDSPTYPE_WINDOWED, CSDSPTYPE_FULLSCREEN, CSDSPTYPE_TOGGLE, CSDSPTYPE_KEEP } CS_DSPTYPE; + + static const int MAX_MOUSE_W = 80; + static const int MAX_MOUSE_H = 80; + + void CreateScreen(CS_DSPTYPE dspType); + void SwitchScalerTo(SCALERTYPE newScaler); + bool AddUpdateRect(WORD x, WORD y, WORD w, WORD h); + + void DrawMouse(); + void UndrawMouse(); + + /* Display-related attributes */ + Screen *ScummScreen; + Window *ScummWindow; + char ScummWndTitle[125]; + APTR ScummBuffer; + LONG ScummBufferWidth; + LONG ScummBufferHeight; + ScreenBuffer *ScummScreenBuffer[2]; + BitMap *ScummRenderTo; + ULONG ScummPaintBuffer; + int ScummScrWidth; + int ScummScrHeight; + int ScummDepth; + bool Scumm16ColFmt16; + UWORD *ScummNoCursor; + ULONG ScummColors[256]; + USHORT ScummColors16[256]; + WORD ScummWinX; + WORD ScummWinY; + bool ScummDefaultMouse; + bool ScummOrigMouse; + int ScummShakePos; + bool FullScreenMode; + bool ScreenChanged; + UWORD **BlockColors; + bool *DirtyBlocks; + Region *UpdateRegion; + Region *NewUpdateRegion; + ULONG UpdateRects; + SignalSemaphore CritSec; + + /* Overlay-related attributes */ + APTR OvlBitMap; + APTR OvlSavedBuffer; + ColorMap *OvlCMap; + + /* Sound-related attributes */ + Process *ScummSoundThread; + SoundProc SoundProc; + void *SoundParam; + MsgPort *ThreadPort; + Message MusicStartup; + Message SoundStartup; + + /* CD-ROM related attributes */ + CDRIVEPTR CDrive; + ULONG CDDATrackOffset; + + /* Scaling-related attributes */ + SCALERTYPE ScummScaler; + int ScummScale; + MorphOSScaler *Scaler; + + /* Mouse cursor-related attributes */ + bool MouseVisible, MouseDrawn; + int MouseX, MouseY; + int MouseWidth, MouseHeight; + int MouseOldX, MouseOldY; + int MouseOldWidth, MouseOldHeight; + int MouseHotspotX, MouseHotspotY; + byte *MouseImage, MouseBackup[MAX_MOUSE_W*MAX_MOUSE_H]; + byte MouseKeycolor; + MsgPort* InputMsgPort; + IOStdReq*InputIORequest; + + /* Timer-related attributes */ + MsgPort *TimerMsgPort; + timerequest *TimerIORequest; + + /* Game-related attributes */ + int GameID; +}; + +class AutoLock +{ + public: + AutoLock(SignalSemaphore* s) : sem(s) { ObtainSemaphore(sem); } + ~AutoLock() { ReleaseSemaphore(sem); } + + private: + SignalSemaphore* sem; +}; + +#define AUTO_LOCK AutoLock cs(&CritSec); + + +extern OSystem_MorphOS *TheSystem; + +#endif + |