diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2023-02-08 21:00:22 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2023-02-08 21:00:22 +0100 |
commit | 55809dbf9b750b24321f72a0394b432316943a66 (patch) | |
tree | 19b42caef085b7c2da6ebabcfa066215eec108e3 /serialize | |
parent | 1a3a4c6c03e6d975f059c5eb3271006eb4b5a926 (diff) |
{src,serialize}/anim, crop-tool: add more scaling modes
Diffstat (limited to 'serialize')
-rw-r--r-- | serialize/anim.cpp | 42 | ||||
-rw-r--r-- | serialize/anim.hpp | 6 |
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); |