aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic/support
diff options
context:
space:
mode:
authorPaul Gilbert2016-07-03 13:52:09 -0400
committerPaul Gilbert2016-07-15 19:27:06 -0400
commit5ab33f117a0bc3451a1d30024208c45a2a548a4b (patch)
treed46420a6762b30dd8edb703b3846ebace3393d2c /engines/titanic/support
parentd9e05e215c1ba8ab93530e7263b527c03fcc61c8 (diff)
downloadscummvm-rg350-5ab33f117a0bc3451a1d30024208c45a2a548a4b.tar.gz
scummvm-rg350-5ab33f117a0bc3451a1d30024208c45a2a548a4b.tar.bz2
scummvm-rg350-5ab33f117a0bc3451a1d30024208c45a2a548a4b.zip
TITANIC: Adding more video surface methods
Diffstat (limited to 'engines/titanic/support')
-rw-r--r--engines/titanic/support/image_decoders.cpp4
-rw-r--r--engines/titanic/support/movie.cpp2
-rw-r--r--engines/titanic/support/video_surface.cpp36
-rw-r--r--engines/titanic/support/video_surface.h59
4 files changed, 92 insertions, 9 deletions
diff --git a/engines/titanic/support/image_decoders.cpp b/engines/titanic/support/image_decoders.cpp
index 9fe55eb02b..4203dad97c 100644
--- a/engines/titanic/support/image_decoders.cpp
+++ b/engines/titanic/support/image_decoders.cpp
@@ -36,7 +36,7 @@ void CJPEGDecode::decode(OSVideoSurface &surface, const CString &name) {
// Resize the surface if necessary
if (!surface.hasSurface() || surface.getWidth() != srcSurf->w
|| surface.getHeight() != srcSurf->h)
- surface.resize(srcSurf->w, srcSurf->h);
+ surface.recreate(srcSurf->w, srcSurf->h);
// Convert the decoded surface to the correct pixel format, and then copy it over
surface.lock();
@@ -63,7 +63,7 @@ void CTargaDecode::decode(OSVideoSurface &surface, const CString &name) {
// Resize the surface if necessary
if (!surface.hasSurface() || surface.getWidth() != srcSurf->w
|| surface.getHeight() != srcSurf->h)
- surface.resize(srcSurf->w, srcSurf->h);
+ surface.recreate(srcSurf->w, srcSurf->h);
// Convert the decoded surface to the correct pixel format, and then copy it over
surface.lock();
diff --git a/engines/titanic/support/movie.cpp b/engines/titanic/support/movie.cpp
index 361bf6e1fa..9b6fd01710 100644
--- a/engines/titanic/support/movie.cpp
+++ b/engines/titanic/support/movie.cpp
@@ -175,7 +175,7 @@ void OSMovie::decodeFrame() {
// If the video surface doesn't yet have an underlying surface, create it
if (!videoSurface->hasSurface())
- videoSurface->resize(frame->w, frame->h);
+ videoSurface->recreate(frame->w, frame->h);
// Lock access to the surface
videoSurface->lock();
diff --git a/engines/titanic/support/video_surface.cpp b/engines/titanic/support/video_surface.cpp
index 9293b03f02..e71b25184b 100644
--- a/engines/titanic/support/video_surface.cpp
+++ b/engines/titanic/support/video_surface.cpp
@@ -296,7 +296,14 @@ int OSVideoSurface::getPitch() {
return _ddSurface->getPitch();
}
-void OSVideoSurface::resize(int width, int height) {
+int OSVideoSurface::getBpp() {
+ if (!loadIfReady())
+ error("Could not load resource");
+
+ return getPixelDepth();
+}
+
+void OSVideoSurface::recreate(int width, int height) {
freeSurface();
_screenManager->resizeSurface(this, width, height);
@@ -304,9 +311,19 @@ void OSVideoSurface::resize(int width, int height) {
_videoSurfaceCounter += _ddSurface->getSize();
}
+void OSVideoSurface::resize(int width, int height) {
+ if (!_ddSurface || _ddSurface->getWidth() != width ||
+ _ddSurface->getHeight() != height)
+ recreate(width, height);
+}
+
+void OSVideoSurface::detachSurface() {
+ _ddSurface = nullptr;
+}
+
int OSVideoSurface::getPixelDepth() {
if (!loadIfReady())
- assert(0);
+ error("Could not load resource");
lock();
@@ -360,6 +377,13 @@ uint16 OSVideoSurface::getPixel(const Common::Point &pt) {
}
}
+void OSVideoSurface::setPixel(const Point &pt, uint pixel) {
+ assert(getPixelDepth() == 2);
+
+ uint16 *pixelP = (uint16 *)_rawSurface->getBasePtr(pt.x, pt.y);
+ *pixelP = pixel;
+}
+
void OSVideoSurface::changePixel(uint16 *pixelP, uint16 *color, byte srcVal, bool remapFlag) {
assert(getPixelDepth() == 2);
const Graphics::PixelFormat &destFormat = _ddSurface->getFormat();
@@ -391,9 +415,17 @@ void OSVideoSurface::shiftColors() {
// we already convert 16-bit surfaces as soon as they're loaded
}
+void OSVideoSurface::clear() {
+ if (!loadIfReady())
+ error("Could not load resource");
+
+}
+
void OSVideoSurface::playMovie(uint flags, CVideoSurface *surface) {
if (loadIfReady() && _movie)
_movie->play(flags, surface);
+
+ _ddSurface->fill(nullptr, 0);
}
void OSVideoSurface::playMovie(uint startFrame, uint endFrame, int v3, bool v4) {
diff --git a/engines/titanic/support/video_surface.h b/engines/titanic/support/video_surface.h
index e5d904f6d6..9b7e0fbaec 100644
--- a/engines/titanic/support/video_surface.h
+++ b/engines/titanic/support/video_surface.h
@@ -129,13 +129,28 @@ public:
* Returns the pitch of the surface in bytes
*/
virtual int getPitch() = 0;
-
+
+ /**
+ * Returns the bytes per pixel of the surface
+ */
+ virtual int getBpp() = 0;
+
/**
- * Reiszes the surface
+ * Recreates the surface
+ */
+ virtual void recreate(int width, int height) = 0;
+
+ /**
+ * Resizes the surface
*/
virtual void resize(int width, int height) = 0;
/**
+ * Detachs the underlying raw surface
+ */
+ virtual void detachSurface() = 0;
+
+ /**
* Returns the number of bytes per pixel in the surface
*/
virtual int getPixelDepth() = 0;
@@ -145,6 +160,12 @@ public:
*/
virtual uint16 getPixel(const Common::Point &pt) = 0;
+
+ /**
+ * Sets a pixel at a specified position within the surface
+ */
+ virtual void setPixel(const Point &pt, uint pixel) = 0;
+
/**
* Change a pixel
*/
@@ -156,6 +177,11 @@ public:
virtual void shiftColors() = 0;
/**
+ * Clears the entire surface to black
+ */
+ virtual void clear() = 0;
+
+ /**
* Plays a movie, loading it from the specified _resource
* if not already loaded
*/
@@ -305,11 +331,26 @@ public:
virtual int getPitch();
/**
- * Reiszes the surface
+ * Returns the bytes per pixel of the surface
+ */
+ virtual int getBpp();
+
+ /**
+ * Recreates the surface with the designated size
+ */
+ virtual void recreate(int width, int height);
+
+ /**
+ * Resizes the surface
*/
virtual void resize(int width, int height);
/**
+ * Detachs the underlying raw surface
+ */
+ virtual void detachSurface();
+
+ /**
* Returns the number of bytes per pixel in the surface
*/
virtual int getPixelDepth();
@@ -317,7 +358,12 @@ public:
/**
* Gets the pixel at the specified position within the surface
*/
- virtual uint16 getPixel(const Common::Point &pt);
+ virtual uint16 getPixel(const Point &pt);
+
+ /**
+ * Sets a pixel at a specified position within the surface
+ */
+ virtual void setPixel(const Point &pt, uint pixel);
/**
* Change a pixel
@@ -330,6 +376,11 @@ public:
virtual void shiftColors();
/**
+ * Clears the entire surface to black
+ */
+ virtual void clear();
+
+ /**
* Plays a movie, loading it from the specified _resource
* if not already loaded
*/