Add float -> normalized (un)signed 8/16-bit converters to gfx

This commit is contained in:
Nikita Lisitsa 2023-02-26 23:46:06 +03:00
parent 696ed71090
commit 32da717a55

View file

@ -445,4 +445,60 @@ namespace psemek::gfx
}
}
inline std::int8_t to_signed_8bit(float x)
{
return static_cast<std::int8_t>(geom::clamp((0.5f * x + 0.5f) * 255.f - 128.f, {-128.f, 127.f}));
}
inline std::uint8_t to_unsigned_8bit(float x)
{
return static_cast<std::uint8_t>(geom::clamp(x * 255.f, {0.f, 255.f}));
}
inline std::int16_t to_signed_16bit(float x)
{
return static_cast<std::int16_t>(geom::clamp((0.5f * x + 0.5f) * 65535.f - 32768.f, {-32768.f, 32767.f}));
}
inline std::uint16_t to_unsigned_16bit(float x)
{
return static_cast<std::uint16_t>(geom::clamp(x * 65535.f, {0.f, 65535.f}));
}
template <std::size_t D>
geom::vector<std::int8_t, D> to_signed_8bit(geom::vector<float, D> const & v)
{
geom::vector<std::int8_t, D> result;
for (std::size_t i = 0; i < D; ++i)
result[i] = to_signed_8bit(v[i]);
return result;
}
template <std::size_t D>
geom::vector<std::uint8_t, D> to_unsigned_8bit(geom::vector<float, D> const & v)
{
geom::vector<std::uint8_t, D> result;
for (std::size_t i = 0; i < D; ++i)
result[i] = to_unsigned_8bit(v[i]);
return result;
}
template <std::size_t D>
geom::vector<std::int16_t, D> to_signed_16bit(geom::vector<float, D> const & v)
{
geom::vector<std::int16_t, D> result;
for (std::size_t i = 0; i < D; ++i)
result[i] = to_signed_16bit(v[i]);
return result;
}
template <std::size_t D>
geom::vector<std::uint16_t, D> to_unsigned_16bit(geom::vector<float, D> const & v)
{
geom::vector<std::uint16_t, D> result;
for (std::size_t i = 0; i < D; ++i)
result[i] = to_unsigned_16bit(v[i]);
return result;
}
}