Exemple #1
0
void TextureRepo::Init()
{
    PathVect_t Paths;
    mFilesys.GetFileNames( Paths, "textures" );
    for( PathVect_t::const_iterator i = Paths.begin(), e = Paths.end(); i != e; ++i )
    {
        boost::filesystem::path const& Path = *i;
        if( Path.extension().string() != ".png" )
        {
            continue;
        }
        AutoFile TexFile = mFilesys.Open( Path );
        if( !TexFile.get() )
        {
            continue;
        }
        PngTexture Png( *TexFile );
        if( !Png.IsValid() )
        {
            continue;
        }
        Texture* Tex = new Texture( Png.GetWidth(), Png.GetHeight(), Png.GetChannels(), Png.GetData() );
        int32_t Id = AutoId( Path.generic_string() );
        mElements.insert( Id, Tex );
    }
}
Exemple #2
0
size_t Ico::Leanify(size_t size_leanified /*= 0*/)
{
    // number of images inside ico file
    uint16_t n = *(uint16_t *)(fp + 4);
    char *p_index = fp - size_leanified + 6;

    // invalid Icon file
    if (6 + n * 16U >= size || *(uint32_t *)(p_index + 8) + *(uint32_t *)(p_index + 12) > size)
    {
        return Format::Leanify(size_leanified);
    }

    // move header
    if (size_leanified)
    {
        memmove(fp - size_leanified, fp, 6 + n * 16);
    }

    size_t new_size_leanified = 0;
    while (n--)
    {
        uint32_t old_size = *(uint32_t *)(p_index + 8);
        uint32_t offset = *(uint32_t *)(p_index + 12);

        // write new offset
        if (new_size_leanified)
        {
            *(uint32_t *)(p_index + 12) -= new_size_leanified;
        }

        // only Leanify PNG
        if (memcmp(fp + offset, Png::header_magic, sizeof(Png::header_magic)) == 0)
        {
            uint32_t new_size = Png(fp + offset, old_size).Leanify(size_leanified + new_size_leanified);
            if (new_size != old_size)
            {
                new_size_leanified += old_size - new_size;
                *(uint32_t *)(p_index + 8) = new_size;
            }
        }
        else if (size_leanified + new_size_leanified)
        {
            memmove(fp + offset - size_leanified - new_size_leanified, fp + offset, old_size);
        }
        p_index += 16;
    }

    fp -= size_leanified;
    // offset + size of last file
    return *(uint32_t *)(p_index - 4) + *(uint32_t *)(p_index - 8);
}
Exemple #3
0
// Leanify the file
// and move the file ahead size_leanified bytes
// the new location of the file will be file_pointer - size_leanified
// it's designed this way to avoid extra memmove or memcpy
// return new size
size_t LeanifyFile(void *file_pointer, size_t file_size, size_t size_leanified /*= 0*/)
{
    if (!memcmp(file_pointer, Png::header_magic, sizeof(Png::header_magic)))
    {
        if (is_verbose)
        {
            std::cout << "PNG detected." << std::endl;
        }
        return Png(file_pointer, file_size).Leanify(size_leanified);
    }
    else if (!memcmp(file_pointer, Jpeg::header_magic, sizeof(Jpeg::header_magic)))
    {
        if (is_verbose)
        {
            std::cout << "JPEG detected." << std::endl;
        }
        return Jpeg(file_pointer, file_size).Leanify(size_leanified);
    }
    else if (!memcmp(file_pointer, Lua::header_magic, sizeof(Lua::header_magic)))
    {
        if (is_verbose)
        {
            std::cout << "Lua detected." << std::endl;
        }
        return Lua(file_pointer, file_size).Leanify(size_leanified);
    }
    else if (!memcmp(file_pointer, Zip::header_magic, sizeof(Zip::header_magic)))
    {
        if (is_verbose)
        {
            std::cout << "ZIP detected." << std::endl;
        }
        return Zip(file_pointer, file_size).Leanify(size_leanified);
    }
    else if (!memcmp(file_pointer, Pe::header_magic, sizeof(Pe::header_magic)))
    {
        if (is_verbose)
        {
            std::cout << "PE detected." << std::endl;
        }
        return Pe(file_pointer, file_size).Leanify(size_leanified);
    }
    else if (!memcmp(file_pointer, Gz::header_magic, sizeof(Gz::header_magic)))
    {
        if (is_verbose)
        {
            std::cout << "GZ detected." << std::endl;
        }
        return Gz(file_pointer, file_size).Leanify(size_leanified);
    }
    else if (!memcmp(file_pointer, Ico::header_magic, sizeof(Ico::header_magic)))
    {
        if (is_verbose)
        {
            std::cout << "ICO detected." << std::endl;
        }
        return Ico(file_pointer, file_size).Leanify(size_leanified);
    }
    else if (!memcmp(file_pointer, Gft::header_magic, sizeof(Gft::header_magic)))
    {
        if (is_verbose)
        {
            std::cout << "GFT detected." << std::endl;
        }
        return Gft(file_pointer, file_size).Leanify(size_leanified);
    }
    else if (!memcmp(file_pointer, Rdb::header_magic, sizeof(Rdb::header_magic)))
    {
        if (is_verbose)
        {
            std::cout << "RDB detected." << std::endl;
        }
        return Rdb(file_pointer, file_size).Leanify(size_leanified);
    }
    else if (!memcmp(file_pointer, Swf::header_magic, sizeof(Swf::header_magic)) ||
             !memcmp(file_pointer, Swf::header_magic_deflate, sizeof(Swf::header_magic_deflate)) ||
             !memcmp(file_pointer, Swf::header_magic_lzma, sizeof(Swf::header_magic_lzma)))
    {
        if (is_verbose)
        {
            std::cout << "SWF detected." << std::endl;
        }
        return Swf(file_pointer, file_size).Leanify(size_leanified);
    }
    else
    {
        // tar file does not have header magic
        // ustar is optional
        {
            Tar t(file_pointer, file_size);
            // checking first record checksum
            if (t.IsValid())
            {
                if (is_verbose)
                {
                    std::cout << "tar detected." << std::endl;
                }
                return t.Leanify(size_leanified);
            }
        }

        // XML file does not have header magic
        // have to parse and see if there are any errors.
        {
            Xml x(file_pointer, file_size);
            if (x.IsValid())
            {
                if (is_verbose)
                {
                    std::cout << "XML detected." << std::endl;
                }
                return x.Leanify(size_leanified);
            }
        }
    }

    if (is_verbose)
    {
        std::cout << "Format not supported!" << std::endl;
    }
    // for unsupported format, just memmove it.
    return Format(file_pointer, file_size).Leanify(size_leanified);
}