aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/mohawk/graphics.cpp3
-rw-r--r--engines/mohawk/graphics.h4
-rw-r--r--engines/mohawk/jpeg.cpp (renamed from engines/mohawk/myst_jpeg.cpp)49
-rw-r--r--engines/mohawk/jpeg.h (renamed from engines/mohawk/myst_jpeg.h)20
-rw-r--r--engines/mohawk/module.mk2
-rw-r--r--engines/mohawk/myst_pict.cpp2
-rw-r--r--engines/mohawk/myst_pict.h6
-rw-r--r--engines/mohawk/video/qt_player.cpp5
8 files changed, 59 insertions, 32 deletions
diff --git a/engines/mohawk/graphics.cpp b/engines/mohawk/graphics.cpp
index fc29c7de83..a634cd1584 100644
--- a/engines/mohawk/graphics.cpp
+++ b/engines/mohawk/graphics.cpp
@@ -76,7 +76,8 @@ MystGraphics::MystGraphics(MohawkEngine_Myst* vm) : _vm(vm) {
error("Myst requires greater than 256 colors to run");
if (_vm->getFeatures() & GF_ME) {
- _jpegDecoder = new MystJPEG();
+ // We want to delete our own JPEG surfaces, so don't free after use.
+ _jpegDecoder = new JPEGDecoder(false);
_pictDecoder = new MystPICT(_jpegDecoder);
} else {
_jpegDecoder = NULL;
diff --git a/engines/mohawk/graphics.h b/engines/mohawk/graphics.h
index 16d515ac08..831e768e41 100644
--- a/engines/mohawk/graphics.h
+++ b/engines/mohawk/graphics.h
@@ -27,8 +27,8 @@
#define MOHAWK_GRAPHICS_H
#include "mohawk/bitmap.h"
+#include "mohawk/jpeg.h"
#include "mohawk/livingbooks.h"
-#include "mohawk/myst_jpeg.h"
#include "mohawk/myst_pict.h"
#include "common/file.h"
@@ -104,7 +104,7 @@ private:
MohawkEngine_Myst *_vm;
MystBitmap *_bmpDecoder;
MystPICT *_pictDecoder;
- MystJPEG *_jpegDecoder;
+ JPEGDecoder *_jpegDecoder;
Graphics::PixelFormat _pixelFormat;
struct PictureFile {
diff --git a/engines/mohawk/myst_jpeg.cpp b/engines/mohawk/jpeg.cpp
index e131347a11..07ec54dfea 100644
--- a/engines/mohawk/myst_jpeg.cpp
+++ b/engines/mohawk/jpeg.cpp
@@ -26,41 +26,62 @@
#include "common/system.h"
#include "graphics/conversion.h" // For YUV2RGB
-#include "mohawk/myst_jpeg.h"
+#include "mohawk/jpeg.h"
namespace Mohawk {
-MystJPEG::MystJPEG() {
+JPEGDecoder::JPEGDecoder(bool freeSurfaceAfterUse) : Graphics::Codec(), _freeSurfaceAfterUse(freeSurfaceAfterUse) {
_jpeg = new Graphics::JPEG();
_pixelFormat = g_system->getScreenFormat();
+ _surface = NULL;
+}
+
+JPEGDecoder::~JPEGDecoder() {
+ delete _jpeg;
- // We're going to have to dither if we're running in 8bpp.
- // We'll take RGBA8888 for best color performance in this case.
- if (_pixelFormat.bytesPerPixel == 1)
- _pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0);
+ if (_surface) {
+ _surface->free();
+ delete _surface;
+ }
}
-Graphics::Surface *MystJPEG::decodeImage(Common::SeekableReadStream* stream) {
+Graphics::Surface *JPEGDecoder::decodeImage(Common::SeekableReadStream* stream) {
_jpeg->read(stream);
Graphics::Surface *ySurface = _jpeg->getComponent(1);
Graphics::Surface *uSurface = _jpeg->getComponent(2);
Graphics::Surface *vSurface = _jpeg->getComponent(3);
- Graphics::Surface *finalSurface = new Graphics::Surface();
- finalSurface->create(ySurface->w, ySurface->h, _pixelFormat.bytesPerPixel);
+ Graphics::Surface *destSurface = NULL;
+
+ // If we should free the surface after use, use the internal _surface storage
+ // (this should be used when using as a Codec, as the Codecs should free their
+ // surfaces when deleting the Codec object). Otherwise, create a new Surface
+ // as the destination.
+ if (_freeSurfaceAfterUse) {
+ if (!_surface) {
+ _surface = new Graphics::Surface();
+ _surface->create(ySurface->w, ySurface->h, _pixelFormat.bytesPerPixel);
+ }
+ destSurface = _surface;
+ } else {
+ destSurface = new Graphics::Surface();
+ destSurface->create(ySurface->w, ySurface->h, _pixelFormat.bytesPerPixel);
+ }
+
+ assert(destSurface);
- for (uint16 i = 0; i < finalSurface->h; i++) {
- for (uint16 j = 0; j < finalSurface->w; j++) {
+ for (uint16 i = 0; i < destSurface->h; i++) {
+ for (uint16 j = 0; j < destSurface->w; j++) {
byte r = 0, g = 0, b = 0;
Graphics::YUV2RGB(*((byte *)ySurface->getBasePtr(j, i)), *((byte *)uSurface->getBasePtr(j, i)), *((byte *)vSurface->getBasePtr(j, i)), r, g, b);
if (_pixelFormat.bytesPerPixel == 2)
- *((uint16 *)finalSurface->getBasePtr(j, i)) = _pixelFormat.RGBToColor(r, g, b);
+ *((uint16 *)destSurface->getBasePtr(j, i)) = _pixelFormat.RGBToColor(r, g, b);
else
- *((uint32 *)finalSurface->getBasePtr(j, i)) = _pixelFormat.RGBToColor(r, g, b);
+ *((uint32 *)destSurface->getBasePtr(j, i)) = _pixelFormat.RGBToColor(r, g, b);
}
}
- return finalSurface;
+ return destSurface;
}
} // End of namespace Mohawk
diff --git a/engines/mohawk/myst_jpeg.h b/engines/mohawk/jpeg.h
index ae51dccf7a..086e78332f 100644
--- a/engines/mohawk/myst_jpeg.h
+++ b/engines/mohawk/jpeg.h
@@ -23,32 +23,36 @@
*
*/
-#ifndef MYST_JPEG_H
-#define MYST_JPEG_H
+#ifndef MOHAWK_JPEG_H
+#define MOHAWK_JPEG_H
#include "common/scummsys.h"
#include "common/stream.h"
+#include "graphics/video/codecs/codec.h"
#include "graphics/jpeg.h"
#include "graphics/pixelformat.h"
namespace Mohawk {
-// Myst JPEG Decoder
-// Basically a wrapper around JPEG which converts to RGB
+// Mohawk's JPEG Decoder
+// Basically a wrapper around JPEG which converts to RGB and also functions
+// as a Codec.
-class MystJPEG {
+class JPEGDecoder : public Graphics::Codec {
public:
- MystJPEG();
- ~MystJPEG() { delete _jpeg; }
+ JPEGDecoder(bool freeSurfaceAfterUse);
+ ~JPEGDecoder();
Graphics::Surface *decodeImage(Common::SeekableReadStream *stream);
private:
Graphics::PixelFormat _pixelFormat;
Graphics::JPEG *_jpeg;
+ Graphics::Surface *_surface;
+ bool _freeSurfaceAfterUse;
};
-}
+} // End of namespace Mohawk
#endif
diff --git a/engines/mohawk/module.mk b/engines/mohawk/module.mk
index 6e72aef0f5..ef1b5f7bb5 100644
--- a/engines/mohawk/module.mk
+++ b/engines/mohawk/module.mk
@@ -6,10 +6,10 @@ MODULE_OBJS = \
detection.o \
dialogs.o \
graphics.o \
+ jpeg.o \
livingbooks.o \
mohawk.o \
myst.o \
- myst_jpeg.o \
myst_pict.o \
myst_vars.o \
myst_saveload.o \
diff --git a/engines/mohawk/myst_pict.cpp b/engines/mohawk/myst_pict.cpp
index 765f5b206a..e305937951 100644
--- a/engines/mohawk/myst_pict.cpp
+++ b/engines/mohawk/myst_pict.cpp
@@ -32,7 +32,7 @@ namespace Mohawk {
// The PICT code is based off of the QuickDraw specs:
// http://developer.apple.com/documentation/mac/QuickDraw/QuickDraw-461.html
-MystPICT::MystPICT(MystJPEG *jpegDecoder) {
+MystPICT::MystPICT(JPEGDecoder *jpegDecoder) {
_jpegDecoder = jpegDecoder;
_pixelFormat = g_system->getScreenFormat();
}
diff --git a/engines/mohawk/myst_pict.h b/engines/mohawk/myst_pict.h
index 6b56a521b3..087fd301cd 100644
--- a/engines/mohawk/myst_pict.h
+++ b/engines/mohawk/myst_pict.h
@@ -32,18 +32,18 @@
#include "graphics/pixelformat.h"
#include "graphics/surface.h"
-#include "mohawk/myst_jpeg.h"
+#include "mohawk/jpeg.h"
namespace Mohawk {
class MystPICT {
public:
- MystPICT(MystJPEG *jpegDecoder);
+ MystPICT(JPEGDecoder *jpegDecoder);
~MystPICT() {}
Graphics::Surface *decodeImage(Common::SeekableReadStream *stream);
private:
- MystJPEG *_jpegDecoder;
+ JPEGDecoder *_jpegDecoder;
Common::Rect _imageRect;
Graphics::PixelFormat _pixelFormat;
diff --git a/engines/mohawk/video/qt_player.cpp b/engines/mohawk/video/qt_player.cpp
index 6f868a5418..2423294649 100644
--- a/engines/mohawk/video/qt_player.cpp
+++ b/engines/mohawk/video/qt_player.cpp
@@ -44,6 +44,7 @@
#include "mohawk/video/qdm2.h"
// Video codecs
+#include "mohawk/jpeg.h"
#include "mohawk/video/cinepak.h"
#include "mohawk/video/qtrle.h"
#include "mohawk/video/rpza.h"
@@ -174,8 +175,8 @@ Graphics::Codec *QTPlayer::createCodec(uint32 codecTag, byte bitsPerPixel) {
// Sorenson Video 3: Used by some Myst ME videos.
warning ("Sorenson Video 3 not yet supported");
} else if (codecTag == MKID_BE('jpeg')) {
- // Motion JPEG: Used by some Myst ME videos.
- warning ("Motion JPEG not yet supported");
+ // Motion JPEG: Used by some Myst ME 10th Anniversary videos.
+ return new JPEGDecoder(true);
} else if (codecTag == MKID_BE('QkBk')) {
// CDToons: Used by most of the Broderbund games. This is an unknown format so far.
warning ("CDToons not yet supported");