GRIM: added support for 32 bit bitmaps

This commit is contained in:
Joel Teichroeb 2011-05-01 03:50:18 +08:00 committed by Pawel Kolodziejski
parent 5cb85e8f1f
commit 18874a7c91
4 changed files with 37 additions and 27 deletions

View file

@ -53,7 +53,7 @@ Bitmap::Bitmap(const char *fname, const char *data, int len) :
_y = READ_LE_UINT32(data + 24); _y = READ_LE_UINT32(data + 24);
// _transparentColor = READ_LE_UINT32(data + 28); // _transparentColor = READ_LE_UINT32(data + 28);
_format = READ_LE_UINT32(data + 32); _format = READ_LE_UINT32(data + 32);
// _numBits = READ_LE_UINT32(data + 36); _bpp = READ_LE_UINT32(data + 36);
// _blueBits = READ_LE_UINT32(data + 40); // _blueBits = READ_LE_UINT32(data + 40);
// _greenBits = READ_LE_UINT32(data + 44); // _greenBits = READ_LE_UINT32(data + 44);
// _redBits = READ_LE_UINT32(data + 48); // _redBits = READ_LE_UINT32(data + 48);
@ -67,10 +67,10 @@ Bitmap::Bitmap(const char *fname, const char *data, int len) :
_data = new char *[_numImages]; _data = new char *[_numImages];
int pos = 0x88; int pos = 0x88;
for (int i = 0; i < _numImages; i++) { 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) { if (codec == 0) {
memcpy(_data[i], data + pos, 2 * _width * _height); memcpy(_data[i], data + pos, _bpp/8 * _width * _height);
pos += 2 * _width * _height + 8; pos += _bpp/8 * _width * _height + 8;
} else if (codec == 3) { } else if (codec == 3) {
int compressed_len = READ_LE_UINT32(data + pos); int compressed_len = READ_LE_UINT32(data + pos);
decompress_codec3(data + pos + 4, _data[i]); 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); 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; _fname = fname;
if (gDebugLevel == DEBUG_BITMAPS || gDebugLevel == DEBUG_NORMAL || gDebugLevel == DEBUG_ALL) if (gDebugLevel == DEBUG_BITMAPS || gDebugLevel == DEBUG_NORMAL || gDebugLevel == DEBUG_ALL)
printf("New bitmap loaded: %s\n", fname); 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; _format = 1;
_numTex = 0; _numTex = 0;
_texIds = NULL; _texIds = NULL;
_bpp = bpp;
_hasTransparency = false; _hasTransparency = false;
_data = new char *[_numImages]; _data = new char *[_numImages];
_data[0] = new char[2 * _width * _height]; _data[0] = new char[_bpp/8 * _width * _height];
memcpy(_data[0], data, 2 * _width * _height); memcpy(_data[0], data, _bpp/8 * _width * _height);
g_driver->createBitmap(this); g_driver->createBitmap(this);
} }

View file

@ -36,7 +36,7 @@ class Bitmap : public Object {
public: public:
// Construct a bitmap from the given data. // Construct a bitmap from the given data.
Bitmap(const char *filename, const char *data, int len); 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(); Bitmap();
const char *filename() const { return _fname.c_str(); } const char *filename() const { return _fname.c_str(); }
@ -69,6 +69,7 @@ public:
int _width, _height, _x, _y; int _width, _height, _x, _y;
int _format; int _format;
int _numTex; int _numTex;
int _bpp;
void *_texIds; void *_texIds;
bool _hasTransparency; bool _hasTransparency;
char _filename[32]; char _filename[32];

View file

@ -461,26 +461,34 @@ void GfxOpenGL::createBitmap(Bitmap *bitmap) {
textures = (GLuint *)bitmap->_texIds; textures = (GLuint *)bitmap->_texIds;
glGenTextures(bitmap->_numTex * bitmap->_numImages, textures); 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++) { for (int pic = 0; pic < bitmap->_numImages; pic++) {
// Convert data to 32-bit RGBA format if (bitmap->_bpp == 16) {
byte *texDataPtr = texData; if (texData == 0)
uint16 *bitmapData = reinterpret_cast<uint16 *>(bitmap->_data[pic]); texData = new byte[4 * bitmap->_width * bitmap->_height];
for (int i = 0; i < bitmap->_width * bitmap->_height; i++, texDataPtr += 4, bitmapData++) { // Convert data to 32-bit RGBA format
uint16 pixel = *bitmapData; byte *texDataPtr = texData;
int r = pixel >> 11; uint16 *bitmapData = reinterpret_cast<uint16 *>(bitmap->_data[pic]);
texDataPtr[0] = (r << 3) | (r >> 2); for (int i = 0; i < bitmap->_width * bitmap->_height; i++, texDataPtr += 4, bitmapData++) {
int g = (pixel >> 5) & 0x3f; uint16 pixel = *bitmapData;
texDataPtr[1] = (g << 2) | (g >> 4); int r = pixel >> 11;
int b = pixel & 0x1f; texDataPtr[0] = (r << 3) | (r >> 2);
texDataPtr[2] = (b << 3) | (b >> 2); int g = (pixel >> 5) & 0x3f;
if (pixel == 0xf81f) { // transparent texDataPtr[1] = (g << 2) | (g >> 4);
texDataPtr[3] = 0; int b = pixel & 0x1f;
bitmap->_hasTransparency = true; texDataPtr[2] = (b << 3) | (b >> 2);
} else { if (pixel == 0xf81f) { // transparent
texDataPtr[3] = 255; 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++) { for (int i = 0; i < bitmap->_numTex; i++) {
@ -505,7 +513,7 @@ void GfxOpenGL::createBitmap(Bitmap *bitmap) {
textures = (GLuint *)bitmap->_texIds; textures = (GLuint *)bitmap->_texIds;
glBindTexture(GL_TEXTURE_2D, textures[cur_tex_idx]); glBindTexture(GL_TEXTURE_2D, textures[cur_tex_idx]);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, 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++; cur_tex_idx++;
} }
} }

View file

@ -153,7 +153,7 @@ public:
return b; return b;
} }
Bitmap *registerBitmap(const char *data, int width, int height, const char *filename) { 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); _bitmaps.push_back(b);
return b; return b;
} }