summaryrefslogtreecommitdiffhomepage
path: root/src/anim.cpp
blob: 717b3ee64d195642f2eb5a156cfeef104b9712d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "anim.hpp"
#include "compat/exception.hpp"
#include <cmath>

namespace floormat {

Vector2 anim_scale::scale_to_(Vector2ui image_size) const
{
    fm_soft_assert(image_size.product() > 0);
    Vector2 ret;
    if (type >= anim_scale_type::COUNT) [[unlikely]]
        fm_throw("invalid anim_scale_type '{}'"_cf, (unsigned)type);
    switch (type)
    {
    case anim_scale_type::COUNT: std::unreachable();
    case anim_scale_type::invalid:
        fm_throw("anim_scale is invalid"_cf);
    case anim_scale_type::fixed:
        fm_soft_assert(f.width_or_height > 0);
        if (auto x = (float)image_size.x(), y = (float)image_size.y(), wh = (float)f.width_or_height; f.is_width)
            ret = { wh, wh * y/x };
        else
            ret = { wh * x/y, wh };
        break;
    case anim_scale_type::ratio:
        fm_soft_assert(r.f > 0 && r.f <= 1);
        ret = { image_size.x() * r.f, image_size.y() * r.f };
        break;
    }
    fm_soft_assert(ret.product() > 0);
    return ret;
}

Vector2ui anim_scale::scale_to(Vector2ui image_size) const
{
    Vector2 value = scale_to_(image_size);
    return { (unsigned)std::round(value[0]), (unsigned)std::round(value[1]) };
}

} // namespace floormat