diff --git a/engines/grim/bitmap.cpp b/engines/grim/bitmap.cpp index 9f35022eafc..9a8dc9140c3 100644 --- a/engines/grim/bitmap.cpp +++ b/engines/grim/bitmap.cpp @@ -53,7 +53,7 @@ Bitmap::Bitmap(const char *fname, const char *data, int len) : _y = READ_LE_UINT32(data + 24); // _transparentColor = READ_LE_UINT32(data + 28); _format = READ_LE_UINT32(data + 32); -// _numBits = READ_LE_UINT32(data + 36); + _bpp = READ_LE_UINT32(data + 36); // _blueBits = READ_LE_UINT32(data + 40); // _greenBits = READ_LE_UINT32(data + 44); // _redBits = READ_LE_UINT32(data + 48); @@ -67,10 +67,10 @@ Bitmap::Bitmap(const char *fname, const char *data, int len) : _data = new char *[_numImages]; int pos = 0x88; for (int i = 0; i < _numImages; i++) { - _data[i] = new char[2 * _width * _height]; + _data[i] = new char[_bpp/8 * _width * _height]; if (codec == 0) { - memcpy(_data[i], data + pos, 2 * _width * _height); - pos += 2 * _width * _height + 8; + memcpy(_data[i], data + pos, _bpp/8 * _width * _height); + pos += _bpp/8 * _width * _height + 8; } else if (codec == 3) { int compressed_len = READ_LE_UINT32(data + pos); decompress_codec3(data + pos + 4, _data[i]); @@ -88,7 +88,7 @@ Bitmap::Bitmap(const char *fname, const char *data, int len) : g_driver->createBitmap(this); } -Bitmap::Bitmap(const char *data, int w, int h, const char *fname) : Object() { +Bitmap::Bitmap(const char *data, int w, int h, int bpp, const char *fname) : Object() { _fname = fname; if (gDebugLevel == DEBUG_BITMAPS || gDebugLevel == DEBUG_NORMAL || gDebugLevel == DEBUG_ALL) printf("New bitmap loaded: %s\n", fname); @@ -102,10 +102,11 @@ Bitmap::Bitmap(const char *data, int w, int h, const char *fname) : Object() { _format = 1; _numTex = 0; _texIds = NULL; + _bpp = bpp; _hasTransparency = false; _data = new char *[_numImages]; - _data[0] = new char[2 * _width * _height]; - memcpy(_data[0], data, 2 * _width * _height); + _data[0] = new char[_bpp/8 * _width * _height]; + memcpy(_data[0], data, _bpp/8 * _width * _height); g_driver->createBitmap(this); } diff --git a/engines/grim/bitmap.h b/engines/grim/bitmap.h index 289db615825..adf5e647563 100644 --- a/engines/grim/bitmap.h +++ b/engines/grim/bitmap.h @@ -36,7 +36,7 @@ class Bitmap : public Object { public: // Construct a bitmap from the given data. Bitmap(const char *filename, const char *data, int len); - Bitmap(const char *data, int width, int height, const char *filename); + Bitmap(const char *data, int width, int height, int bpp, const char *filename); Bitmap(); const char *filename() const { return _fname.c_str(); } @@ -69,6 +69,7 @@ public: int _width, _height, _x, _y; int _format; int _numTex; + int _bpp; void *_texIds; bool _hasTransparency; char _filename[32]; diff --git a/engines/grim/gfx_opengl.cpp b/engines/grim/gfx_opengl.cpp index 5652988e91e..964baf3b990 100644 --- a/engines/grim/gfx_opengl.cpp +++ b/engines/grim/gfx_opengl.cpp @@ -461,26 +461,34 @@ void GfxOpenGL::createBitmap(Bitmap *bitmap) { textures = (GLuint *)bitmap->_texIds; glGenTextures(bitmap->_numTex * bitmap->_numImages, textures); - byte *texData = new byte[4 * bitmap->_width * bitmap->_height]; + byte *texData = 0; + byte *texOut = 0; for (int pic = 0; pic < bitmap->_numImages; pic++) { - // Convert data to 32-bit RGBA format - byte *texDataPtr = texData; - uint16 *bitmapData = reinterpret_cast(bitmap->_data[pic]); - for (int i = 0; i < bitmap->_width * bitmap->_height; i++, texDataPtr += 4, bitmapData++) { - uint16 pixel = *bitmapData; - int r = pixel >> 11; - texDataPtr[0] = (r << 3) | (r >> 2); - int g = (pixel >> 5) & 0x3f; - texDataPtr[1] = (g << 2) | (g >> 4); - int b = pixel & 0x1f; - texDataPtr[2] = (b << 3) | (b >> 2); - if (pixel == 0xf81f) { // transparent - texDataPtr[3] = 0; - bitmap->_hasTransparency = true; - } else { - texDataPtr[3] = 255; + if (bitmap->_bpp == 16) { + if (texData == 0) + texData = new byte[4 * bitmap->_width * bitmap->_height]; + // Convert data to 32-bit RGBA format + byte *texDataPtr = texData; + uint16 *bitmapData = reinterpret_cast(bitmap->_data[pic]); + for (int i = 0; i < bitmap->_width * bitmap->_height; i++, texDataPtr += 4, bitmapData++) { + uint16 pixel = *bitmapData; + int r = pixel >> 11; + texDataPtr[0] = (r << 3) | (r >> 2); + int g = (pixel >> 5) & 0x3f; + texDataPtr[1] = (g << 2) | (g >> 4); + int b = pixel & 0x1f; + texDataPtr[2] = (b << 3) | (b >> 2); + if (pixel == 0xf81f) { // transparent + texDataPtr[3] = 0; + bitmap->_hasTransparency = true; + } else { + texDataPtr[3] = 255; + } } + texOut = texData; + } else { + texOut = (byte *)bitmap->_data[pic]; } for (int i = 0; i < bitmap->_numTex; i++) { @@ -505,7 +513,7 @@ void GfxOpenGL::createBitmap(Bitmap *bitmap) { textures = (GLuint *)bitmap->_texIds; glBindTexture(GL_TEXTURE_2D, textures[cur_tex_idx]); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, - texData + (y * 4 * bitmap->_width) + (4 * x)); + texOut + (y * 4 * bitmap->_width) + (4 * x)); cur_tex_idx++; } } diff --git a/engines/grim/grim.h b/engines/grim/grim.h index 26967f22850..e255266bd23 100644 --- a/engines/grim/grim.h +++ b/engines/grim/grim.h @@ -153,7 +153,7 @@ public: return b; } Bitmap *registerBitmap(const char *data, int width, int height, const char *filename) { - Bitmap *b = new Bitmap(data, width, height, filename); + Bitmap *b = new Bitmap(data, width, height, 16, filename); _bitmaps.push_back(b); return b; }