mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
new brightness handling (#430)
* clean color adjustment * now a prio duration of "0" means infinity * implement dynamic 'just in time' initialization * implement new brightness handling * cahnge access level * i18n fix * - cleanup brightness stuff - update webserver, now with initial ssl support * - backlightThreshold is now 0-100 instead 0-1 - better performance for brightness - use piecewise linear instead of sqrt
This commit is contained in:
@@ -9,8 +9,9 @@
|
||||
RgbChannelAdjustment::RgbChannelAdjustment(QString channelName)
|
||||
: _channelName(channelName)
|
||||
, _log(Logger::getInstance(channelName))
|
||||
, _brightness(0)
|
||||
{
|
||||
//setAdjustment(UINT8_MAX, UINT8_MAX, UINT8_MAX);
|
||||
resetInitialized();
|
||||
}
|
||||
|
||||
RgbChannelAdjustment::RgbChannelAdjustment(uint8_t adjustR, uint8_t adjustG, uint8_t adjustB, QString channelName)
|
||||
@@ -24,12 +25,18 @@ RgbChannelAdjustment::~RgbChannelAdjustment()
|
||||
{
|
||||
}
|
||||
|
||||
void RgbChannelAdjustment::resetInitialized()
|
||||
{
|
||||
Debug(_log, "initialize mapping with %d,%d,%d", _adjust[RED], _adjust[GREEN], _adjust[BLUE]);
|
||||
memset(_initialized, false, sizeof(_initialized));
|
||||
}
|
||||
|
||||
void RgbChannelAdjustment::setAdjustment(uint8_t adjustR, uint8_t adjustG, uint8_t adjustB)
|
||||
{
|
||||
_adjust[RED] = adjustR;
|
||||
_adjust[GREEN] = adjustG;
|
||||
_adjust[BLUE] = adjustB;
|
||||
initializeMapping();
|
||||
resetInitialized();
|
||||
}
|
||||
|
||||
uint8_t RgbChannelAdjustment::getAdjustmentR() const
|
||||
@@ -47,20 +54,22 @@ uint8_t RgbChannelAdjustment::getAdjustmentB() const
|
||||
return _adjust[BLUE];
|
||||
}
|
||||
|
||||
void RgbChannelAdjustment::apply(uint8_t input, uint8_t & red, uint8_t & green, uint8_t & blue)
|
||||
void RgbChannelAdjustment::apply(uint8_t input, uint8_t brightness, uint8_t & red, uint8_t & green, uint8_t & blue)
|
||||
{
|
||||
red = _mapping[RED][input];
|
||||
green = _mapping[GREEN][input];
|
||||
blue = _mapping[BLUE][input];
|
||||
}
|
||||
if (_brightness != brightness)
|
||||
{
|
||||
_brightness = brightness;
|
||||
resetInitialized();
|
||||
}
|
||||
|
||||
void RgbChannelAdjustment::initializeMapping()
|
||||
{
|
||||
Debug(_log, "initialize mapping with %d,%d,%d", _adjust[RED], _adjust[GREEN], _adjust[BLUE]);
|
||||
// initialize linear mapping
|
||||
for (unsigned channel=0; channel<3; channel++)
|
||||
for (unsigned idx=0; idx<=UINT8_MAX; idx++)
|
||||
{
|
||||
_mapping[channel][idx] = std::min( ((idx * _adjust[channel]) / UINT8_MAX), (unsigned)UINT8_MAX);
|
||||
}
|
||||
if (!_initialized[input])
|
||||
{
|
||||
_mapping[RED ][input] = std::min( ((_brightness * input * _adjust[RED ]) / 65025), UINT8_MAX);
|
||||
_mapping[GREEN][input] = std::min( ((_brightness * input * _adjust[GREEN]) / 65025), UINT8_MAX);
|
||||
_mapping[BLUE ][input] = std::min( ((_brightness * input * _adjust[BLUE ]) / 65025), UINT8_MAX);
|
||||
_initialized[input] = true;
|
||||
}
|
||||
red = _mapping[RED ][input];
|
||||
green = _mapping[GREEN][input];
|
||||
blue = _mapping[BLUE ][input];
|
||||
}
|
||||
|
@@ -5,21 +5,22 @@
|
||||
|
||||
RgbTransform::RgbTransform()
|
||||
{
|
||||
init(1.0, 1.0, 1.0, 0.0, false, 1.0);
|
||||
init(1.0, 1.0, 1.0, 0.0, false, 100, 100);
|
||||
}
|
||||
|
||||
RgbTransform::RgbTransform(double gammaR, double gammaG, double gammaB, double backlightThreshold, bool backlightColored, double brightnessHigh)
|
||||
RgbTransform::RgbTransform(double gammaR, double gammaG, double gammaB, double backlightThreshold, bool backlightColored, uint8_t brightness, uint8_t brightnessCompensation)
|
||||
{
|
||||
init(gammaR, gammaG, gammaB, backlightThreshold, backlightColored, brightnessHigh);
|
||||
init(gammaR, gammaG, gammaB, backlightThreshold, backlightColored, brightness, brightnessCompensation);
|
||||
}
|
||||
|
||||
void RgbTransform::init(double gammaR, double gammaG, double gammaB, double backlightThreshold, bool backlightColored, double brightnessHigh)
|
||||
void RgbTransform::init(double gammaR, double gammaG, double gammaB, double backlightThreshold, bool backlightColored, uint8_t brightness, uint8_t brightnessCompensation)
|
||||
{
|
||||
_backLightEnabled = true;
|
||||
setGamma(gammaR,gammaG,gammaB);
|
||||
setBacklightThreshold(backlightThreshold);
|
||||
setBacklightColored(backlightColored);
|
||||
setBrightness(brightnessHigh);
|
||||
setBrightness(brightness);
|
||||
setBrightnessCompensation(brightnessCompensation);
|
||||
initializeMapping();
|
||||
}
|
||||
|
||||
@@ -61,15 +62,15 @@ void RgbTransform::initializeMapping()
|
||||
}
|
||||
|
||||
|
||||
double RgbTransform::getBacklightThreshold() const
|
||||
int RgbTransform::getBacklightThreshold() const
|
||||
{
|
||||
return _backlightThreshold;
|
||||
}
|
||||
|
||||
void RgbTransform::setBacklightThreshold(double backlightThreshold)
|
||||
void RgbTransform::setBacklightThreshold(int backlightThreshold)
|
||||
{
|
||||
_backlightThreshold = backlightThreshold;
|
||||
_sumBrightnessLow = 765.0 * ((std::pow(2.0,backlightThreshold*2)-1) / 3.0);
|
||||
_sumBrightnessLow = 765.0 * ((std::pow(2.0,(_backlightThreshold/100)*2)-1) / 3.0);
|
||||
}
|
||||
|
||||
bool RgbTransform::getBacklightColored() const
|
||||
@@ -92,15 +93,53 @@ void RgbTransform::setBackLightEnabled(bool enable)
|
||||
_backLightEnabled = enable;
|
||||
}
|
||||
|
||||
double RgbTransform::getBrightness() const
|
||||
uint8_t RgbTransform::getBrightness() const
|
||||
{
|
||||
return _brightnessHigh;
|
||||
return _brightness;
|
||||
}
|
||||
|
||||
void RgbTransform::setBrightness(double brightness)
|
||||
void RgbTransform::setBrightness(uint8_t brightness)
|
||||
{
|
||||
_brightnessHigh = brightness;
|
||||
_sumBrightnessHigh = 765.0 * ((std::pow(2.0,brightness*2)-1) / 3.0);
|
||||
_brightness = brightness;
|
||||
updateBrightnessComponents();
|
||||
}
|
||||
|
||||
void RgbTransform::setBrightnessCompensation(uint8_t brightnessCompensation)
|
||||
{
|
||||
_brightnessCompensation = brightnessCompensation;
|
||||
updateBrightnessComponents();
|
||||
}
|
||||
|
||||
uint8_t RgbTransform::getBrightnessCompensation() const
|
||||
{
|
||||
return _brightnessCompensation;
|
||||
}
|
||||
|
||||
void RgbTransform::updateBrightnessComponents()
|
||||
{
|
||||
double Fw = _brightnessCompensation*2.0/100.0+1.0;
|
||||
double Fcmy = _brightnessCompensation/100.0+1.0;
|
||||
|
||||
double B_in= 0;
|
||||
_brightness_rgb = 0;
|
||||
_brightness_cmy = 0;
|
||||
_brightness_w = 0;
|
||||
|
||||
if (_brightness > 0)
|
||||
{
|
||||
B_in = (_brightness<50)? -0.09*_brightness+7.5 : -0.04*_brightness+5.0;
|
||||
|
||||
_brightness_rgb = std::ceil(std::min(255.0,255.0/B_in));
|
||||
_brightness_cmy = std::ceil(std::min(255.0,255.0/(B_in*Fcmy)));
|
||||
_brightness_w = std::ceil(std::min(255.0,255.0/(B_in*Fw)));
|
||||
}
|
||||
}
|
||||
|
||||
void RgbTransform::getBrightnessComponents(uint8_t & rgb, uint8_t & cmy, uint8_t & w )
|
||||
{
|
||||
rgb = _brightness_rgb;
|
||||
cmy = _brightness_cmy;
|
||||
w = _brightness_w;
|
||||
}
|
||||
|
||||
void RgbTransform::transform(uint8_t & red, uint8_t & green, uint8_t & blue)
|
||||
@@ -114,14 +153,7 @@ void RgbTransform::transform(uint8_t & red, uint8_t & green, uint8_t & blue)
|
||||
// apply brightnesss
|
||||
int rgbSum = red+green+blue;
|
||||
|
||||
if (_sumBrightnessHigh > 0 && rgbSum > _sumBrightnessHigh)
|
||||
{
|
||||
double cH = _sumBrightnessHigh / rgbSum;
|
||||
red *= cH;
|
||||
green *= cH;
|
||||
blue *= cH;
|
||||
}
|
||||
else if ( _backLightEnabled && _sumBrightnessLow>0 && rgbSum < _sumBrightnessLow)
|
||||
if ( _backLightEnabled && _sumBrightnessLow>0 && rgbSum < _sumBrightnessLow)
|
||||
{
|
||||
if (_backlightColored)
|
||||
{
|
||||
@@ -147,3 +179,4 @@ void RgbTransform::transform(uint8_t & red, uint8_t & green, uint8_t & blue)
|
||||
}
|
||||
//std::cout << _sumBrightnessLow << " " << (int)red << " " << (int)green << " " << (int)blue << std::endl;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user