mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-19 10:41:55 +00:00
402 lines
10 KiB
C++
402 lines
10 KiB
C++
/* 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.
|
|
*
|
|
*/
|
|
|
|
#ifndef TITANIC_SCREEN_MANAGER_H
|
|
#define TITANIC_SCREEN_MANAGER_H
|
|
|
|
#include "common/scummsys.h"
|
|
#include "common/array.h"
|
|
#include "titanic/support/direct_draw.h"
|
|
#include "titanic/support/font.h"
|
|
#include "titanic/input_handler.h"
|
|
#include "titanic/support/mouse_cursor.h"
|
|
#include "titanic/support/text_cursor.h"
|
|
#include "titanic/support/video_surface.h"
|
|
#include "titanic/core/resource_key.h"
|
|
|
|
namespace Titanic {
|
|
|
|
/**
|
|
* The original used page flipping with one primary and one back buffer.
|
|
* Since we don't need that in ScummVM, the back buffer number below is
|
|
* remapped to the primary surface
|
|
*/
|
|
enum SurfaceNum {
|
|
SURFACE_PRIMARY = -1, // Surface 0
|
|
SURFACE_BACKBUFFER = -1 // Surface -1
|
|
};
|
|
|
|
class TitanicEngine;
|
|
|
|
class CScreenManager {
|
|
struct VideoSurfaceEntry {
|
|
CVideoSurface *_surface;
|
|
Rect _bounds;
|
|
};
|
|
protected:
|
|
TitanicEngine *_vm;
|
|
public:
|
|
static CScreenManager *_screenManagerPtr;
|
|
static CScreenManager *_currentScreenManagerPtr;
|
|
|
|
/**
|
|
* Set the current screen manager
|
|
*/
|
|
static CScreenManager *setCurrent();
|
|
public:
|
|
Common::Array<VideoSurfaceEntry> _backSurfaces;
|
|
Rect _frontSurfaceBounds;
|
|
CVideoSurface *_frontRenderSurface;
|
|
CMouseCursor *_mouseCursor;
|
|
CTextCursor *_textCursor;
|
|
CInputHandler *_inputHandler;
|
|
int _fontNumber;
|
|
public:
|
|
CScreenManager(TitanicEngine *vm);
|
|
virtual ~CScreenManager();
|
|
|
|
void fn1() {}
|
|
void fn2() {}
|
|
|
|
virtual void setWindowHandle(int v);
|
|
virtual bool resetWindowHandle(int v);
|
|
|
|
/**
|
|
* Sets the video mode
|
|
*/
|
|
virtual void setMode(int width, int height, int bpp, uint numBackSurfaces, bool flag2) = 0;
|
|
|
|
/**
|
|
* Handles drawing the cursors
|
|
*/
|
|
virtual void drawCursors() = 0;
|
|
|
|
/**
|
|
* Locks a specified surface number for access and returns a pointer to it
|
|
*/
|
|
virtual CVideoSurface *lockSurface(SurfaceNum surfaceNum) = 0;
|
|
|
|
/**
|
|
* Unlocks a previously locked surface
|
|
*/
|
|
virtual void unlockSurface(CVideoSurface *surface) = 0;
|
|
|
|
/**
|
|
* Gets a specified surface number
|
|
*/
|
|
virtual CVideoSurface *getSurface(SurfaceNum surfaceNum) const = 0;
|
|
|
|
/**
|
|
* Return the front render surface
|
|
*/
|
|
virtual CVideoSurface *getFrontRenderSurface() const = 0;
|
|
|
|
/**
|
|
* Fill an area with a specific color
|
|
*/
|
|
virtual void fillRect(SurfaceNum surfaceNum, Rect *rect, byte r, byte g, byte b) = 0;
|
|
|
|
/**
|
|
* Blits a surface onto one of the screen surfaces
|
|
*/
|
|
virtual void blitFrom(SurfaceNum surfaceNum, CVideoSurface *src, const Point *destPos = nullptr,
|
|
const Rect *srcRect = nullptr) = 0;
|
|
|
|
/**
|
|
* Blits a surface onto one of the screen surfaces
|
|
*/
|
|
virtual void blitFrom(SurfaceNum surfaceNum, const Rect *rect, CVideoSurface *src, int v = 0) = 0;
|
|
|
|
/**
|
|
* Write a string
|
|
* @param surfaceNum Destination surface
|
|
* @param destRect Bounds within dest surface
|
|
* @param yOffset Y offset for drawing, to allow for parts of
|
|
* the text to be scrolled off-screen
|
|
* @param str Line or lines to write
|
|
* @param textCursor Optional text cursor pointer
|
|
*/
|
|
virtual int writeString(int surfaceNum, const Rect &destRect,
|
|
int yOffset, const CString &str, CTextCursor *textCursor) = 0;
|
|
|
|
/**
|
|
* Write a string
|
|
* @param surfaceNum Destination surface
|
|
* @param destPos Position to start writing text at
|
|
* @param clipRect Clipping area to constrain text to
|
|
* @param str Line or lines to write
|
|
* @param maxWidth Maximum allowed line width
|
|
*/
|
|
virtual void writeString(int surfaceNum, const Point &destPos,
|
|
const Rect &clipRect, const CString &str, int maxWidth) = 0;
|
|
|
|
/**
|
|
* Set the font color
|
|
*/
|
|
virtual void setFontColor(byte r, byte g, byte b) = 0;
|
|
|
|
/**
|
|
* Get the text area a string will fit into
|
|
* @param str String
|
|
* @param maxWidth Maximum width in pixels
|
|
* @param sizeOut Optional pointer to output size
|
|
* @returns Required height
|
|
*/
|
|
virtual int getTextBounds(const CString &str, int maxWidth, Point *sizeOut = nullptr) const = 0;
|
|
|
|
/**
|
|
* Get the current font height
|
|
*/
|
|
virtual int getFontHeight() const = 0;
|
|
|
|
/**
|
|
* Returns the width of a given string in pixels
|
|
*/
|
|
virtual int stringWidth(const CString &str) = 0;
|
|
|
|
/**
|
|
* Draws a frame enclosing the specified area
|
|
*/
|
|
virtual void frameRect(SurfaceNum surfaceNum, const Rect &rect, byte r, byte g, byte b) = 0;
|
|
|
|
/**
|
|
* Clear a portion of a specified surface
|
|
*/
|
|
virtual void clearSurface(SurfaceNum surfaceNum, Rect *_bounds) = 0;
|
|
|
|
/**
|
|
* Resize the passed surface
|
|
*/
|
|
virtual void resizeSurface(CVideoSurface *surface, int width, int height, int bpp = 16) = 0;
|
|
|
|
/**
|
|
* Creates a surface of a given size
|
|
*/
|
|
virtual CVideoSurface *createSurface(int w, int h, int bpp = 16) = 0;
|
|
|
|
/**
|
|
* Creates a surface from a specified resource
|
|
*/
|
|
virtual CVideoSurface *createSurface(const CResourceKey &key) = 0;
|
|
|
|
/**
|
|
* Get the top-left corner of the screen in global screen co-ordinates
|
|
* For ScummVM, this is always (0, 0), even in Windowed mode
|
|
*/
|
|
virtual Point getScreenTopLeft() { return Point(0, 0); }
|
|
|
|
/**
|
|
* Waits for a vertical screen sync
|
|
* For ScummVM, this can be safely ignored
|
|
*/
|
|
virtual void waitForVSync() {}
|
|
|
|
/**
|
|
* Show the mouse cursor
|
|
*/
|
|
virtual void showCursor() = 0;
|
|
|
|
/**
|
|
* Hide the mouse cursor
|
|
*/
|
|
virtual void hideCursor() = 0;
|
|
|
|
/**
|
|
* Set drawing bounds for a specified surface
|
|
*/
|
|
void setSurfaceBounds(SurfaceNum surfaceNum, const Rect &r);
|
|
|
|
/**
|
|
* Set the current font number
|
|
*/
|
|
int setFontNumber(int fontNumber);
|
|
|
|
/**
|
|
* Called when a game is about to be loaded
|
|
*/
|
|
void preLoad();
|
|
};
|
|
|
|
class OSScreenManager: CScreenManager {
|
|
private:
|
|
DirectDrawManager _directDrawManager;
|
|
|
|
/**
|
|
* Frees any surface buffers
|
|
*/
|
|
void destroyFrontAndBackBuffers();
|
|
|
|
/**
|
|
* Load game cursors
|
|
*/
|
|
void loadCursors();
|
|
|
|
/**
|
|
* Gets an underlying surface
|
|
*/
|
|
DirectDrawSurface *getDDSurface(SurfaceNum surfaceNum);
|
|
public:
|
|
int _field48;
|
|
int _field4C;
|
|
int _field50;
|
|
int _field54;
|
|
STFont _fonts[4];
|
|
public:
|
|
OSScreenManager(TitanicEngine *vm);
|
|
virtual ~OSScreenManager();
|
|
|
|
/**
|
|
* Sets the video mode
|
|
*/
|
|
virtual void setMode(int width, int height, int bpp, uint numBackSurfaces, bool flag2);
|
|
|
|
/**
|
|
* Handles drawing the cursors
|
|
*/
|
|
virtual void drawCursors();
|
|
|
|
/**
|
|
* Locks a specified surface number for access and returns a pointer to it
|
|
*/
|
|
virtual CVideoSurface *lockSurface(SurfaceNum surfaceNum);
|
|
|
|
/**
|
|
* Unlocks a previously locked surface
|
|
*/
|
|
virtual void unlockSurface(CVideoSurface *surface);
|
|
|
|
/**
|
|
* Gets a specified surface number
|
|
*/
|
|
virtual CVideoSurface *getSurface(SurfaceNum surfaceNum) const;
|
|
|
|
/**
|
|
* Return the front render surface
|
|
*/
|
|
virtual CVideoSurface *getFrontRenderSurface() const {
|
|
return _frontRenderSurface;
|
|
}
|
|
|
|
|
|
/**
|
|
* Fill an area with a specific color
|
|
*/
|
|
virtual void fillRect(SurfaceNum surfaceNum, Rect *rect, byte r, byte g, byte b);
|
|
|
|
/**
|
|
* Blits a surface onto one of the screen surfaces
|
|
*/
|
|
virtual void blitFrom(SurfaceNum surfaceNum, CVideoSurface *src, const Point *destPos,
|
|
const Rect *srcRect = nullptr);
|
|
|
|
/**
|
|
* Blits a surface onto one of the screen surfaces
|
|
*/
|
|
virtual void blitFrom(SurfaceNum surfaceNum, const Rect *rect, CVideoSurface *src, int v = 0);
|
|
|
|
/**
|
|
* Write a string
|
|
* @param surfaceNum Destination surface
|
|
* @param destRect Bounds within dest surface
|
|
* @param yOffset Y offset for drawing, to allow for parts of
|
|
* the text to be scrolled off-screen
|
|
* @param str Line or lines to write
|
|
* @param textCursor Optional text cursor pointer
|
|
*/
|
|
virtual int writeString(int surfaceNum, const Rect &destRect,
|
|
int yOffset, const CString &str, CTextCursor *textCursor);
|
|
|
|
/**
|
|
* Write a string
|
|
* @param surfaceNum Destination surface
|
|
* @param destPos Position to start writing text at
|
|
* @param clipRect Clipping area to constrain text to
|
|
* @param str Line or lines to write
|
|
* @param lineWidth Width in pixels of the string, if known.
|
|
*/
|
|
virtual void writeString(int surfaceNum, const Point &destPos,
|
|
const Rect &clipRect, const CString &str, int lineWidth = 0);
|
|
|
|
/**
|
|
* Set the font color
|
|
*/
|
|
virtual void setFontColor(byte r, byte g, byte b);
|
|
|
|
/**
|
|
* Get the text area a string will fit into
|
|
* @param str String
|
|
* @param maxWidth Maximum width in pixels
|
|
* @param sizeOut Optional pointer to output size
|
|
* @returns Required height
|
|
*/
|
|
virtual int getTextBounds(const CString &str, int maxWidth, Point *sizeOut = nullptr) const;
|
|
|
|
/**
|
|
* Get the current font height
|
|
*/
|
|
virtual int getFontHeight() const;
|
|
|
|
/**
|
|
* Returns the width of a given string in pixels
|
|
*/
|
|
virtual int stringWidth(const CString &str);
|
|
|
|
/**
|
|
* Draws a frame enclosing the specified area
|
|
*/
|
|
virtual void frameRect(SurfaceNum surfaceNum, const Rect &rect, byte r, byte g, byte b);
|
|
|
|
/**
|
|
* Clear a portion of the screen surface
|
|
*/
|
|
virtual void clearSurface(SurfaceNum surfaceNum, Rect *bounds);
|
|
|
|
/**
|
|
* Resize the passed surface
|
|
*/
|
|
virtual void resizeSurface(CVideoSurface *surface, int width, int height, int bpp = 16);
|
|
|
|
/**
|
|
* Creates a surface of a given size
|
|
*/
|
|
virtual CVideoSurface *createSurface(int w, int h, int bpp = 16);
|
|
|
|
/**
|
|
* Creates a surface from a specified resource
|
|
*/
|
|
virtual CVideoSurface *createSurface(const CResourceKey &key);
|
|
|
|
/**
|
|
* Show the mouse cursor
|
|
*/
|
|
virtual void showCursor();
|
|
|
|
/**
|
|
* Hide the mouse cursor
|
|
*/
|
|
virtual void hideCursor();
|
|
};
|
|
|
|
} // End of namespace Titanic
|
|
|
|
#endif /* TITANIC_SCREEN_MANAGER_H */
|