diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/sherlock/resources.cpp | 54 | ||||
-rw-r--r-- | engines/sherlock/resources.h | 19 |
2 files changed, 59 insertions, 14 deletions
diff --git a/engines/sherlock/resources.cpp b/engines/sherlock/resources.cpp index c5814965ad..ab5c6ab56f 100644 --- a/engines/sherlock/resources.cpp +++ b/engines/sherlock/resources.cpp @@ -600,6 +600,39 @@ ImageFile3DO::~ImageFile3DO() { } void ImageFile3DO::load(Common::SeekableReadStream &stream, bool animImages) { + uint32 headerId = stream.readUint32BE(); + + // Sekk back to the start + stream.seek(0); + + // Identify type of file + switch (headerId) { + case MKTAG('C', 'C', 'B', ' '): + // .cel file (title1a.cel etc.) + load3DOCelFile(stream); + break; + + case MKTAG('A', 'N', 'I', 'M'): + // 3DO animation file (walk.anim) + break; + + default: + // Sherlock animation file (.3da files) + loadAnimationFile(stream, animImages); + break; + } +} + +// 3DO uses RGB555, we use RGB565 internally so that more platforms are able to run us +inline uint16 ImageFile3DO::convertPixel(uint16 pixel3DO) { + byte red = (pixel3DO >> 10) & 0x1F; + byte green = (pixel3DO >> 5) & 0x1F; + byte blue = pixel3DO & 0x1F;; + + return ((red << 11) | (green << 6) | (blue)); +} + +void ImageFile3DO::loadAnimationFile(Common::SeekableReadStream &stream, bool animImages) { int streamSize = stream.size(); uint32 compressedSize = 0; @@ -635,23 +668,18 @@ void ImageFile3DO::load(Common::SeekableReadStream &stream, bool animImages) { // Load data for frame and decompress it byte *data = new byte[compressedSize]; stream.read(data, compressedSize); - decompressFrame(&stream, frame, data); + decompressAnimationFrame(&stream, frame, data); delete[] data; push_back(frame); } } -// 3DO uses RGB555, we use RGB565 internally so that more platforms are able to run us -inline uint16 ImageFile3DO::convertPixel(uint16 pixel3DO) { - byte red = (pixel3DO >> 10) & 0x1F; - byte green = (pixel3DO >> 5) & 0x1F; - byte blue = pixel3DO & 0x1F;; - - return ((red << 11) | (green << 6) | (blue)); -} - -void ImageFile3DO::decompressFrame(Common::SeekableReadStream *stream, ImageFrame &frame, const byte *src) { +// Decompresses an animation frame of a .3DA file +// note: the .3DA files seem to use an "in memory" format, which uses the same compression technique +// as regular 3DO cel files, but every scanline is started with a length UINT16 and each scanline +// also starts on UINT32 boundaries +void ImageFile3DO::decompressAnimationFrame(Common::SeekableReadStream *stream, ImageFrame &frame, const byte *src) { frame._frame.create(frame._width, frame._height, Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0)); uint16 *dest = (uint16 *)frame._frame.getPixels(); Common::fill(dest, dest + frame._width * frame._height, 0); @@ -722,4 +750,8 @@ void ImageFile3DO::decompressFrame(Common::SeekableReadStream *stream, ImageFram } } +void ImageFile3DO::load3DOCelFile(Common::SeekableReadStream &stream) { + warning("3DO-cel file loader currently missing"); +} + } // End of namespace Sherlock diff --git a/engines/sherlock/resources.h b/engines/sherlock/resources.h index 0d820be304..44da810d29 100644 --- a/engines/sherlock/resources.h +++ b/engines/sherlock/resources.h @@ -232,12 +232,25 @@ private: void load(Common::SeekableReadStream &stream, bool animImages); /** - * Decompress a single frame for the sprite + * convert pixel RGB values from RGB555 to RGB565 */ - void decompressFrame(Common::SeekableReadStream *stream, ImageFrame &frame, const byte *src); - inline uint16 convertPixel(uint16 pixel3DO); + /** + * Load 3DO cel file + */ + void load3DOCelFile(Common::SeekableReadStream &stream); + + /** + * Load animation graphics file + */ + void loadAnimationFile(Common::SeekableReadStream &stream, bool animImages); + + /** + * Decompress a single frame for the sprite + */ + void decompressAnimationFrame(Common::SeekableReadStream *stream, ImageFrame &frame, const byte *src); + public: ImageFile3DO(const Common::String &name, bool animImages = false); ImageFile3DO(Common::SeekableReadStream &stream); |