mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
efc2046ab5
* LedDevice - Address clang findings * Fix Windows Warnings * Ensure newInput is initialised * Clean-up unused elements for Plaform Capture * Fix initialization problem and spellings * Address clang findings and spelling corrections * LedDevice clean-ups * Cleanups * Align that getLedCount is int * Have "display" as default for Grabbers * Fix config during start-up for missing elements * Framegrabber Clean-up - Remove non supported grabbers from selection, filter valid options * Typo * Framegrabber.json - Fix property numbering * Preselect active Grabbertype * Sort Grabbernames * Align options with selected element * Fix deletion of pointer to incomplete type 'BonjourBrowserWrapper' * Address macOS compile warnings * Have default layout = 1 LED only to avoid errors as in #673 * Address lgtm findings * Address finding that params passed to LedDevice discovery were not considered * Cleanups after merging with latest master * Update Changelog * Address lgtm findings * Fix comment * Test Fix * Fix Python Warning * Handle Dummy Device assignment correctly * Address delete called on non-final 'commandline::Option' that has virtual functions but non-virtual destructor * Correct that QTimer.start accepts only int * Have Release Python GIL & reset threat state chnage downward compatible * Correct format specifier * LedDevice - add assertions * Readonly DB - Fix merge issue * Smoothing - Fix wrong defaults * LedDevice - correct assertion * Show smoothing config set# in debug and related values. * Suppress error on windows, if default file is "/dev/null" * CMAKE - Allow to define QT_BASE_DIR dynamically via environment-variable * Ignore Visual Studio specific files Co-authored-by: Paulchen Panther <16664240+Paulchen-Panther@users.noreply.github.com>
151 lines
4.4 KiB
C++
151 lines
4.4 KiB
C++
// Hyperion includes
|
|
#include <utils/Logger.h>
|
|
#include <hyperion/MultiColorAdjustment.h>
|
|
|
|
MultiColorAdjustment::MultiColorAdjustment(int ledCnt)
|
|
: _ledAdjustments(ledCnt, nullptr)
|
|
, _log(Logger::getInstance("ADJUSTMENT"))
|
|
{
|
|
}
|
|
|
|
MultiColorAdjustment::~MultiColorAdjustment()
|
|
{
|
|
// Clean up all the transforms
|
|
for (ColorAdjustment * adjustment : _adjustment)
|
|
{
|
|
delete adjustment;
|
|
// BUG: Calling pop_back while iterating is invalid
|
|
_adjustment.pop_back();
|
|
}
|
|
}
|
|
|
|
void MultiColorAdjustment::addAdjustment(ColorAdjustment * adjustment)
|
|
{
|
|
_adjustmentIds.push_back(adjustment->_id);
|
|
_adjustment.push_back(adjustment);
|
|
}
|
|
|
|
void MultiColorAdjustment::setAdjustmentForLed(const QString& id, int startLed, int endLed)
|
|
{
|
|
// abort
|
|
if(startLed > endLed)
|
|
{
|
|
Error(_log,"startLed > endLed -> %d > %d", startLed, endLed);
|
|
return;
|
|
}
|
|
// catch wrong values
|
|
if(endLed > static_cast<int>(_ledAdjustments.size()-1))
|
|
{
|
|
Warning(_log,"The color calibration 'LED index' field has LEDs specified which aren't part of your led layout");
|
|
endLed = static_cast<int>(_ledAdjustments.size()-1);
|
|
}
|
|
|
|
// Get the identified adjustment (don't care if is nullptr)
|
|
ColorAdjustment * adjustment = getAdjustment(id);
|
|
|
|
//Debug(_log,"ColorAdjustment Profile [%s], startLed[%d], endLed[%d]", QSTRING_CSTR(id), startLed, endLed);
|
|
for (int iLed=startLed; iLed<=endLed; ++iLed)
|
|
{
|
|
//Debug(_log,"_ledAdjustments [%d] -> [%p]", iLed, adjustment);
|
|
_ledAdjustments[iLed] = adjustment;
|
|
}
|
|
}
|
|
|
|
bool MultiColorAdjustment::verifyAdjustments() const
|
|
{
|
|
bool ok = true;
|
|
for (unsigned iLed=0; iLed<_ledAdjustments.size(); ++iLed)
|
|
{
|
|
ColorAdjustment * adjustment = _ledAdjustments[iLed];
|
|
|
|
if (adjustment == nullptr)
|
|
{
|
|
Warning(_log, "No calibration set for led %d", iLed);
|
|
ok = false;
|
|
}
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
QStringList MultiColorAdjustment::getAdjustmentIds() const
|
|
{
|
|
return _adjustmentIds;
|
|
}
|
|
|
|
ColorAdjustment* MultiColorAdjustment::getAdjustment(const QString& id)
|
|
{
|
|
// Iterate through the unique adjustments until we find the one with the given id
|
|
for (ColorAdjustment* adjustment : _adjustment)
|
|
{
|
|
if (adjustment->_id == id)
|
|
{
|
|
return adjustment;
|
|
}
|
|
}
|
|
|
|
// The ColorAdjustment was not found
|
|
return nullptr;
|
|
}
|
|
|
|
void MultiColorAdjustment::setBacklightEnabled(bool enable)
|
|
{
|
|
for (ColorAdjustment* adjustment : _adjustment)
|
|
{
|
|
adjustment->_rgbTransform.setBackLightEnabled(enable);
|
|
}
|
|
}
|
|
|
|
void MultiColorAdjustment::applyAdjustment(std::vector<ColorRgb>& ledColors)
|
|
{
|
|
const size_t itCnt = qMin(_ledAdjustments.size(), ledColors.size());
|
|
for (size_t i=0; i<itCnt; ++i)
|
|
{
|
|
ColorAdjustment* adjustment = _ledAdjustments[i];
|
|
if (adjustment == nullptr)
|
|
{
|
|
//std::cout << "MultiColorAdjustment::applyAdjustment() - No transform set for this led : " << i << std::endl;
|
|
// No transform set for this led (do nothing)
|
|
continue;
|
|
}
|
|
ColorRgb& color = ledColors[i];
|
|
|
|
uint8_t ored = color.red;
|
|
uint8_t ogreen = color.green;
|
|
uint8_t oblue = color.blue;
|
|
uint8_t B_RGB = 0, B_CMY = 0, B_W = 0;
|
|
|
|
adjustment->_rgbTransform.transform(ored,ogreen,oblue);
|
|
adjustment->_rgbTransform.getBrightnessComponents(B_RGB, B_CMY, B_W);
|
|
|
|
uint32_t nrng = (uint32_t) (255-ored)*(255-ogreen);
|
|
uint32_t rng = (uint32_t) (ored) *(255-ogreen);
|
|
uint32_t nrg = (uint32_t) (255-ored)*(ogreen);
|
|
uint32_t rg = (uint32_t) (ored) *(ogreen);
|
|
|
|
uint8_t black = nrng*(255-oblue)/65025;
|
|
uint8_t red = rng *(255-oblue)/65025;
|
|
uint8_t green = nrg *(255-oblue)/65025;
|
|
uint8_t blue = nrng*(oblue) /65025;
|
|
uint8_t cyan = nrg *(oblue) /65025;
|
|
uint8_t magenta = rng *(oblue) /65025;
|
|
uint8_t yellow = rg *(255-oblue)/65025;
|
|
uint8_t white = rg *(oblue) /65025;
|
|
|
|
uint8_t OR, OG, OB, RR, RG, RB, GR, GG, GB, BR, BG, BB;
|
|
uint8_t CR, CG, CB, MR, MG, MB, YR, YG, YB, WR, WG, WB;
|
|
|
|
adjustment->_rgbBlackAdjustment.apply (black , 255 , OR, OG, OB);
|
|
adjustment->_rgbRedAdjustment.apply (red , B_RGB, RR, RG, RB);
|
|
adjustment->_rgbGreenAdjustment.apply (green , B_RGB, GR, GG, GB);
|
|
adjustment->_rgbBlueAdjustment.apply (blue , B_RGB, BR, BG, BB);
|
|
adjustment->_rgbCyanAdjustment.apply (cyan , B_CMY, CR, CG, CB);
|
|
adjustment->_rgbMagentaAdjustment.apply(magenta, B_CMY, MR, MG, MB);
|
|
adjustment->_rgbYellowAdjustment.apply (yellow , B_CMY, YR, YG, YB);
|
|
adjustment->_rgbWhiteAdjustment.apply (white , B_W , WR, WG, WB);
|
|
|
|
color.red = OR + RR + GR + BR + CR + MR + YR + WR;
|
|
color.green = OG + RG + GG + BG + CG + MG + YG + WG;
|
|
color.blue = OB + RB + GB + BB + CB + MB + YB + WB;
|
|
}
|
|
}
|