Color gamma (#542)

* Fix math overflow

* support
This commit is contained in:
Michael Miller
2021-12-29 10:21:01 -08:00
committed by GitHub
parent bd7d5b43a0
commit 1f109e9a24
2 changed files with 28 additions and 2 deletions

View File

@@ -34,6 +34,10 @@ public:
{
return static_cast<uint8_t>(255.0f * NeoEase::Gamma(value / 255.0f) + 0.5f);
}
static uint16_t Correct(uint16_t value)
{
return static_cast<uint8_t>(65535.0f * NeoEase::Gamma(value / 65535.0f) + 0.5f);
}
};
// NeoGammaTableMethod uses 256 bytes of memory, but is significantly faster
@@ -44,6 +48,13 @@ public:
{
return _table[value];
}
/*
static uint16_t Correct(uint16_t value)
{
// NOTE: 16 bit color elements not supported with NeoGammaTableMethod, use NeoGammaEquationMethod
return 0;
}
*/
private:
static const uint8_t _table[256];
@@ -68,6 +79,21 @@ public:
T_METHOD::Correct(original.B),
T_METHOD::Correct(original.W) );
}
Rgb48Color Correct(const Rgb48Color& original)
{
return RgbColor(T_METHOD::Correct(original.R),
T_METHOD::Correct(original.G),
T_METHOD::Correct(original.B));
}
Rgbw64Color Correct(const Rgbw64Color& original)
{
return RgbwColor(T_METHOD::Correct(original.R),
T_METHOD::Correct(original.G),
T_METHOD::Correct(original.B),
T_METHOD::Correct(original.W));
}
};

View File

@@ -227,12 +227,12 @@ struct Rgbw64Color
private:
inline static uint16_t _elementDim(uint16_t value, uint16_t ratio)
{
return (static_cast<uint16_t>(value) * (static_cast<uint16_t>(ratio) + 1)) >> 16;
return (static_cast<uint32_t>(value) * (static_cast<uint32_t>(ratio) + 1)) >> 16;
}
inline static uint16_t _elementBrighten(uint16_t value, uint16_t ratio)
{
uint16_t element = ((static_cast<uint32_t>(value) + 1) << 16) / (static_cast<uint32_t>(ratio) + 1);
uint32_t element = ((static_cast<uint32_t>(value) + 1) << 16) / (static_cast<uint32_t>(ratio) + 1);
if (element > Max)
{