1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-11-02 00:42:33 +01:00
openrw/rwcore/loaders/LoaderIMG.hpp

81 lines
2.4 KiB
C++
Raw Normal View History

#ifndef _LIBRW_LOADERIMG_HPP_
#define _LIBRW_LOADERIMG_HPP_
2013-07-02 08:06:03 +02:00
#include <cstddef>
2019-01-03 12:59:57 +01:00
#include <filesystem>
#include <string>
2013-07-02 08:06:03 +02:00
#include <vector>
#include <memory>
#include <fstream>
2013-07-02 08:06:03 +02:00
/// \brief Points to one file within the archive
class LoaderIMGFile {
2013-07-02 08:06:03 +02:00
public:
uint32_t offset;
uint32_t size;
char name[24];
2013-07-02 08:06:03 +02:00
};
/**
\class LoaderIMG
\brief Parses the structure of GTA .IMG archives and loads the files in it
Warning: loadToMemory() is thread-unsafe, refer to its description.
2013-07-02 08:06:03 +02:00
*/
class LoaderIMG {
2013-07-02 08:06:03 +02:00
public:
/// Multiple versions of .IMG files
enum Version {
GTAIIIVC, ///< GTA III and GTA VC archives -- only this one is
///implemented
GTASA,
GTAIV
};
2013-07-02 08:06:03 +02:00
/// Construct
2018-08-29 22:46:00 +02:00
LoaderIMG() = default;
LoaderIMG(const LoaderIMG&) = delete;
LoaderIMG(LoaderIMG&&) noexcept = default;
2013-07-02 08:06:03 +02:00
/// Load the structure of the archive
/// Omit the extension in filename so both .dir and .img are loaded when
/// appropriate
2019-01-03 12:59:57 +01:00
bool load(const std::filesystem::path& filepath);
2013-07-02 08:06:03 +02:00
/// Load a file from the archive to memory and pass a pointer to it
/// Warning: Returns nullptr if by any reason it can't load the file
//
/// Warning: CURRENTLY NOT THREADSAFE!
// This method access/modifies m_archive_stream unconditionally,
// be aware of that.
std::unique_ptr<char[]> loadToMemory(const std::string& assetname);
2013-07-02 08:06:03 +02:00
/// Writes the contents of assetname to filename
bool saveAsset(const std::string& assetname, const std::string& filename);
2013-07-02 08:06:03 +02:00
/// Get the information of an asset in the examining archive
bool findAssetInfo(const std::string& assetname, LoaderIMGFile& out);
2013-07-02 08:06:03 +02:00
/// Get the information of an asset by its index
const LoaderIMGFile& getAssetInfoByIndex(size_t index) const {
return m_assets[index];
}
2013-07-02 08:06:03 +02:00
/// Returns the number of asset files in the archive
std::size_t getAssetCount() const {
return m_assets.size();
}
2013-07-02 08:06:03 +02:00
Version getVersion() const {
return m_version;
}
2013-07-02 08:06:03 +02:00
private:
2018-08-29 22:46:00 +02:00
Version m_version = GTAIIIVC; ///< Version of this IMG archive
2019-01-03 12:59:57 +01:00
std::filesystem::path m_archive; ///< Path to the archive being used (no extension)
std::ifstream m_archive_stream; ///< File stream for archive
2013-07-02 08:06:03 +02:00
std::vector<LoaderIMGFile> m_assets; ///< Asset info of the archive
2013-07-02 08:06:03 +02:00
};
#endif // LoaderIMG_h__