summaryrefslogtreecommitdiffhomepage
path: root/serialize
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2023-02-08 21:00:22 +0100
committerStanislaw Halik <sthalik@misaki.pl>2023-02-08 21:00:22 +0100
commit55809dbf9b750b24321f72a0394b432316943a66 (patch)
tree19b42caef085b7c2da6ebabcfa066215eec108e3 /serialize
parent1a3a4c6c03e6d975f059c5eb3271006eb4b5a926 (diff)
{src,serialize}/anim, crop-tool: add more scaling modes
Diffstat (limited to 'serialize')
-rw-r--r--serialize/anim.cpp42
-rw-r--r--serialize/anim.hpp6
2 files changed, 46 insertions, 2 deletions
diff --git a/serialize/anim.cpp b/serialize/anim.cpp
index fd5e7315..b9cfe975 100644
--- a/serialize/anim.cpp
+++ b/serialize/anim.cpp
@@ -2,19 +2,57 @@
#include "serialize/magnum-vector2i.hpp"
#include "serialize/corrade-string.hpp"
#include "serialize/anim.hpp"
+#include <tuple>
namespace floormat {
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(anim_frame, ground, offset, size)
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(anim_group, name, frames, ground, offset)
-NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(anim_def, object_name, anim_name, pixel_size, nframes, actionframe, fps, groups, width, height)
+NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(anim_def, object_name, anim_name, pixel_size, nframes, actionframe, fps, groups, scale)
-} // namespace floormat::Serialize
+} // namespace floormat
using namespace floormat;
namespace nlohmann {
+void adl_serializer<floormat::anim_scale>::to_json(json& j, const floormat::anim_scale val)
+{
+ switch (val.type)
+ {
+ default:
+ fm_throw("invalid anim_scale_type '{}"_cf, (unsigned)val.type);
+ case anim_scale_type::invalid:
+ fm_throw("anim_scale is invalid"_cf);
+ case anim_scale_type::fixed:
+ j = std::tuple<StringView, unsigned>{val.f.is_width ? "width"_s : "height"_s, val.f.width_or_height};
+ break;
+ case anim_scale_type::ratio:
+ j = std::tuple<StringView, float>{"factor"_s, val.r.f};
+ break;
+ }
+}
+
+void adl_serializer<floormat::anim_scale>::from_json(const json& j, floormat::anim_scale& val)
+{
+ fm_soft_assert(j.is_array());
+ fm_soft_assert(j.size() == 2);
+ String type = j[0];
+ if (type == "factor"_s)
+ {
+ auto factor = (float)j[1];
+ fm_soft_assert(factor > 0 && factor <= 1);
+ val = { { .r = {factor} }, anim_scale_type::ratio };
+ }
+ else if (bool is_width = type == "width"_s; is_width || type == "height"_s)
+ {
+ val = { { .f = {is_width, (unsigned)j[1]} }, anim_scale_type::fixed };
+ fm_soft_assert(val.f.width_or_height > 0);
+ }
+ else
+ fm_throw("invalid anim_scale_type '{}'"_cf, type);
+}
+
void adl_serializer<anim_frame>::to_json(json& j, const anim_frame& val) { using nlohmann::to_json; to_json(j, val); }
void adl_serializer<anim_frame>::from_json(const json& j, anim_frame& val) { using nlohmann::from_json; from_json(j, val); }
diff --git a/serialize/anim.hpp b/serialize/anim.hpp
index 48d97451..6cfa0c75 100644
--- a/serialize/anim.hpp
+++ b/serialize/anim.hpp
@@ -18,6 +18,12 @@ struct adl_serializer<floormat::anim_group> {
};
template<>
+struct adl_serializer<floormat::anim_scale> {
+ static void to_json(json& j, floormat::anim_scale val);
+ static void from_json(const json& j, floormat::anim_scale& val);
+};
+
+template<>
struct adl_serializer<floormat::anim_def> {
static void to_json(json& j, const floormat::anim_def& val);
static void from_json(const json& j, floormat::anim_def& val);