diff options
Diffstat (limited to 'source/core')
-rw-r--r-- | source/core/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/core/StarJson.cpp | 22 | ||||
-rw-r--r-- | source/core/StarJson.hpp | 2 | ||||
-rw-r--r-- | source/core/scripting/StarImageLuaBindings.cpp | 28 | ||||
-rw-r--r-- | source/core/scripting/StarImageLuaBindings.hpp | 17 |
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(); +}; + +} |