| #ifndef _RIVE_RELATIVE_LOCAL_ASSET_RESOLVER_HPP_ | |
| #define _RIVE_RELATIVE_LOCAL_ASSET_RESOLVER_HPP_ | |
| #include "rive/file_asset_loader.hpp" | |
| #include "rive/assets/file_asset.hpp" | |
| #include <cstdio> | |
| #include <string> | |
| #include "rive/span.hpp" | |
| namespace rive | |
| { | |
| class FileAsset; | |
| class Factory; | |
| /// An implementation of FileAssetLoader which finds the assets in a local | |
| /// path relative to the original .riv file looking for them. | |
| class RelativeLocalAssetLoader : public FileAssetLoader | |
| { | |
| private: | |
| std::string m_Path; | |
| public: | |
| RelativeLocalAssetLoader(std::string filename) | |
| { | |
| std::size_t finalSlash = filename.rfind('/'); | |
| if (finalSlash != std::string::npos) | |
| { | |
| m_Path = filename.substr(0, finalSlash + 1); | |
| } | |
| } | |
| bool loadContents(FileAsset& asset, | |
| Span<const uint8_t> inBandBytes, | |
| rive::Factory* factory) 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); | |
| SimpleArray<uint8_t> bytes(length); | |
| if (fread(bytes.data(), 1, length, fp) == length) | |
| { | |
| asset.decode(bytes, factory); | |
| } | |
| return true; | |
| } | |
| }; | |
| } // namespace rive | |
| #endif |