aboutsummaryrefslogtreecommitdiff
path: root/engines/mohawk/video.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/mohawk/video.cpp')
-rw-r--r--engines/mohawk/video.cpp46
1 files changed, 42 insertions, 4 deletions
diff --git a/engines/mohawk/video.cpp b/engines/mohawk/video.cpp
index cebb72e24f..ca38f22b7a 100644
--- a/engines/mohawk/video.cpp
+++ b/engines/mohawk/video.cpp
@@ -53,6 +53,8 @@ bool VideoEntry::endOfVideo() {
}
VideoManager::VideoManager(MohawkEngine* vm) : _vm(vm) {
+ // Set dithering enabled, if required
+ _enableDither = _vm->getGameType() == GType_MYST && !(_vm->getFeatures() & GF_ME);
}
VideoManager::~VideoManager() {
@@ -230,16 +232,23 @@ bool VideoManager::updateMovies() {
Graphics::PixelFormat pixelFormat = _vm->_system->getScreenFormat();
if (frame->format != pixelFormat) {
- // We don't support downconverting to 8bpp
- if (pixelFormat.bytesPerPixel == 1)
- error("Cannot convert high color video frame to 8bpp");
+ // We don't support downconverting to 8bpp without having
+ // support in the codec. Set _enableDither if shows up.
+ if (pixelFormat.bytesPerPixel == 1) {
+ warning("Cannot convert high color video frame to 8bpp");
+ delete _videoStreams[i].video;
+ _videoStreams[i].clear();
+ continue;
+ }
// Convert to the current screen format
convertedFrame = frame->convertTo(pixelFormat, _videoStreams[i]->getPalette());
frame = convertedFrame;
} else if (pixelFormat.bytesPerPixel == 1 && _videoStreams[i]->hasDirtyPalette()) {
// Set the palette when running in 8bpp mode only
- _vm->_system->getPaletteManager()->setPalette(_videoStreams[i]->getPalette(), 0, 256);
+ // Don't do this for Myst, which has its own per-stack handling
+ if (_vm->getGameType() != GType_MYST)
+ _vm->_system->getPaletteManager()->setPalette(_videoStreams[i]->getPalette(), 0, 256);
}
// Clip the width/height to make sure we stay on the screen (Myst does this a few times)
@@ -394,6 +403,9 @@ VideoHandle VideoManager::createVideoHandle(uint16 id, uint16 x, uint16 y, bool
entry.loop = loop;
entry.enabled = true;
+ // Enable dither if necessary
+ checkEnableDither(entry);
+
entry->start();
// Search for any deleted videos so we can take a formerly used slot
@@ -431,6 +443,10 @@ VideoHandle VideoManager::createVideoHandle(const Common::String &filename, uint
}
entry->loadStream(file);
+
+ // Enable dither if necessary
+ checkEnableDither(entry);
+
entry->setVolume(volume);
entry->start();
@@ -551,4 +567,26 @@ void VideoManager::pauseMovie(VideoHandle handle, bool pause) {
_videoStreams[handle]->pauseVideo(pause);
}
+void VideoManager::checkEnableDither(VideoEntry &entry) {
+ // If we're not dithering, bail out
+ if (!_enableDither)
+ return;
+
+ // Ignore any video which is already 8bpp
+ if (entry->getPixelFormat().bytesPerPixel == 1)
+ return;
+
+ // Set the palette
+ byte palette[256 * 3];
+ g_system->getPaletteManager()->grabPalette(palette, 0, 256);
+ entry->setDitheringPalette(palette);
+
+ if (entry->getPixelFormat().bytesPerPixel != 1) {
+ if (entry.filename.empty())
+ error("Failed to set dither for video %d", entry.id);
+ else
+ error("Failed to set dither for video %s", entry.filename.c_str());
+ }
+}
+
} // End of namespace Mohawk