//! creates a surface from the file IImage* CImageLoaderDDS::loadImage(io::IReadFile* file) const { u8 *memFile = new u8 [ file->getSize() ]; file->read ( memFile, file->getSize() ); ddsBuffer *header = (ddsBuffer*) memFile; IImage* image = 0; s32 width, height; eDDSPixelFormat pixelFormat; if ( 0 == DDSGetInfo( header, &width, &height, &pixelFormat) ) { image = new CImage(ECF_A8R8G8B8, core::dimension2d<u32>(width, height)); if ( DDSDecompress( header, (u8*) image->lock() ) == -1) { image->unlock(); image->drop(); image = 0; } } delete [] memFile; if ( image ) image->unlock(); return image; }
static void LoadDDSBuffer( byte *buffer, int size, byte **pixels, int *width, int *height ){ int w, h; ddsPF_t pf; /* dummy check */ if ( buffer == NULL || size <= 0 || pixels == NULL || width == NULL || height == NULL ) { return; } /* null out */ *pixels = 0; *width = 0; *height = 0; /* get dds info */ if ( DDSGetInfo( (ddsBuffer_t*) buffer, &w, &h, &pf ) ) { Sys_Printf( "WARNING: Invalid DDS texture\n" ); return; } /* only certain types of dds textures are supported */ if ( pf != DDS_PF_ARGB8888 && pf != DDS_PF_DXT1 && pf != DDS_PF_DXT3 && pf != DDS_PF_DXT5 ) { Sys_Printf( "WARNING: Only DDS texture formats ARGB8888, DXT1, DXT3, and DXT5 are supported (%d)\n", pf ); return; } /* create image pixel buffer */ *width = w; *height = h; *pixels = safe_malloc( w * h * 4 ); /* decompress the dds texture */ DDSDecompress( (ddsBuffer_t*) buffer, *pixels ); }
Image* LoadDDSBuff( const byte* buffer ){ int width, height; ddsPF_t pixelFormat; if ( DDSGetInfo( reinterpret_cast<ddsBuffer_t*>( const_cast<byte*>( buffer ) ), &width, &height, &pixelFormat ) == -1 ) { return 0; } RGBAImage* image = new RGBAImage( width, height ); if ( DDSDecompress( reinterpret_cast<ddsBuffer_t*>( const_cast<byte*>( buffer ) ), image->getRGBAPixels() ) == -1 ) { image->release(); return 0; } return image; }