Skip to content

Commit 5a8ff44

Browse files
authored
Fix the black color for disabled LEDs (#419)
1 parent 18e9ce0 commit 5a8ff44

File tree

7 files changed

+68
-55
lines changed

7 files changed

+68
-55
lines changed

assets/webconfig/js/light_source.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,10 @@ $(document).ready(function()
700700
"group": {
701701
"type": "integer",
702702
"minimum": 0
703+
},
704+
"disabled": {
705+
"type": "boolean",
706+
"default": false
703707
}
704708
},
705709
"type": "object"
@@ -950,7 +954,9 @@ $(document).ready(function()
950954
// validate textfield and update preview
951955
$("#leds_custom_updsim").off().on("click", function()
952956
{
953-
createLedPreview(aceEdt.get(), 'text');
957+
const backup = aceEdt.get();
958+
createLedPreview(backup, 'text');
959+
aceEdt.set(backup);
954960
});
955961

956962
// save led config and saveValues - passing textfield

include/base/ImageToLedsMap.h

-2
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,10 @@ namespace hyperhdr
8888

8989
/// The absolute indices into the image for each led
9090
std::vector<std::vector<int32_t>> _colorsMap;
91-
std::vector<bool> _colorsDisabled;
9291
std::vector<int> _colorsGroups;
9392

9493
int _groupMin;
9594
int _groupMax;
96-
bool _haveDisabled;
9795

9896
ColorRgb calcMeanColor(const Image<ColorRgb>& image, const std::vector<int32_t>& colors) const;
9997

include/base/LedString.h

+2
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ class LedString
130130
/// the color order
131131
ColorOrder colorOrder = ColorOrder::ORDER_RGB;
132132

133+
bool hasDisabled = false;
134+
133135
static ColorOrder createColorOrder(const QJsonObject& deviceConfig);
134136
static LedString createLedString(const QJsonArray& ledConfigArray, const ColorOrder deviceOrder);
135137
static QSize getLedLayoutGridSize(const QJsonArray& ledConfigArray);

sources/base/HyperHdrInstance.cpp

+55-38
Original file line numberDiff line numberDiff line change
@@ -444,27 +444,26 @@ bool HyperHdrInstance::setInputInactive(quint8 priority)
444444

445445
void HyperHdrInstance::setColor(int priority, const std::vector<ColorRgb>& ledColors, int timeout_ms, const QString& origin, bool clearEffects)
446446
{
447+
if (ledColors.size() == 0)
448+
return;
449+
447450
// clear effect if this call does not come from an effect
448451
if (clearEffects)
449452
{
450453
_effectEngine->channelCleared(priority);
451454
}
452455

453456
// create full led vector from single/multiple colors
454-
size_t size = _ledString.leds().size();
455457
std::vector<ColorRgb> newLedColors;
456-
while (true)
458+
auto currentCol = ledColors.begin();
459+
460+
while (newLedColors.size() < _ledString.leds().size())
457461
{
458-
for (const auto& entry : ledColors)
459-
{
460-
newLedColors.emplace_back(entry);
461-
if (newLedColors.size() == size)
462-
{
463-
goto end;
464-
}
465-
}
462+
newLedColors.emplace_back(*currentCol);
463+
464+
if (++currentCol == ledColors.end())
465+
currentCol = ledColors.begin();
466466
}
467-
end:
468467

469468
if (getPriorityInfo(priority).componentId != hyperhdr::COMP_COLOR)
470469
{
@@ -672,37 +671,55 @@ void HyperHdrInstance::updateResult(std::vector<ColorRgb> _ledBuffer)
672671

673672
_globalLedBuffer = _ledBuffer;
674673

675-
// emit rawLedColors before transform
676-
emit rawLedColors(_ledBuffer);
674+
for (int disabledProcessing = 0; disabledProcessing < 2; disabledProcessing++)
675+
{
676+
if (disabledProcessing == 1)
677+
_raw2ledAdjustment->applyAdjustment(_ledBuffer);
677678

678-
_raw2ledAdjustment->applyAdjustment(_ledBuffer);
679+
if (_ledString.hasDisabled)
680+
{
681+
auto ledIter = _ledString.leds().begin();
682+
for (ColorRgb& color : _ledBuffer)
683+
if (ledIter != _ledString.leds().end())
684+
{
685+
if ((*ledIter).disabled)
686+
color = ColorRgb::BLACK;
687+
++ledIter;
688+
}
689+
}
679690

680-
for (ColorRgb& color : _ledBuffer)
691+
if (disabledProcessing == 0)
692+
emit rawLedColors(_ledBuffer);
693+
}
694+
695+
if (_ledString.colorOrder != ColorOrder::ORDER_RGB)
681696
{
682-
// correct the color byte order
683-
switch (_ledString.colorOrder)
697+
for (ColorRgb& color : _ledBuffer)
684698
{
685-
case ColorOrder::ORDER_RGB:
686-
// leave as it is
687-
break;
688-
case ColorOrder::ORDER_BGR:
689-
std::swap(color.red, color.blue);
690-
break;
691-
case ColorOrder::ORDER_RBG:
692-
std::swap(color.green, color.blue);
693-
break;
694-
case ColorOrder::ORDER_GRB:
695-
std::swap(color.red, color.green);
696-
break;
697-
case ColorOrder::ORDER_GBR:
698-
std::swap(color.red, color.green);
699-
std::swap(color.green, color.blue);
700-
break;
701-
702-
case ColorOrder::ORDER_BRG:
703-
std::swap(color.red, color.blue);
704-
std::swap(color.green, color.blue);
705-
break;
699+
// correct the color byte order
700+
switch (_ledString.colorOrder)
701+
{
702+
case ColorOrder::ORDER_RGB:
703+
break;
704+
case ColorOrder::ORDER_BGR:
705+
std::swap(color.red, color.blue);
706+
break;
707+
case ColorOrder::ORDER_RBG:
708+
std::swap(color.green, color.blue);
709+
break;
710+
case ColorOrder::ORDER_GRB:
711+
std::swap(color.red, color.green);
712+
break;
713+
case ColorOrder::ORDER_GBR:
714+
std::swap(color.red, color.green);
715+
std::swap(color.green, color.blue);
716+
break;
717+
718+
case ColorOrder::ORDER_BRG:
719+
std::swap(color.red, color.blue);
720+
std::swap(color.green, color.blue);
721+
break;
722+
}
706723
}
707724
}
708725

sources/base/ImageToLedsMap.cpp

+1-13
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,9 @@ ImageToLedsMap::ImageToLedsMap(
2020
, _horizontalBorder(horizontalBorder)
2121
, _verticalBorder(verticalBorder)
2222
, _colorsMap()
23-
, _colorsDisabled()
2423
, _colorsGroups()
2524
, _groupMin(-1)
2625
, _groupMax(-1)
27-
, _haveDisabled(false)
2826
{
2927
// Sanity check of the size of the borders (and width and height)
3028
Q_ASSERT(_width > 2 * _verticalBorder);
@@ -174,9 +172,7 @@ ImageToLedsMap::ImageToLedsMap(
174172
}
175173

176174
// Add the constructed vector to the map
177-
_haveDisabled |= led.disabled;
178175
_colorsMap.push_back(ledColor);
179-
_colorsDisabled.push_back(led.disabled);
180176
_colorsGroups.push_back(led.group);
181177
if (_groupMin == -1 || led.group < _groupMin)
182178
_groupMin = led.group;
@@ -254,15 +250,7 @@ std::vector<ColorRgb> ImageToLedsMap::Process(const Image<ColorRgb>& image, uint
254250
}
255251
}
256252
}
257-
258-
for (size_t i = 0; _haveDisabled && i < qMin(_colorsDisabled.size(), colors.size()); i++)
259-
if (_colorsDisabled[i])
260-
{
261-
colors[i].red = 0;
262-
colors[i].green = 0;
263-
colors[i].blue = 0;
264-
}
265-
253+
266254
return colors;
267255
}
268256

sources/base/LedString.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ LedString LedString::createLedString(const QJsonArray& ledConfigArray, const Col
2525
LedString ledString;
2626
const QString deviceOrderStr = colorOrderToString(deviceOrder);
2727

28+
ledString.hasDisabled = false;
2829
for (signed i = 0; i < ledConfigArray.size(); ++i)
2930
{
3031
const QJsonObject& ledConfig = ledConfigArray[i].toObject();
@@ -36,6 +37,7 @@ LedString LedString::createLedString(const QJsonArray& ledConfigArray, const Col
3637
led.maxY_frac = qMax(0.0, qMin(1.0, ledConfig["vmax"].toDouble()));
3738
led.group = ledConfig["group"].toInt(0);
3839
led.disabled = ledConfig["disabled"].toBool(false);
40+
ledString.hasDisabled |= led.disabled;
3941

4042
// Fix if the user swapped min and max
4143
if (led.minX_frac > led.maxX_frac)

sources/base/LinearSmoothing.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ void LinearSmoothing::updateLedValues(const std::vector<ColorRgb>& ledValues)
208208
if (_pause || ledValues.size() == 0)
209209
return;
210210

211-
emit _hyperhdr->ledDeviceData(ledValues);
211+
queueColors(ledValues);
212212

213213
return;
214214
}

0 commit comments

Comments
 (0)