summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2023-03-20 15:17:14 +0100
committerStanislaw Halik <sthalik@misaki.pl>2023-03-20 15:17:14 +0100
commit833ba009037ebec6dcce1688b9bfd59ae1049304 (patch)
tree5acebe147ec1d26b83c76a67b063479b6512f9a1
parente1c4111a106482b55e6ff82b12d64f4fedb18347 (diff)
anim-crop-tool: fix fixed width/height scaling
-rw-r--r--anim-crop-tool/main.cpp8
-rw-r--r--serialize/anim.cpp4
-rw-r--r--src/anim.hpp8
3 files changed, 10 insertions, 10 deletions
diff --git a/anim-crop-tool/main.cpp b/anim-crop-tool/main.cpp
index a2a94e63..e7ccf582 100644
--- a/anim-crop-tool/main.cpp
+++ b/anim-crop-tool/main.cpp
@@ -94,7 +94,7 @@ static bool load_file(anim_group& group, options& opts, anim_atlas_& atlas, Stri
if (opts.scale.type != anim_scale_type::ratio)
{
float new_width = opts.scale.scale_to_({(unsigned)size.width, (unsigned)size.height})[0];
- opts.scale = {new_width / (float)size.width};
+ opts.scale = anim_scale::ratio{new_width / (float)size.width};
}
const auto dest_size = fm_begin(
@@ -211,11 +211,11 @@ static std::tuple<options, Arguments, bool> parse_cmdline(int argc, const char*
options opts;
if (!args.value<StringView>("width").isEmpty())
- opts.scale = {args.value<unsigned>("width"), true};
+ opts.scale = anim_scale::fixed{args.value<unsigned>("width"), true};
else if (!args.value<StringView>("height").isEmpty())
- opts.scale = {args.value<unsigned>("height"), false};
+ opts.scale = anim_scale::fixed{args.value<unsigned>("height"), false};
else if (!args.value<StringView>("scale").isEmpty())
- opts.scale = {args.value<float>("scale")};
+ opts.scale = anim_scale::ratio{args.value<float>("scale")};
opts.output_dir = Path::join(loader.startup_directory(), args.value<StringView>("output"));
opts.input_file = Path::join(loader.startup_directory(), args.value<StringView>("input"));
diff --git a/serialize/anim.cpp b/serialize/anim.cpp
index c5a6418b..8d867489 100644
--- a/serialize/anim.cpp
+++ b/serialize/anim.cpp
@@ -135,11 +135,11 @@ void adl_serializer<floormat::anim_scale>::from_json(const json& j, floormat::an
{
auto factor = (float)j[1];
fm_soft_assert(factor > 0 && factor <= 1);
- val = {factor};
+ val = anim_scale::ratio{factor};
}
else if (bool is_width = type == "width"_s; is_width || type == "height"_s)
{
- val = {(unsigned)j[1], is_width};
+ val = anim_scale::fixed{(unsigned)j[1], is_width};
fm_soft_assert(val.f.width_or_height > 0);
}
else
diff --git a/src/anim.hpp b/src/anim.hpp
index c6315bcf..fe455128 100644
--- a/src/anim.hpp
+++ b/src/anim.hpp
@@ -33,7 +33,7 @@ enum class anim_scale_type : unsigned char { invalid, ratio, fixed, };
struct anim_scale final
{
struct ratio { float f; };
- struct fixed { bool is_width; unsigned width_or_height; };
+ struct fixed { unsigned width_or_height; bool is_width; };
struct empty {};
union {
struct ratio r;
@@ -44,8 +44,8 @@ struct anim_scale final
constexpr anim_scale() = default;
constexpr anim_scale(const anim_scale&) = default;
constexpr anim_scale& operator=(const anim_scale&) = default;
- constexpr anim_scale(float ratio) : r{ratio}, type{anim_scale_type::ratio} {}
- constexpr anim_scale(unsigned width_or_height, bool is_width) : f{is_width, width_or_height}, type{anim_scale_type::ratio} {}
+ constexpr anim_scale(fixed x) noexcept : f{x}, type{anim_scale_type::fixed} {}
+ constexpr anim_scale(ratio x) noexcept : r{x}, type{anim_scale_type::ratio} {}
Vector2ui scale_to(Vector2ui image_size) const;
Vector2 scale_to_(Vector2ui image_size) const;
};
@@ -55,7 +55,7 @@ struct anim_def final
String object_name, anim_name;
std::vector<anim_group> groups;
Vector2ui pixel_size;
- anim_scale scale = anim_scale{1};
+ anim_scale scale = anim_scale::ratio{1};
size_t nframes = 0, fps = 0, actionframe = 0;
};