// resources.hpp - Base classes for resource management of GUI #ifndef _RESOURCE_HEADER #define _RESOURCE_HEADER #include #include #include #include "rapidxml.hpp" struct ZipArchive; extern "C" { #include "../minuitwrp/minui.h" } // Base Objects class Resource { public: Resource(xml_node<>* node, ZipArchive* pZip); virtual ~Resource() {} public: std::string GetName() { return mName; } private: std::string mName; protected: static int ExtractResource(ZipArchive* pZip, std::string folderName, std::string fileName, std::string fileExtn, std::string destFile); static void LoadImage(ZipArchive* pZip, std::string file, gr_surface* surface); static void CheckAndScaleImage(gr_surface source, gr_surface* destination, int retain_aspect); }; class FontResource : public Resource { public: FontResource(xml_node<>* node, ZipArchive* pZip); virtual ~FontResource(); public: void* GetResource() { return this ? mFont : NULL; } int GetHeight() { return gr_ttf_getMaxFontHeight(this ? mFont : NULL); } void Override(xml_node<>* node, ZipArchive* pZip); protected: void* mFont; private: void LoadFont(xml_node<>* node, ZipArchive* pZip); void DeleteFont(); private: int origFontSize; void* origFont; }; class ImageResource : public Resource { public: ImageResource(xml_node<>* node, ZipArchive* pZip); virtual ~ImageResource(); public: gr_surface GetResource() { return this ? mSurface : NULL; } int GetWidth() { return gr_get_width(this ? mSurface : NULL); } int GetHeight() { return gr_get_height(this ? mSurface : NULL); } protected: gr_surface mSurface; }; class AnimationResource : public Resource { public: AnimationResource(xml_node<>* node, ZipArchive* pZip); virtual ~AnimationResource(); public: gr_surface GetResource() { return (!this || mSurfaces.empty()) ? NULL : mSurfaces.at(0); } gr_surface GetResource(int entry) { return (!this || mSurfaces.empty()) ? NULL : mSurfaces.at(entry); } int GetWidth() { return gr_get_width(this ? GetResource() : NULL); } int GetHeight() { return gr_get_height(this ? GetResource() : NULL); } int GetResourceCount() { return mSurfaces.size(); } protected: std::vector mSurfaces; }; class ResourceManager { public: ResourceManager(); virtual ~ResourceManager(); void AddStringResource(std::string resource_source, std::string resource_name, std::string value); void LoadResources(xml_node<>* resList, ZipArchive* pZip, std::string resource_source); public: FontResource* FindFont(const std::string& name) const; ImageResource* FindImage(const std::string& name) const; AnimationResource* FindAnimation(const std::string& name) const; std::string FindString(const std::string& name) const; std::string FindString(const std::string& name, const std::string& default_string) const; void DumpStrings() const; private: struct string_resource_struct { std::string value; std::string source; }; std::vector mFonts; std::vector mImages; std::vector mAnimations; std::map mStrings; }; #endif // _RESOURCE_HEADER