diff options
| -rw-r--r-- | engines/mohawk/bitmap.cpp | 45 | ||||
| -rw-r--r-- | engines/mohawk/bitmap.h | 11 | 
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 | 
