BOOL ReadImage(CImage* pcImage, char* szFilename, EImageType eType) { if (eType == IT_Unknown) { eType = GuessImageType(szFilename); } //Oi! Check to make sure none of the below expect an initialised image. switch (eType) { case IT_BMP: case IT_EMF: case IT_GIF: case IT_ICO: case IT_JPG: case IT_WMF: // uses OLE and IPicture to load these image formats. return (LoadPictureIPicture(pcImage, szFilename)); case IT_TGA: return (LoadTGA(pcImage, szFilename)); // uses NeHe TGA routines. case IT_PNG: return (LoadPNG(pcImage, szFilename)); case IT_RAD: return (LoadRAD(pcImage, szFilename)); // uses a text-format RAW descriptor (RAD) file to load a raw file. case IT_RAW: return (LoadRAW(pcImage, szFilename)); // special case assuming an initialised image. } return FALSE; }
Image* TGAImageDecoder::Decode(DataStream* ds) { TGAHeader header; if (!LoadHeader(&header, ds)) return 0; ImageFormat fmt = IMAGE_FORMAT_UNKNOWN; if (header.bitsperpixel==32) fmt = IMAGE_FORMAT_RGBA; else if(header.bitsperpixel==24) fmt = IMAGE_FORMAT_RGB; else if (header.bitsperpixel==8) fmt = IMAGE_FORMAT_GRAY; bool rle = (header.datatypecode & 8)!=0; UInt32 width = header.width; UInt32 height = header.height; ImageImpl* img = new ImageImpl(width,height,fmt); bool res = rle ? LoadRLE(ds,img) : LoadRAW(ds,img); if (!res) { delete img; img = 0; } else { img->SwapChannelsRB(); if ( (header.imagedescriptor & 0x20 ) == 0) { img->FlipV(); } } return img; }