summaryrefslogtreecommitdiff
path: root/assetFactory/assetFactory.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2023-03-02 18:18:38 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2023-03-02 18:18:38 +0000
commit98df33e0a52e086b68df2a62ce2f41cc6b67db63 (patch)
tree196300dbc07855b130e73b92077ff0e1e701a418 /assetFactory/assetFactory.cpp
parentRemove to specify if the Selection pointer type is shared or not (diff)
downloadilt-98df33e0a52e086b68df2a62ce2f41cc6b67db63.tar.bz2
ilt-98df33e0a52e086b68df2a62ce2f41cc6b67db63.tar.xz
ilt-98df33e0a52e086b68df2a62ce2f41cc6b67db63.zip
Parse colour values as they're read
Diffstat (limited to 'assetFactory/assetFactory.cpp')
-rw-r--r--assetFactory/assetFactory.cpp32
1 files changed, 29 insertions, 3 deletions
diff --git a/assetFactory/assetFactory.cpp b/assetFactory/assetFactory.cpp
index 016f29e..70f5337 100644
--- a/assetFactory/assetFactory.cpp
+++ b/assetFactory/assetFactory.cpp
@@ -30,12 +30,12 @@ AssetFactory::parseX11RGB(const char * path)
{
filesystem::FileStar rgb {path, "r"};
Colours out;
- glm::u8vec3 colour;
+ Colour colour;
char inname[BUFSIZ];
- while (fscanf(rgb, "%hhu %hhu %hhu %[^\n\r]s", &colour.r, &colour.g, &colour.b, inname) == 4) {
+ while (fscanf(rgb, "%f %f %f %[^\n\r]s", &colour.r, &colour.g, &colour.b, inname) == 4) {
std::string name {inname};
normalizeColourName(name);
- out.emplace(std::move(name), colour);
+ out.emplace(std::move(name), colour / 255.f);
}
return out;
}
@@ -49,6 +49,32 @@ AssetFactory::normalizeColourName(std::string & name)
};
}
+AssetFactory::ColourAlpha
+AssetFactory::parseColour(std::string_view in) const
+{
+ if (in.empty()) {
+ throw std::runtime_error("Empty colour specification");
+ }
+ if (in[0] == '#') {
+ if (in.length() > 9 || in.length() % 2 == 0) {
+ throw std::runtime_error("Invalid hex colour specification");
+ }
+ ColourAlpha out {0, 0, 0, 1};
+ std::generate_n(&out.r, (in.length() - 1) / 2, [in = in.data() + 1]() mutable {
+ uint8_t channel;
+ std::from_chars(in, in + 2, channel, 16);
+ in += 2;
+ return static_cast<float>(channel) / 255.f;
+ });
+ return out;
+ }
+ if (auto mf = std::dynamic_pointer_cast<const AssetFactory>(Persistence::sharedObjects.at("assetFactory"))) {
+ if (const auto colour = mf->colours.find(in); colour != mf->colours.end()) {
+ return {colour->second, 1};
+ }
+ }
+ throw std::runtime_error("No such asset factory colour");
+}
bool
AssetFactory::persist(Persistence::PersistenceStore & store)
{