| #ifndef _RIVE_RELATIVE_LOCAL_ASSET_RESOLVER_HPP_ | |
| #define _RIVE_RELATIVE_LOCAL_ASSET_RESOLVER_HPP_ | |
| #include "rive/file_asset_resolver.hpp" | |
| #include "rive/assets/file_asset.hpp" | |
| #include <cstdio> | |
| #include <string> | |
| namespace rive | |
| { | |
| class FileAsset; | |
| class Factory; | |
| /// An implementation of FileAssetResolver which finds the assets in a local | |
| /// path relative to the original .riv file looking for them. | |
| class RelativeLocalAssetResolver : public FileAssetResolver | |
| { | |
| private: | |
| std::string m_Path; | |
| Factory* m_Factory; | |
| public: | |
| RelativeLocalAssetResolver(std::string filename, Factory* factory) : m_Factory(factory) | |
| { | |
| std::size_t finalSlash = filename.rfind('/'); | |
| if (finalSlash != std::string::npos) | |
| { | |
| m_Path = filename.substr(0, finalSlash + 1); | |
| } | |
| } | |
| void loadContents(FileAsset& asset) override | |
| { | |
| std::string filename = m_Path + asset.uniqueFilename(); | |
| FILE* fp = fopen(filename.c_str(), "rb"); | |
| fseek(fp, 0, SEEK_END); | |
| const size_t length = ftell(fp); | |
| fseek(fp, 0, SEEK_SET); | |
| uint8_t* bytes = new uint8_t[length]; | |
| if (fread(bytes, 1, length, fp) == length) | |
| { | |
| asset.decode(Span<const uint8_t>(bytes, length), m_Factory); | |
| } | |
| delete[] bytes; | |
| } | |
| }; | |
| } // namespace rive | |
| #endif |