ColorUtilities.cpp [plain text]
#include "config.h"
#include "ColorUtilities.h"
#include "ColorConversion.h"
namespace WebCore {
float lightness(const SRGBA<float>& color)
{
auto [r, g, b, a] = color;
auto [min, max] = std::minmax({ r, g, b });
return 0.5f * (max + min);
}
float luminance(const SRGBA<float>& color)
{
auto [r, g, b, a] = toLinearSRGBA(color);
return 0.2126f * r + 0.7152f * g + 0.0722f * b;
}
float contrastRatio(const SRGBA<float>& colorA, const SRGBA<float>& colorB)
{
float lighterLuminance = luminance(colorA);
float darkerLuminance = luminance(colorB);
if (lighterLuminance < darkerLuminance)
std::swap(lighterLuminance, darkerLuminance);
return (lighterLuminance + 0.05) / (darkerLuminance + 0.05);
}
SRGBA<float> premultiplied(const SRGBA<float>& color)
{
auto [r, g, b, a] = color;
return { r * a, g * a, b * a, a };
}
SRGBA<float> unpremultiplied(const SRGBA<float>& color)
{
auto [r, g, b, a] = color;
return { r / a, g / a, b / a, a };
}
SRGBA<uint8_t> premultipliedFlooring(SRGBA<uint8_t> color)
{
auto [r, g, b, a] = color;
if (!a)
return { 0, 0, 0, 0 };
if (a == 255)
return color;
return clampToComponentBytes<SRGBA>(fastDivideBy255(r * a), fastDivideBy255(g * a), fastDivideBy255(b * a), a);
}
SRGBA<uint8_t> premultipliedCeiling(SRGBA<uint8_t> color)
{
auto [r, g, b, a] = color;
if (!a)
return { 0, 0, 0, 0 };
if (a == 255)
return color;
return clampToComponentBytes<SRGBA>(fastDivideBy255(r * a + 254), fastDivideBy255(g * a + 254), fastDivideBy255(b * a + 254), a);
}
static inline uint16_t unpremultipliedComponentByte(uint8_t c, uint8_t a)
{
return (fastMultiplyBy255(c) + a - 1) / a;
}
SRGBA<uint8_t> unpremultiplied(SRGBA<uint8_t> color)
{
auto [r, g, b, a] = color;
if (!a || a == 255)
return color;
return clampToComponentBytes<SRGBA>(unpremultipliedComponentByte(r, a), unpremultipliedComponentByte(g, a), unpremultipliedComponentByte(b, a), a);
}
}