aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic/star_control/surface_fader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic/star_control/surface_fader.cpp')
-rw-r--r--engines/titanic/star_control/surface_fader.cpp62
1 files changed, 58 insertions, 4 deletions
diff --git a/engines/titanic/star_control/surface_fader.cpp b/engines/titanic/star_control/surface_fader.cpp
index 694832311f..79129d9732 100644
--- a/engines/titanic/star_control/surface_fader.cpp
+++ b/engines/titanic/star_control/surface_fader.cpp
@@ -26,6 +26,38 @@
namespace Titanic {
+
+CSurfaceFaderBase::CSurfaceFaderBase() : _index(-1), _count(32),
+ _videoSurface(nullptr) {
+}
+
+CSurfaceFaderBase::~CSurfaceFaderBase() {
+ delete _videoSurface;
+}
+
+void CSurfaceFaderBase::reset() {
+ _index = 0;
+}
+
+bool CSurfaceFaderBase::setupSurface(CScreenManager *screenManager, CVideoSurface *srcSurface) {
+ int width = srcSurface->getWidth();
+ int height = srcSurface->getHeight();
+
+ if (_videoSurface) {
+ if (width == _videoSurface->getWidth() && _videoSurface->getHeight())
+ // Allocated surface already matches new size
+ return true;
+
+ // Different sizes, so delete old surface
+ delete _videoSurface;
+ }
+
+ _videoSurface = screenManager->createSurface(width, height);
+ return true;
+}
+
+/*------------------------------------------------------------------------*/
+
CSurfaceFader::CSurfaceFader() : CSurfaceFaderBase() {
_dataP = new byte[_count];
@@ -38,6 +70,32 @@ CSurfaceFader::~CSurfaceFader() {
delete[] _dataP;
}
+void CSurfaceFader::setFadeIn(bool fadeIn) {
+ _fadeIn = fadeIn;
+}
+
+CVideoSurface *CSurfaceFader::fade(CScreenManager *screenManager, CVideoSurface *srcSurface) {
+ if (_index == -1 || _index >= _count)
+ return srcSurface;
+
+ if (!_count && !setupSurface(screenManager, srcSurface))
+ return nullptr;
+
+ srcSurface->lock();
+ _videoSurface->lock();
+ CSurfaceArea srCSurfaceArea(srcSurface);
+ CSurfaceArea destSurfaceObj(_videoSurface);
+
+ // Copy the surface with fading
+ copySurface(srCSurfaceArea, destSurfaceObj);
+
+ srcSurface->unlock();
+ _videoSurface->unlock();
+
+ ++_index;
+ return _videoSurface;
+}
+
void CSurfaceFader::copySurface(CSurfaceArea &srcSurface, CSurfaceArea &destSurface) {
const uint16 *srcPixelP = (const uint16 *)srcSurface._pixelsPtr;
uint16 *destPixelP = (uint16 *)destSurface._pixelsPtr;
@@ -66,8 +124,4 @@ void CSurfaceFader::copySurface(CSurfaceArea &srcSurface, CSurfaceArea &destSurf
}
}
-void CSurfaceFader::setFadeIn(bool fadeIn) {
- _fadeIn = fadeIn;
-}
-
} // End of namespace Titanic