diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2023-02-27 19:38:14 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2023-02-27 19:38:14 +0000 |
commit | b7b9eb7bb9deb6704f276fb3b8fd67ba370caf3e (patch) | |
tree | cfbb3bac94271c04a44610f5f40751e74ea4d227 /assetFactory | |
parent | operator*= can work on any iterable collection (diff) | |
download | ilt-b7b9eb7bb9deb6704f276fb3b8fd67ba370caf3e.tar.bz2 ilt-b7b9eb7bb9deb6704f276fb3b8fd67ba370caf3e.tar.xz ilt-b7b9eb7bb9deb6704f276fb3b8fd67ba370caf3e.zip |
Load the X11 RGB colour definitions into a map
Diffstat (limited to 'assetFactory')
-rw-r--r-- | assetFactory/assetFactory.cpp | 28 | ||||
-rw-r--r-- | assetFactory/assetFactory.h | 6 |
2 files changed, 33 insertions, 1 deletions
diff --git a/assetFactory/assetFactory.cpp b/assetFactory/assetFactory.cpp index 564ea28..016f29e 100644 --- a/assetFactory/assetFactory.cpp +++ b/assetFactory/assetFactory.cpp @@ -1,4 +1,5 @@ #include "assetFactory.h" +#include "collections.hpp" #include "cuboid.h" #include "cylinder.h" #include "modelFactoryMesh_fwd.h" @@ -12,7 +13,8 @@ AssetFactory::AssetFactory() : {"plane", std::make_shared<Plane>()}, {"cuboid", std::make_shared<Cuboid>()}, {"cylinder", std::make_shared<Cylinder>()}, - } + }, + colours {parseX11RGB("/usr/share/X11/rgb.txt")} { } @@ -23,6 +25,30 @@ AssetFactory::loadXML(const std::filesystem::path & filename) return Persistence::SAXParsePersistence {}.loadState<std::shared_ptr<AssetFactory>>(file); } +AssetFactory::Colours +AssetFactory::parseX11RGB(const char * path) +{ + filesystem::FileStar rgb {path, "r"}; + Colours out; + glm::u8vec3 colour; + char inname[BUFSIZ]; + while (fscanf(rgb, "%hhu %hhu %hhu %[^\n\r]s", &colour.r, &colour.g, &colour.b, inname) == 4) { + std::string name {inname}; + normalizeColourName(name); + out.emplace(std::move(name), colour); + } + return out; +} + +void +AssetFactory::normalizeColourName(std::string & name) +{ + std::erase_if(name, ::isblank); + name *= [l = std::locale {}](auto & ch) { + ch = std::tolower(ch, l); + }; +} + bool AssetFactory::persist(Persistence::PersistenceStore & store) { diff --git a/assetFactory/assetFactory.h b/assetFactory/assetFactory.h index 9d79827..a68b460 100644 --- a/assetFactory/assetFactory.h +++ b/assetFactory/assetFactory.h @@ -22,12 +22,18 @@ class AssetFactory : public Persistence::Persistable { public: using Shapes = std::map<std::string, Shape::Ptr, std::less<>>; using Assets = std::map<std::string, Asset::Ptr, std::less<>>; + using Colour = glm::u8vec3; + using Colours = std::map<std::string, Colour, std::less<>>; AssetFactory(); [[nodiscard]] static std::shared_ptr<AssetFactory> loadXML(const std::filesystem::path &); Shapes shapes; Assets assets; + Colours colours; + + static Colours parseX11RGB(const char * rgbtxtpath); + static void normalizeColourName(std::string &); private: friend Persistence::SelectionPtrBase<std::shared_ptr<AssetFactory>, true>; |