12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #include "StdInc.h"
- #include <map>
- #include "Manager.h"
- #include "Animations.h"
- #include "Images.h"
- #include "FilesHeaders.h"
- #include "../../lib/Filesystem/CResourceLoader.h"
- #include "../../lib/Filesystem/CFileInfo.h"
- namespace Gfx
- {
- class Resources
- {
- friend class CManager;
- static std::map<std::string, PImage> images;
- static std::map<std::string, PAnimation> anims;
- };
- std::map<std::string, PImage> Resources::images;
- std::map<std::string, PAnimation> Resources::anims;
- PImage CManager::getImage(const std::string& fname)
- {
- PImage& img_ptr = Resources::images[fname];
- if (img_ptr) return img_ptr;
- ResourceID resImageId("DATA/" + fname, EResType::IMAGE);
- auto stream = CResourceHandler::get()->load(resImageId);
- auto streamSize = stream->getSize();
- if (streamSize < H3PCX_HEADER_SIZE) return nullptr;
- if (streamSize > 0x10000000) streamSize = 0x10000000;
- std::unique_ptr<ui8[]> data(new ui8[(size_t)streamSize]);
- auto readSize = stream->read(data.get(), streamSize);
- assert(readSize == stream->getSize());
- CImage* img_tmp = CImage::makeFromPCX(*(SH3PcxFile*)data.get(), (size_t)readSize);
- if (img_tmp == nullptr)
- {
- CFileInfo info(CResourceHandler::get()->getResourceName(resImageId));
- img_tmp = CImage::makeBySDL(data.get(), (size_t)readSize, info.getExtension().c_str()+1);
- if (img_tmp == nullptr)
- {
- tlog1 << "Gfx: Image " << fname << " not loaded!\n";
- return nullptr;
- }
- }
- return img_ptr = PImage(img_tmp);
- }
- PAnimation CManager::getAnimation(const std::string& fname)
- {
- PAnimation& anim_ptr = Resources::anims[fname];
- if (anim_ptr) return anim_ptr;
- ResourceID resAnimId("SPRITES/" + fname, EResType::ANIMATION);
- auto stream = CResourceHandler::get()->load(resAnimId);
- auto streamSize = stream->getSize();
- if (streamSize < H3DEF_HEADER_SIZE) return nullptr;
- if (streamSize > 0x7FFFFFF0) streamSize = 0x7FFFFFF0;
- std::unique_ptr<ui8[]> data(new ui8[(size_t)streamSize]);
- auto readSize = stream->read(data.get(), streamSize);
- assert(readSize == stream->getSize());
- CAnimation* anim_tmp = CAnimation::makeFromDEF(*(SH3DefFile*)data.get(), (size_t)readSize);
- if (anim_tmp == nullptr)
- {
- tlog1 << "Gfx: Animation " << fname << " not loaded!\n";
- return nullptr;
- }
- return anim_ptr = PAnimation(anim_tmp);
- }
- }
|