From f512bd192f1e69bf87ee0e06e2b2bfb90fdb08f2 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Fri, 11 Feb 2011 11:40:37 -0500 Subject: [PATCH] added TGA alpha support as per Boolsheet's patch in issue #156 --- changes.txt | 1 + src/modules/image/devil/ImageData.cpp | 17 +++-------------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/changes.txt b/changes.txt index c4efd27bd..a019e2105 100644 --- a/changes.txt +++ b/changes.txt @@ -8,6 +8,7 @@ LOVE 0.7.1 [Game Slave] * Added filter modes for ImageFonts. * Added dead key support by using "unknown" key with correct unicode value. * Added 0 width and height in love.conf. (for current desktop resolution) + * Added alpha support when encoding TGA images. * Fixed a lot of bugs regarding zero characters in threads. * Fixed handling of a directory named "love" in current directory. diff --git a/src/modules/image/devil/ImageData.cpp b/src/modules/image/devil/ImageData.cpp index 21a7c103d..1f0ca891d 100644 --- a/src/modules/image/devil/ImageData.cpp +++ b/src/modules/image/devil/ImageData.cpp @@ -239,7 +239,7 @@ namespace devil case EncodedImageData::FORMAT_TGA: default: // TGA is the default format headerLen = 18; - bpp = 3; + bpp = 4; size = h * w * bpp; data = new ILubyte[size + headerLen]; // here's the header for the Targa file format. @@ -257,23 +257,12 @@ namespace devil data[14] = h & 255; // least significant byte of height data[15] = h >> 8; // most significant byte of height data[16] = bpp * 8; // bits per pixel - data[17] = 0; // descriptor bits + data[17] = 0x20; // descriptor bits (flip bits: 0x10 horizontal, 0x20 vertical) // header done. write the pixel data to TGA: data += headerLen; - ilCopyPixels(0,0,0,w,h,1,IL_BGR,IL_UNSIGNED_BYTE,data); // convert the pixels to BGR (remember, little-endian) and copy them to data + ilCopyPixels(0,0,0,w,h,1,IL_BGRA,IL_UNSIGNED_BYTE,data); // convert the pixels to BGRA (remember, little-endian) and copy them to data - // It's Targa, so we have to flip the image. - row = w * bpp; - ILubyte * temp = new ILubyte[row]; - ILubyte * src = data - row; - ILubyte * dst = data + size; - for (int i = 0; i < (h >> 1); i++) { - memcpy(temp,src+=row,row); - memcpy(src,dst-=row,row); - memcpy(dst,temp,row); - } data -= headerLen; - delete [] temp; } return new EncodedImageData(data, f, size + headerLen, freeData); }