aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Hoops2010-11-18 20:40:48 +0000
committerMatthew Hoops2010-11-18 20:40:48 +0000
commitd94844f20596a24d14a056ce272eb0cf98acef4a (patch)
treeb96c6a123014fcef5b87018440a5a442951b8392
parent9fb1e2b17ea294b06297139198cd80c06783a714 (diff)
downloadscummvm-rg350-d94844f20596a24d14a056ce272eb0cf98acef4a.tar.gz
scummvm-rg350-d94844f20596a24d14a056ce272eb0cf98acef4a.tar.bz2
scummvm-rg350-d94844f20596a24d14a056ce272eb0cf98acef4a.zip
MOHAWK: Add support for Riven 24bpp images (not yet used)
svn-id: r54345
-rw-r--r--engines/mohawk/bitmap.cpp45
-rw-r--r--engines/mohawk/bitmap.h11
2 files changed, 42 insertions, 14 deletions
diff --git a/engines/mohawk/bitmap.cpp b/engines/mohawk/bitmap.cpp
index 931f5fc2c9..0e26e4844b 100644
--- a/engines/mohawk/bitmap.cpp
+++ b/engines/mohawk/bitmap.cpp
@@ -70,7 +70,7 @@ ImageData *MohawkBitmap::decodeImage(Common::SeekableReadStream *stream) {
debug (2, "Decoding Mohawk Bitmap (%dx%d, %dbpp, %s Packing + %s Drawing)", _header.width, _header.height, getBitsPerPixel(), getPackName(), getDrawName());
- if (getBitsPerPixel() != 8)
+ if (getBitsPerPixel() != 8 && getBitsPerPixel() != 24)
error ("Unhandled bpp %d", getBitsPerPixel());
// Read in the palette if it's here.
@@ -88,8 +88,7 @@ ImageData *MohawkBitmap::decodeImage(Common::SeekableReadStream *stream) {
}
}
- Graphics::Surface *surface = new Graphics::Surface();
- surface->create(_header.width, _header.height, getBitsPerPixel() >> 3);
+ Graphics::Surface *surface = createSurface(_header.width, _header.height);
unpackImage();
drawImage(surface);
@@ -98,6 +97,13 @@ ImageData *MohawkBitmap::decodeImage(Common::SeekableReadStream *stream) {
return new ImageData(surface, _header.colorTable.palette);
}
+Graphics::Surface *MohawkBitmap::createSurface(uint16 width, uint16 height) {
+ Graphics::Surface *surface = new Graphics::Surface();
+ byte bytesPerPixel = (getBitsPerPixel() <= 8) ? 1 : g_system->getScreenFormat().bytesPerPixel;
+ surface->create(width, height, bytesPerPixel);
+ return surface;
+}
+
byte MohawkBitmap::getBitsPerPixel() {
switch (_header.format & kBitsPerPixelMask) {
case kBitsPerPixel1:
@@ -111,7 +117,7 @@ byte MohawkBitmap::getBitsPerPixel() {
case kBitsPerPixel24:
return 24;
default:
- error ("Unknown bits per pixel");
+ error("Unknown bits per pixel");
}
return 0;
@@ -132,7 +138,7 @@ void MohawkBitmap::unpackImage() {
return;
}
- warning("Unknown Pack Compression");
+ error("Unknown Pack Compression");
}
const char *MohawkBitmap::getDrawName() {
@@ -150,7 +156,7 @@ void MohawkBitmap::drawImage(Graphics::Surface *surface) {
return;
}
- warning("Unknown Draw Compression");
+ error("Unknown Draw Compression");
}
//////////////////////////////////////////
@@ -520,8 +526,24 @@ void MohawkBitmap::drawRaw(Graphics::Surface *surface) {
assert(surface);
for (uint16 y = 0; y < _header.height; y++) {
- _data->read((byte *)surface->pixels + y * _header.width, _header.width);
- _data->skip(_header.bytesPerRow - _header.width);
+ if (getBitsPerPixel() == 24) {
+ Graphics::PixelFormat pixelFormat = g_system->getScreenFormat();
+
+ for (uint16 x = 0; x < _header.width; x++) {
+ byte b = _data->readByte();
+ byte g = _data->readByte();
+ byte r = _data->readByte();
+ if (surface->bytesPerPixel == 2)
+ *((uint16 *)surface->getBasePtr(x, y)) = pixelFormat.RGBToColor(r, g, b);
+ else
+ *((uint32 *)surface->getBasePtr(x, y)) = pixelFormat.RGBToColor(r, g, b);
+ }
+
+ _data->skip(_header.bytesPerRow - _header.width * 3);
+ } else {
+ _data->read((byte *)surface->pixels + y * _header.width, _header.width);
+ _data->skip(_header.bytesPerRow - _header.width);
+ }
}
}
@@ -627,12 +649,11 @@ ImageData* MystBitmap::decodeImage(Common::SeekableReadStream* stream) {
bmpStream->seek(_header.imageOffset);
- Graphics::Surface *surface = new Graphics::Surface();
+ Graphics::Surface *surface = createSurface(_info.width, _info.height);
int srcPitch = _info.width * (_info.bitsPerPixel >> 3);
const int extraDataLength = (srcPitch % 4) ? 4 - (srcPitch % 4) : 0;
if (_info.bitsPerPixel == 8) {
- surface->create(_info.width, _info.height, 1);
byte *dst = (byte *)surface->pixels;
for (uint32 i = 0; i < _info.height; i++) {
@@ -641,7 +662,6 @@ ImageData* MystBitmap::decodeImage(Common::SeekableReadStream* stream) {
}
} else {
Graphics::PixelFormat pixelFormat = g_system->getScreenFormat();
- surface->create(_info.width, _info.height, pixelFormat.bytesPerPixel);
byte *dst = (byte *)surface->pixels + (surface->h - 1) * surface->pitch;
@@ -706,8 +726,7 @@ ImageData *OldMohawkBitmap::decodeImage(Common::SeekableReadStream *stream) {
if (endianStream->pos() != endianStream->size())
error("OldMohawkBitmap decompression failed");
- Graphics::Surface *surface = new Graphics::Surface();
- surface->create(_header.width, _header.height, 1);
+ Graphics::Surface *surface = createSurface(_header.width, _header.height);
if ((_header.format & 0xf00) == kOldDrawRLE8)
drawRLE8(surface);
diff --git a/engines/mohawk/bitmap.h b/engines/mohawk/bitmap.h
index 70f3d97e45..844185035e 100644
--- a/engines/mohawk/bitmap.h
+++ b/engines/mohawk/bitmap.h
@@ -88,7 +88,7 @@ public:
protected:
BitmapHeader _header;
- byte getBitsPerPixel();
+ virtual byte getBitsPerPixel();
// The actual LZ decoder
static Common::SeekableReadStream *decompressLZ(Common::SeekableReadStream *stream, uint32 uncompressedSize);
@@ -96,6 +96,9 @@ protected:
// The current data stream
Common::SeekableReadStream *_data;
+ // Create the output surface
+ Graphics::Surface *createSurface(uint16 width, uint16 height);
+
// Draw Functions
void drawRaw(Graphics::Surface *surface);
void drawRLE8(Graphics::Surface *surface);
@@ -146,6 +149,9 @@ public:
ImageData *decodeImage(Common::SeekableReadStream *stream);
+protected:
+ byte getBitsPerPixel() { return _info.bitsPerPixel; }
+
private:
struct BitmapHeader {
uint16 type;
@@ -176,6 +182,9 @@ public:
~OldMohawkBitmap() {}
ImageData *decodeImage(Common::SeekableReadStream *stream);
+
+protected:
+ byte getBitsPerPixel() { return 8; }
};
} // End of namespace Mohawk