#include "../include/ResourceCache.hpp" #include #include using namespace std; namespace dchat { unordered_map fonts; unordered_map textures; unordered_map shaders; const sf::Font* ResourceCache::getFont(const string &filepath) { auto it = fonts.find(filepath); if(it != fonts.end()) return it->second; sf::Font *font = new sf::Font(); if(!font->loadFromFile(filepath)) { delete font; string errMsg = "Failed to load font: "; errMsg += filepath; throw FailedToLoadResourceException(errMsg); } fonts[filepath] = font; return font; } sf::Texture* ResourceCache::getTexture(const string &filepath) { auto it = textures.find(filepath); if(it != textures.end()) return it->second; gdImagePtr imgPtr = gdImageCreateFromFile(filepath.c_str()); if(!imgPtr) { string errMsg = "Failed to load texture with gd: "; errMsg += filepath; throw FailedToLoadResourceException(errMsg); } gdImageSetInterpolationMethod(imgPtr, GD_BILINEAR_FIXED); gdImagePtr newImgPtr = gdImageScale(imgPtr, 100, 100); if(!newImgPtr) { gdImageDestroy(imgPtr); string errMsg = "Failed to scale image with gd: "; errMsg += filepath; throw FailedToLoadResourceException(errMsg); } gdImageFile(newImgPtr, filepath.c_str()); gdImageDestroy(imgPtr); gdImageDestroy(newImgPtr); sf::Texture *texture = new sf::Texture(); if(!texture->loadFromFile(filepath)) { delete texture; string errMsg = "Failed to load texture: "; errMsg += filepath; throw FailedToLoadResourceException(errMsg); } texture->setSmooth(true); texture->generateMipmap(); textures[filepath] = texture; return texture; } sf::Shader* ResourceCache::getShader(const std::string &filepath, sf::Shader::Type shaderType) { auto it = shaders.find(filepath); if(it != shaders.end()) return it->second; sf::Shader *shader = new sf::Shader(); if(!shader->loadFromFile(filepath, shaderType)) { delete shader; string errMsg = "Failed to load shader: "; errMsg += filepath; throw FailedToLoadResourceException(errMsg); } shaders[filepath] = shader; return shader; } }