aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/titanic/direct_draw.cpp61
-rw-r--r--engines/titanic/direct_draw.h48
-rw-r--r--engines/titanic/font.cpp4
-rw-r--r--engines/titanic/font.h2
-rw-r--r--engines/titanic/screen_manager.cpp61
-rw-r--r--engines/titanic/screen_manager.h37
-rw-r--r--engines/titanic/titanic.cpp2
-rw-r--r--engines/titanic/titanic.h11
-rw-r--r--engines/titanic/video_surface.cpp15
-rw-r--r--engines/titanic/video_surface.h14
10 files changed, 210 insertions, 45 deletions
diff --git a/engines/titanic/direct_draw.cpp b/engines/titanic/direct_draw.cpp
index a79edf9279..d503938fe4 100644
--- a/engines/titanic/direct_draw.cpp
+++ b/engines/titanic/direct_draw.cpp
@@ -20,26 +20,79 @@
*
*/
+#include "common/debug.h"
+#include "engines/util.h"
+#include "titanic/titanic.h"
#include "titanic/direct_draw.h"
namespace Titanic {
-DirectDraw::DirectDraw(TitanicEngine *vm) : Manager(vm) {
+DirectDraw::DirectDraw(TitanicEngine *vm) : _vm(vm) {
_field8 = 0;
_fieldC = 0;
_width = 0;
_height = 0;
_bpp = 0;
- _field1C = 0;
+ _numBackSurfaces = 0;
_field24 = 0;
}
+void DirectDraw::setDisplayMode(int width, int height, int bpp, int refreshRate) {
+ debugC(ERROR_BASIC, kDebugGraphics, "DirectDraw::SetDisplayMode (%d x %d), %d bpp",
+ width, height, bpp);
+ assert(bpp == 8);
+ initGraphics(width, height, true);
+}
+
+void DirectDraw::diagnostics() {
+ debugC(ERROR_BASIC, kDebugGraphics, "Running DirectDraw Diagnostic...");
+}
+
/*------------------------------------------------------------------------*/
-DirectDrawManager::DirectDrawManager(TitanicEngine *vm) :
- Manager(vm), _directDraw(vm) {
+DirectDrawManager::DirectDrawManager(TitanicEngine *vm, int v) : _directDraw(vm) {
_mainSurface = nullptr;
_backSurfaces[0] = _backSurfaces[1] = nullptr;
+ _directDraw._field8 = v;
+}
+
+void DirectDrawManager::initVideo(int width, int height, int bpp, int numBackSurfaces) {
+ debugC(ERROR_BASIC, kDebugGraphics, "Initialising video surfaces");
+ _directDraw._width = width;
+ _directDraw._numBackSurfaces = numBackSurfaces;
+ _directDraw._height = height;
+ _directDraw._bpp = bpp;
+
+ if (numBackSurfaces) {
+ setResolution();
+ } else {
+ initSurface();
+ }
+}
+
+void DirectDrawManager::setResolution() {
+ // TODO
+}
+
+void DirectDrawManager::proc2() {
+
+}
+
+void DirectDrawManager::proc3() {
+
+}
+
+void DirectDrawManager::initSurface() {
+ debugC(ERROR_BASIC, kDebugGraphics, "Creating surfaces");
+ _directDraw.setDisplayMode(_directDraw._width, _directDraw._height,
+ _directDraw._bpp, 0);
+
+ _mainSurface = new Graphics::Surface();
+ _mainSurface->create(_directDraw._width, _directDraw._height,
+ Graphics::PixelFormat::createFormatCLUT8());
+ _backSurfaces[0] = new Graphics::Surface();
+ _backSurfaces[0]->create(_directDraw._width, _directDraw._height,
+ Graphics::PixelFormat::createFormatCLUT8());
}
} // End of namespace Titanic
diff --git a/engines/titanic/direct_draw.h b/engines/titanic/direct_draw.h
index f88df717e0..cb49efa513 100644
--- a/engines/titanic/direct_draw.h
+++ b/engines/titanic/direct_draw.h
@@ -25,30 +25,64 @@
#include "common/scummsys.h"
#include "common/array.h"
-#include "titanic/titanic.h"
+#include "graphics/surface.h"
namespace Titanic {
-class DirectDraw: public Manager {
+class TitanicEngine;
+
+class DirectDraw {
+private:
+ TitanicEngine *_vm;
public:
int _field8;
int _fieldC;
int _width;
int _height;
int _bpp;
- int _field1C;
+ int _numBackSurfaces;
int _field24;
public:
DirectDraw(TitanicEngine *vm);
+
+ /**
+ * Sets a new display mode
+ */
+ void setDisplayMode(int width, int height, int bpp, int refreshRate);
+
+ /**
+ * Logs diagnostic information
+ */
+ void diagnostics();
};
-class DirectDrawManager: public Manager {
+class DirectDrawManager {
public:
DirectDraw _directDraw;
- void *_mainSurface;
- void *_backSurfaces[2];
+ Graphics::Surface *_mainSurface;
+ Graphics::Surface *_backSurfaces[2];
public:
- DirectDrawManager(TitanicEngine *vm);
+ DirectDrawManager(TitanicEngine *vm, int v);
+
+ /**
+ * Initializes video surfaces
+ * @param width Screen width
+ * @param height Screen height
+ * @param bpp Bits per pixel
+ * @param numBackSurfaces Number of back surfaces
+ */
+ void initVideo(int width, int height, int bpp, int numBackSurfaces);
+
+ void setResolution();
+
+ void proc2();
+
+ void proc3();
+
+ /**
+ * Initializes the surface for the screen
+ */
+ void initSurface();
};
} // End of namespace Titanic
diff --git a/engines/titanic/font.cpp b/engines/titanic/font.cpp
index 18f15cae92..bb8f2e05e9 100644
--- a/engines/titanic/font.cpp
+++ b/engines/titanic/font.cpp
@@ -27,4 +27,8 @@ namespace Titanic {
STFont::STFont() {
}
+void STFont::load(int fontNumber) {
+ // TODO
+}
+
} // End of namespace Titanic
diff --git a/engines/titanic/font.h b/engines/titanic/font.h
index f0ea5e4586..2948505c92 100644
--- a/engines/titanic/font.h
+++ b/engines/titanic/font.h
@@ -31,6 +31,8 @@ class STFont {
public:
public:
STFont();
+
+ void load(int fontNumber);
};
} // End of namespace Titanic
diff --git a/engines/titanic/screen_manager.cpp b/engines/titanic/screen_manager.cpp
index 6ee67ca617..61b6ff4762 100644
--- a/engines/titanic/screen_manager.cpp
+++ b/engines/titanic/screen_manager.cpp
@@ -21,6 +21,7 @@
*/
#include "titanic/screen_manager.h"
+#include "titanic/video_surface.h"
namespace Titanic {
@@ -33,11 +34,10 @@ CScreenManagerRec::CScreenManagerRec() {
/*------------------------------------------------------------------------*/
-CScreenManager::CScreenManager() {
+CScreenManager::CScreenManager(TitanicEngine *vm): _vm(vm) {
_screenManagerPtr = nullptr;
- _field4 = 0;
- _fontRenderSurface = nullptr;
+ _frontRenderSurface = nullptr;
_mouseCursor = nullptr;
_textCursor = nullptr;
_fontNumber = 0;
@@ -47,31 +47,51 @@ CScreenManager::~CScreenManager() {
_screenManagerPtr = nullptr;
}
-void CScreenManager::proc2(int v) {
- if (v)
- _field4 = v;
+void CScreenManager::setWindowHandle(int v) {
+ // Not needed
}
-bool CScreenManager::proc3(int v) {
- if (!v || _field4)
- return false;
-
- _field4 = 0;
+bool CScreenManager::resetWindowHandle(int v) {
proc27();
return true;
}
/*------------------------------------------------------------------------*/
-OSScreenManager::OSScreenManager(): CScreenManager() {
+OSScreenManager::OSScreenManager(TitanicEngine *vm): CScreenManager(vm),
+ _directDrawManager(vm, 0) {
_field48 = 0;
_field4C = 0;
_field50 = 0;
_field54 = 0;
- _directDrawManager = nullptr;
}
-void OSScreenManager::setMode() {}
+OSScreenManager::~OSScreenManager() {
+ destroyFrontAndBackBuffers();
+}
+
+void OSScreenManager::setMode(int width, int height, int bpp, int numBackSurfaces, bool flag2) {
+ destroyFrontAndBackBuffers();
+ _directDrawManager.initVideo(width, height, bpp, numBackSurfaces);
+
+ _frontRenderSurface = new OSVideoSurface(this, nullptr);
+ _frontRenderSurface->setSurface(this, _directDrawManager._mainSurface);
+
+ for (uint idx = 0; idx < numBackSurfaces; ++idx) {
+ OSVideoSurface videoSurface(this, nullptr);
+ videoSurface.setSurface(this, _directDrawManager._backSurfaces[idx]);
+ }
+
+ // Load fonts
+ _fonts[0].load(149);
+ _fonts[1].load(151);
+ _fonts[2].load(152);
+ _fonts[3].load(153);
+
+ // Load the cursors
+ loadCursors();
+}
+
void OSScreenManager::proc5() {}
void OSScreenManager::proc6() {}
void OSScreenManager::proc7() {}
@@ -96,4 +116,17 @@ void OSScreenManager::proc25() {}
void OSScreenManager::showCursor() {}
void OSScreenManager::proc27() {}
+void OSScreenManager::destroyFrontAndBackBuffers() {
+ delete _frontRenderSurface;
+ _frontRenderSurface = nullptr;
+
+ for (uint idx = 0; idx < _backSurfaces.size(); ++idx)
+ delete _backSurfaces[idx];
+ _backSurfaces.clear();
+}
+
+void OSScreenManager::loadCursors() {
+ // TODO
+}
+
} // End of namespace Titanic
diff --git a/engines/titanic/screen_manager.h b/engines/titanic/screen_manager.h
index b30b7a0798..4647c71c81 100644
--- a/engines/titanic/screen_manager.h
+++ b/engines/titanic/screen_manager.h
@@ -25,10 +25,14 @@
#include "common/scummsys.h"
#include "common/array.h"
+#include "titanic/direct_draw.h"
#include "titanic/font.h"
+#include "titanic/video_surface.h"
namespace Titanic {
+class TitanicEngine;
+
class CSurface {
};
@@ -43,26 +47,27 @@ public:
};
class CScreenManager {
+protected:
+ TitanicEngine *_vm;
public:
void *_screenManagerPtr;
public:
- int _field4;
- Common::Array<CSurface> _backSurfaces;
- CSurface *_fontRenderSurface;
+ Common::Array<CVideoSurface *> _backSurfaces;
+ CVideoSurface *_frontRenderSurface;
CScreenManagerRec _entries[2];
void *_mouseCursor;
void *_textCursor;
int _fontNumber;
public:
- CScreenManager();
+ CScreenManager(TitanicEngine *vm);
virtual ~CScreenManager();
void fn1() {}
void fn2() {}
- virtual void proc2(int v);
- virtual bool proc3(int v);
- virtual void setMode() = 0;
+ virtual void setWindowHandle(int v);
+ virtual bool resetWindowHandle(int v);
+ virtual void setMode(int width, int height, int bpp, int numBackSurfaces, bool flag2) = 0;
virtual void proc5() = 0;
virtual void proc6() = 0;
virtual void proc7() = 0;
@@ -89,17 +94,29 @@ public:
};
class OSScreenManager: CScreenManager {
+private:
+ DirectDrawManager _directDrawManager;
+
+ /**
+ * Frees any surface buffers
+ */
+ void destroyFrontAndBackBuffers();
+
+ /**
+ * Load game cursors
+ */
+ void loadCursors();
public:
int _field48;
int _field4C;
int _field50;
int _field54;
- void *_directDrawManager;
STFont _fonts[4];
public:
- OSScreenManager();
+ OSScreenManager(TitanicEngine *vm);
+ virtual ~OSScreenManager();
- virtual void setMode();
+ virtual void setMode(int width, int height, int bpp, int numBackSurfaces, bool flag2);
virtual void proc5();
virtual void proc6();
virtual void proc7();
diff --git a/engines/titanic/titanic.cpp b/engines/titanic/titanic.cpp
index c438c353ef..d64577c814 100644
--- a/engines/titanic/titanic.cpp
+++ b/engines/titanic/titanic.cpp
@@ -53,7 +53,7 @@ void TitanicEngine::initialize() {
CSaveableObject::initClassList();
_window = new CMainGameWindow(this);
- _screenManager = new OSScreenManager();
+ _screenManager = new OSScreenManager(this);
}
Common::Error TitanicEngine::run() {
diff --git a/engines/titanic/titanic.h b/engines/titanic/titanic.h
index 2e51a9d75a..ec0585c410 100644
--- a/engines/titanic/titanic.h
+++ b/engines/titanic/titanic.h
@@ -50,6 +50,10 @@ enum TitanicDebugChannels {
#define TITANIC_SAVEGAME_VERSION 1
+#define ERROR_BASIC 1
+#define ERROR_INTERMEDIATE 2
+#define ERROR_DETAILED 3
+
struct TitanicGameDescription;
class TitanicEngine;
@@ -62,13 +66,6 @@ struct TitanicSavegameHeader {
int _totalFrames;
};
-class Manager {
-protected:
- TitanicEngine *_vm;
-public:
- Manager(TitanicEngine *vm) : _vm(vm) {}
-};
-
class TitanicEngine : public Engine {
private:
/**
diff --git a/engines/titanic/video_surface.cpp b/engines/titanic/video_surface.cpp
index d25e9da77a..d03e2f4525 100644
--- a/engines/titanic/video_surface.cpp
+++ b/engines/titanic/video_surface.cpp
@@ -24,4 +24,19 @@
namespace Titanic {
+CVideoSurface::CVideoSurface(CScreenManager *screenManager, Graphics::Surface *surface):
+ _screenManager(screenManager), _surface(surface) {
+}
+
+void CVideoSurface::setSurface(CScreenManager *screenManager, Graphics::Surface *surface) {
+ _screenManager = screenManager;
+ _surface = surface;
+}
+
+/*------------------------------------------------------------------------*/
+
+OSVideoSurface::OSVideoSurface(CScreenManager *screenManager, Graphics::Surface *surface):
+ CVideoSurface(screenManager, surface) {
+}
+
} // End of namespace Titanic
diff --git a/engines/titanic/video_surface.h b/engines/titanic/video_surface.h
index 259c5b0ebf..978eacfbbe 100644
--- a/engines/titanic/video_surface.h
+++ b/engines/titanic/video_surface.h
@@ -25,16 +25,26 @@
#include "common/scummsys.h"
#include "common/array.h"
+#include "graphics/surface.h"
#include "titanic/font.h"
namespace Titanic {
+class CScreenManager;
+
class CVideoSurface {
+private:
+ CScreenManager *_screenManager;
+ Graphics::Surface *_surface;
+public:
+ CVideoSurface(CScreenManager *screenManager, Graphics::Surface *surface);
+ void setSurface(CScreenManager *screenManager, Graphics::Surface *surface);
};
-class OSVideoSurface : CVideoSurface {
-
+class OSVideoSurface : public CVideoSurface {
+public:
+ OSVideoSurface(CScreenManager *screenManager, Graphics::Surface *surface);
};
} // End of namespace Titanic