Add color (un)premultiplication utils

This commit is contained in:
Nikita Lisitsa 2022-05-28 18:54:17 +03:00
parent b9a5861e85
commit b6fd6630dc

View file

@ -104,6 +104,65 @@ namespace psemek::gfx
return to_srgb(c, 1.f / g);
}
inline geom::vector<float, 4> premult(geom::vector<float, 4> const & c)
{
return {c[0] * c[3], c[1] * c[3], c[2] * c[3], c[3]};
}
inline geom::vector<std::uint8_t, 4> premult(geom::vector<std::uint8_t, 4> const & c)
{
return {
(static_cast<std::uint16_t>(c[0]) * c[3]) / 255,
(static_cast<std::uint16_t>(c[1]) * c[3]) / 255,
(static_cast<std::uint16_t>(c[2]) * c[3]) / 255,
c[3]
};
}
inline geom::vector<std::uint16_t, 4> premult(geom::vector<std::uint16_t, 4> const & c)
{
return {
(static_cast<std::uint32_t>(c[0]) * c[3]) / 65535,
(static_cast<std::uint32_t>(c[1]) * c[3]) / 65535,
(static_cast<std::uint32_t>(c[2]) * c[3]) / 65535,
c[3]
};
}
inline geom::vector<float, 4> unpremult(geom::vector<float, 4> const & c)
{
if (c[3] == 0.f)
return geom::vector<float, 4>::zero();
return {c[0] / c[3], c[1] / c[3], c[2] / c[3], c[3]};
}
inline geom::vector<std::uint8_t, 4> unpremult(geom::vector<std::uint8_t, 4> const & c)
{
if (c[3] == 0)
return geom::vector<std::uint8_t, 4>::zero();
return {
(static_cast<std::uint16_t>(c[0]) * 255) / c[3],
(static_cast<std::uint16_t>(c[1]) * 255) / c[3],
(static_cast<std::uint16_t>(c[2]) * 255) / c[3],
c[3]
};
}
inline geom::vector<std::uint16_t, 4> unpremult(geom::vector<std::uint16_t, 4> const & c)
{
if (c[3] == 0)
return geom::vector<std::uint16_t, 4>::zero();
return {
(static_cast<std::uint32_t>(c[0]) * 65535) / c[3],
(static_cast<std::uint32_t>(c[1]) * 65535) / c[3],
(static_cast<std::uint32_t>(c[2]) * 65535) / c[3],
c[3]
};
}
struct generic_color
{
color_4f c;