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

summaryrefslogtreecommitdiff
path: root/source/core
diff options
context:
space:
mode:
Diffstat (limited to 'source/core')
-rw-r--r--source/core/CMakeLists.txt2
-rw-r--r--source/core/StarJson.cpp22
-rw-r--r--source/core/StarJson.hpp2
-rw-r--r--source/core/scripting/StarImageLuaBindings.cpp28
-rw-r--r--source/core/scripting/StarImageLuaBindings.hpp17
5 files changed, 66 insertions, 5 deletions
diff --git a/source/core/CMakeLists.txt b/source/core/CMakeLists.txt
index fb31fca..eda2acc 100644
--- a/source/core/CMakeLists.txt
+++ b/source/core/CMakeLists.txt
@@ -127,6 +127,7 @@ SET (star_core_HEADERS
StarWorkerPool.hpp
StarXXHash.hpp
StarZSTDCompression.hpp
+ scripting/StarImageLuaBindings.hpp
scripting/StarUtilityLuaBindings.hpp
)
@@ -184,6 +185,7 @@ SET (star_core_SOURCES
StarUuid.cpp
StarWorkerPool.cpp
StarZSTDCompression.cpp
+ scripting/StarImageLuaBindings.cpp
scripting/StarUtilityLuaBindings.cpp
)
diff --git a/source/core/StarJson.cpp b/source/core/StarJson.cpp
index 3502996..83b4e67 100644
--- a/source/core/StarJson.cpp
+++ b/source/core/StarJson.cpp
@@ -1026,13 +1026,25 @@ Json jsonMerge(Json const& base, Json const& merger) {
res.first->second = jsonMerge(res.first->second, p.second);
}
return merged;
+ }
+ return merger.type() == Json::Type::Null ? base : merger;
+}
- } else if (merger.type() == Json::Type::Null) {
- return base;
-
- } else {
- return merger;
+Json jsonMergeNulling(Json const& base, Json const& merger) {
+ if (base.type() == Json::Type::Object && merger.type() == Json::Type::Object) {
+ JsonObject merged = base.toObject();
+ for (auto const& p : merger.toObject()) {
+ if (p.second.isNull())
+ merged.erase(p.first);
+ else {
+ auto res = merged.insert(p);
+ if (!res.second)
+ res.first->second = jsonMergeNulling(res.first->second, p.second);
+ }
+ }
+ return merged;
}
+ return merger;
}
bool jsonPartialMatch(Json const& base, Json const& compare) {
diff --git a/source/core/StarJson.hpp b/source/core/StarJson.hpp
index 085fd9f..a533e47 100644
--- a/source/core/StarJson.hpp
+++ b/source/core/StarJson.hpp
@@ -291,6 +291,8 @@ DataStream& operator>>(DataStream& ds, JsonObject& m);
// is the combination of both objects, but for each repeated key jsonMerge is
// called recursively on both values to determine the result.
Json jsonMerge(Json const& base, Json const& merger);
+// Same as above, but applies null mergers.
+Json jsonMergeNulling(Json const& base, Json const& merger);
template <typename... T>
Json jsonMerge(Json const& base, Json const& merger, T const&... rest);
diff --git a/source/core/scripting/StarImageLuaBindings.cpp b/source/core/scripting/StarImageLuaBindings.cpp
new file mode 100644
index 0000000..83fb8d1
--- /dev/null
+++ b/source/core/scripting/StarImageLuaBindings.cpp
@@ -0,0 +1,28 @@
+#include "StarImageLuaBindings.hpp"
+#include "StarLuaConverters.hpp"
+#include "StarImage.hpp"
+
+namespace Star {
+
+LuaMethods<Image> LuaUserDataMethods<Image>::make() {
+ LuaMethods<Image> methods;
+
+ methods.registerMethodWithSignature<Vec2U, Image&>("size", mem_fn(&Image::size));
+ methods.registerMethodWithSignature<void, Image&, Vec2U, Image&>("drawInto", mem_fn(&Image::drawInto));
+ methods.registerMethodWithSignature<void, Image&, Vec2U, Image&>("copyInto", mem_fn(&Image::copyInto));
+ methods.registerMethod("set", [](Image& image, unsigned x, unsigned y, Color const& color) {
+ image.set(x, y, color.toRgba());
+ });
+
+ methods.registerMethod("get", [](Image& image, unsigned x, unsigned y) {
+ return Color::rgba(image.get(x, y));
+ });
+
+ methods.registerMethod("subImage", [](Image& image, Vec2U const& min, Vec2U const& size) {
+ return image.subImage(min, size);
+ });
+
+ return methods;
+}
+
+}
diff --git a/source/core/scripting/StarImageLuaBindings.hpp b/source/core/scripting/StarImageLuaBindings.hpp
new file mode 100644
index 0000000..b49598d
--- /dev/null
+++ b/source/core/scripting/StarImageLuaBindings.hpp
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "StarLua.hpp"
+
+namespace Star {
+
+STAR_CLASS(Image);
+
+template <>
+struct LuaConverter<Image> : LuaUserDataConverter<Image> {};
+
+template <>
+struct LuaUserDataMethods<Image> {
+ static LuaMethods<Image> make();
+};
+
+}