// // Lol Engine // // Copyright © 2010—2017 Sam Hocevar // Copyright © 2016—2017 Benjamin “Touky” Huet // // Lol Engine is free software. It comes without any warranty, to // the extent permitted by applicable law. You can redistribute it // and/or modify it under the terms of the Do What the Fuck You Want // to Public License, Version 2, as published by the WTFPL Task Force. // See http://www.wtfpl.net/ for more details. // #include #include "resource-private.h" #include /* for std::swap */ namespace lol { /* HACK: We cannot make this an ImageLoader member function, because the * REGISTER_IMAGE_CODEC macro forward-declares free functions from * the "lol" namespace. An apparent bug in Visual Studio's compiler * makes it think these functions are actually in the top-level * namespace when the forward declaration is in a class member function. * To avoid the problem, we make the forward declaration in a free * function. * The bug was reported to Microsoft and fixed by them, but the fix * is not yet available. * https://connect.microsoft.com/VisualStudio/feedback/details/730878/ */ static bool RegisterAllCodecs(array &codeclist) { #if defined __ANDROID__ REGISTER_IMAGE_CODEC(AndroidImageCodec) #endif #if defined LOL_USE_GDIPLUS REGISTER_IMAGE_CODEC(GdiPlusImageCodec) #endif #if defined __APPLE__ && defined __MACH__ && defined __arm__ REGISTER_IMAGE_CODEC(IosImageCodec) #endif #if defined LOL_USE_SDL_IMAGE REGISTER_IMAGE_CODEC(SdlImageCodec) #endif #if defined LOL_USE_IMLIB2 REGISTER_IMAGE_CODEC(Imlib2ImageCodec) #endif REGISTER_IMAGE_CODEC(ZedImageCodec) REGISTER_IMAGE_CODEC(ZedPaletteImageCodec) REGISTER_IMAGE_CODEC(OricImageCodec) REGISTER_IMAGE_CODEC(DummyImageCodec) return true; } /* * Our static image loader */ static class StaticResourceLoader { friend class ResourceLoader; public: inline StaticResourceLoader() { RegisterAllCodecs(m_codecs); } private: array m_codecs; } g_resource_loader; /* * The public resource loader */ ResourceCodecData* ResourceLoader::Load(char const *path) { ResourceCodec* last_codec = nullptr; for (auto codec : g_resource_loader.m_codecs) { last_codec = codec; auto data = codec->Load(path); if (data != nullptr) { msg::debug("image::load: codec %s succesfully loaded %s.\n", codec->GetName(), path); return data; } } //Log error, because we shouldn't be here msg::error("image::load: last codec %s, error loading resource %s.\n", last_codec->GetName(), path); return nullptr; } bool ResourceLoader::Save(char const *path, ResourceCodecData* data) { ResourceCodec* last_codec = nullptr; for (auto codec : g_resource_loader.m_codecs) { last_codec = codec; if (codec->Save(path, data)) { msg::debug("image::save: codec %s succesfully saved %s.\n", codec->GetName(), path); return true; } } //Log error, because we shouldn't be here msg::error("image::save: last codec %s, error saving resource %s.\n", last_codec->GetName(), path); return false; } } /* namespace lol */