Example #1
0
Bool CDDSFile::LoadInternal( CIODevice& ioDevice, Bool decompress )
{
    ioDevice.Read( &m_Header, sizeof( EDDSFileHeader ) );

    Char* fourCC = (Char*)&m_Header.PixelFormat.FourCC;
    fourCC[5] = 0;

    m_TextureInfo.MipMapCount = GetMipMapCount( );
    m_TextureInfo.Format = GetPixelFormat( );
    m_TextureInfo.Width = m_Header.Width;
    m_TextureInfo.Height = m_Header.Height;
    m_TextureInfo.SliceCount = m_Header.Depth;
    m_TextureInfo.Type = GetTextureType( );

    // Setup data buffer
    m_Data.SetItemCount( GetTextureSize() );

    UInt32 r = ioDevice.Read( m_Data.GetBuffer(), m_Data.GetByteCount() );

    if( decompress )
    {
        UInt32 byteCount = 0;
        CArray<Byte> byteArray;
        byteArray.SetItemCount( m_TextureInfo.Width*m_TextureInfo.Height*4 );
        const Byte* blocks = GetSurfaceData( 0,0, byteCount );

        int format = 0;
        if( m_TextureInfo.Format == nTextureFormat_DXT5 )
            format = squish::kDxt5;
        else if( m_TextureInfo.Format == nTextureFormat_DXT3 )
            format = squish::kDxt3;
        else if( m_TextureInfo.Format == nTextureFormat_DXT1 )
            format = squish::kDxt1;

        if( format )
        {

            squish::DecompressImage( byteArray.GetBuffer(), m_TextureInfo.Width, m_TextureInfo.Height, blocks, format );

            m_TextureInfo.MipMapCount = 1;
            m_TextureInfo.Format = nTextureFormat_R8G8B8A8;
            m_Data = byteArray;

        }
    }

    return TRUE;
}