| #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 |