Commit 01c9bd4c authored by hybrid's avatar hybrid

Fix 8bit grey image TGAs, which were not working due to missing palette. Also...

Fix 8bit grey image TGAs, which were not working due to missing palette. Also switched to RGB8 format, as otherwise a loss in precision would occur. Thanks to Klunk for the error report and a test image.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4160 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 9548b470
...@@ -166,15 +166,29 @@ IImage* CImageLoaderTGA::loadImage(io::IReadFile* file) const ...@@ -166,15 +166,29 @@ IImage* CImageLoaderTGA::loadImage(io::IReadFile* file) const
switch(header.PixelDepth) switch(header.PixelDepth)
{ {
case 8: case 8:
image = new CImage(ECF_A1R5G5B5, {
core::dimension2d<u32>(header.ImageWidth, header.ImageHeight)); if (header.ImageType==3) // grey image
if (image) {
CColorConverter::convert8BitTo16Bit((u8*)data, image = new CImage(ECF_R8G8B8,
(s16*)image->lock(), core::dimension2d<u32>(header.ImageWidth, header.ImageHeight));
header.ImageWidth,header.ImageHeight, if (image)
header.ImageType == 3 ? 0 : (s32*) palette, CColorConverter::convert8BitTo24Bit((u8*)data,
0, (u8*)image->lock(),
(header.ImageDescriptor&0x20)==0); header.ImageWidth,header.ImageHeight,
0, 0, (header.ImageDescriptor&0x20)==0);
}
else
{
image = new CImage(ECF_A1R5G5B5,
core::dimension2d<u32>(header.ImageWidth, header.ImageHeight));
if (image)
CColorConverter::convert8BitTo16Bit((u8*)data,
(s16*)image->lock(),
header.ImageWidth,header.ImageHeight,
(s32*) palette, 0,
(header.ImageDescriptor&0x20)==0);
}
}
break; break;
case 16: case 16:
image = new CImage(ECF_A1R5G5B5, image = new CImage(ECF_A1R5G5B5,
......
...@@ -2,7 +2,9 @@ ...@@ -2,7 +2,9 @@
using namespace irr; using namespace irr;
static bool testImageCreation() namespace
{
bool testImageCreation()
{ {
// create device // create device
...@@ -39,8 +41,35 @@ static bool testImageCreation() ...@@ -39,8 +41,35 @@ static bool testImageCreation()
return result; return result;
} }
bool testImageFormats()
{
IrrlichtDevice *device = createDevice(video::EDT_BURNINGSVIDEO, core::dimension2d<u32>(256,128));
if (device == 0)
return true; // could not create selected driver.
video::IVideoDriver* driver = device->getVideoDriver();
video::ITexture* tex=driver->getTexture("../media/water.jpg");
video::ITexture* tex1=driver->getTexture("media/grey.tga");
driver->beginScene(true, true);
driver->draw2DImage(tex, core::position2d<s32>(0,0), core::recti(0,0,64,64));
driver->draw2DImage(tex1, core::position2d<s32>(0,64), core::recti(0,0,64,64));
driver->endScene();
bool result = takeScreenshotAndCompareAgainstReference(driver, "-testImageFormats.png", 99.5f);
device->closeDevice();
device->run();
device->drop();
return result;
}
}
bool createImage() bool createImage()
{ {
bool result = testImageCreation(); bool result = testImageCreation();
result &= testImageFormats();
return result; return result;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment