c_color c_color::fade_to(const c_color color, const float percent, const bool only_alpha) const
{
const auto new_alpha = static_cast<int>(((1.0f - percent) * alpha + percent * color.alpha + 0.5)
* alpha_override.value_or(255) / 255.f);
if (only_alpha)
return c_color(red, green, blue, new_alpha);
const auto hsv = to_hsv();
const auto hsv_target = color.to_hsv();
auto hsv_current = std::make_tuple(
fmod(static_cast<float>((1.0f - percent) * std::get<0>(hsv) + percent * std::get<0>(hsv_target)), 180.f),
fmod(static_cast<float>((1.0f - percent) * std::get<1>(hsv) + percent * std::get<1>(hsv_target)), 255.f),
fmod(static_cast<float>((1.0f - percent) * std::get<2>(hsv) + percent * std::get<2>(hsv_target)), 255.f)
);
auto new_color = from_hsv(hsv_current);
new_color.alpha = new_alpha;
return new_color;
}