From 55809dbf9b750b24321f72a0394b432316943a66 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Wed, 8 Feb 2023 21:00:22 +0100 Subject: {src,serialize}/anim, crop-tool: add more scaling modes --- serialize/anim.cpp | 42 ++++++++++++++++++++++++++++++++++++++++-- serialize/anim.hpp | 6 ++++++ 2 files changed, 46 insertions(+), 2 deletions(-) (limited to 'serialize') 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 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::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{val.f.is_width ? "width"_s : "height"_s, val.f.width_or_height}; + break; + case anim_scale_type::ratio: + j = std::tuple{"factor"_s, val.r.f}; + break; + } +} + +void adl_serializer::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::to_json(json& j, const anim_frame& val) { using nlohmann::to_json; to_json(j, val); } void adl_serializer::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 @@ -17,6 +17,12 @@ struct adl_serializer { static void from_json(const json& j, floormat::anim_group& val); }; +template<> +struct adl_serializer { + 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 { static void to_json(json& j, const floormat::anim_def& val); -- cgit v1.2.3