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 ); } }
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); }
// 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); }