Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/StarImageMetadataDatabase.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-25 01:21:27 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-25 01:21:27 +1000
commitcb76e4e4448446bd69905de19683087d84ae39cb (patch)
tree0aa0548dae863c727cd32fc2b0d562783c7edb4e /source/game/StarImageMetadataDatabase.cpp
parent179f220bb4f1cc3e9e53d760ece6497a6f2044a8 (diff)
parent008bd6d3df469f69eaf667bc3ae357a03894bddb (diff)
Merge branch 'experiments/directives'
Diffstat (limited to 'source/game/StarImageMetadataDatabase.cpp')
-rw-r--r--source/game/StarImageMetadataDatabase.cpp81
1 files changed, 36 insertions, 45 deletions
diff --git a/source/game/StarImageMetadataDatabase.cpp b/source/game/StarImageMetadataDatabase.cpp
index 613ed1a..3bf8d96 100644
--- a/source/game/StarImageMetadataDatabase.cpp
+++ b/source/game/StarImageMetadataDatabase.cpp
@@ -10,7 +10,7 @@
namespace Star {
-Vec2U ImageMetadataDatabase::imageSize(String const& path) const {
+Vec2U ImageMetadataDatabase::imageSize(AssetPath const& path) const {
MutexLocker locker(m_mutex);
auto i = m_sizeCache.find(path);
if (i != m_sizeCache.end())
@@ -24,7 +24,7 @@ Vec2U ImageMetadataDatabase::imageSize(String const& path) const {
return size;
}
-List<Vec2I> ImageMetadataDatabase::imageSpaces(String const& path, Vec2F position, float fillLimit, bool flip) const {
+List<Vec2I> ImageMetadataDatabase::imageSpaces(AssetPath const& path, Vec2F position, float fillLimit, bool flip) const {
SpacesEntry key = make_tuple(path, Vec2I::round(position), fillLimit, flip);
MutexLocker locker(m_mutex);
@@ -33,7 +33,7 @@ List<Vec2I> ImageMetadataDatabase::imageSpaces(String const& path, Vec2F positio
return i->second;
}
- String filteredPath = filterProcessing(path);
+ auto filteredPath = filterProcessing(path);
SpacesEntry filteredKey = make_tuple(filteredPath, Vec2I::round(position), fillLimit, flip);
auto j = m_spacesCache.find(filteredKey);
@@ -88,14 +88,14 @@ List<Vec2I> ImageMetadataDatabase::imageSpaces(String const& path, Vec2F positio
return spaces;
}
-RectU ImageMetadataDatabase::nonEmptyRegion(String const& path) const {
+RectU ImageMetadataDatabase::nonEmptyRegion(AssetPath const& path) const {
MutexLocker locker(m_mutex);
auto i = m_regionCache.find(path);
if (i != m_regionCache.end()) {
return i->second;
}
- String filteredPath = filterProcessing(path);
+ auto filteredPath = filterProcessing(path);
auto j = m_regionCache.find(filteredPath);
if (j != m_regionCache.end()) {
m_regionCache[path] = j->second;
@@ -117,29 +117,27 @@ RectU ImageMetadataDatabase::nonEmptyRegion(String const& path) const {
return region;
}
-String ImageMetadataDatabase::filterProcessing(String const& path) {
- AssetPath components = AssetPath::split(path);
-
- components.directives.filter([](String const& directive) {
- ImageOperation operation;
- try {
- operation = imageOperationFromString(directive);
- } catch (StarException const&) {
- return true;
- }
-
- return !(operation.is<HueShiftImageOperation>() ||
- operation.is<SaturationShiftImageOperation>() ||
- operation.is<BrightnessMultiplyImageOperation>() ||
- operation.is<FadeToColorImageOperation>() ||
- operation.is<ScanLinesImageOperation>() ||
- operation.is<SetColorImageOperation>());
- });
+AssetPath ImageMetadataDatabase::filterProcessing(AssetPath const& path) {
+ AssetPath newPath = { path.basePath, path.subPath, {} };
+
+ List<Directives::Entry> filtered;
+ path.directives.forEach([&](auto const& entry) {
+ ImageOperation const& operation = entry.operation;
+ if (!(operation.is<HueShiftImageOperation>() ||
+ operation.is<SaturationShiftImageOperation>() ||
+ operation.is<BrightnessMultiplyImageOperation>() ||
+ operation.is<FadeToColorImageOperation>() ||
+ operation.is<ScanLinesImageOperation>() ||
+ operation.is<SetColorImageOperation>())) {
+ filtered.emplace_back(entry);
+ }
+ });
- return AssetPath::join(components);
+ newPath.directives.append(move(filtered));
+ return newPath;
}
-Vec2U ImageMetadataDatabase::calculateImageSize(String const& path) const {
+Vec2U ImageMetadataDatabase::calculateImageSize(AssetPath const& path) const {
// Carefully calculate an image's size while trying not to actually load it.
// In error cases, this will fall back to calling Assets::image, so that image
// can possibly produce a missing image asset or properly report the error.
@@ -150,18 +148,17 @@ Vec2U ImageMetadataDatabase::calculateImageSize(String const& path) const {
return assets->image(path)->size();
};
- AssetPath components = AssetPath::split(path);
- if (!assets->assetExists(components.basePath)) {
+ if (!assets->assetExists(path.basePath)) {
return fallback();
}
Vec2U imageSize;
- if (components.subPath) {
- auto frames = assets->imageFrames(components.basePath);
+ if (path.subPath) {
+ auto frames = assets->imageFrames(path.basePath);
if (!frames)
return fallback();
- if (auto rect = frames->getRect(*components.subPath))
+ if (auto rect = frames->getRect(*path.subPath))
imageSize = rect->size();
else
return fallback();
@@ -170,13 +167,13 @@ Vec2U ImageMetadataDatabase::calculateImageSize(String const& path) const {
// so we don't have to call Image::readPngMetadata on the same file more
// than once.
MutexLocker locker(m_mutex);
- if (auto size = m_sizeCache.maybe(components.basePath)) {
+ if (auto size = m_sizeCache.maybe(path.basePath)) {
imageSize = *size;
} else {
locker.unlock();
- imageSize = get<0>(Image::readPngMetadata(assets->openFile(components.basePath)));
+ imageSize = get<0>(Image::readPngMetadata(assets->openFile(path.basePath)));
locker.lock();
- m_sizeCache[components.basePath] = imageSize;
+ m_sizeCache[path.basePath] = imageSize;
}
}
@@ -231,19 +228,13 @@ Vec2U ImageMetadataDatabase::calculateImageSize(String const& path) const {
OperationSizeAdjust osa(imageSize);
- for (auto const& directive : components.directives) {
- ImageOperation operation;
- try {
- operation = imageOperationFromString(directive);
- } catch (StarException const&) {
- return fallback();
- }
+ bool complete = path.directives.forEachAbortable([&](auto const& entry) -> bool {
+ entry.operation.call(osa);
+ return !osa.hasError;
+ });
- operation.call(osa);
- if (osa.hasError) {
- return fallback();
- }
- }
+ if (!complete)
+ return fallback();
return imageSize;
}