diff --git a/include/utils/RgbChannelAdjustment.h b/include/utils/RgbChannelAdjustment.h index 4b0130bd..5b35b651 100644 --- a/include/utils/RgbChannelAdjustment.h +++ b/include/utils/RgbChannelAdjustment.h @@ -15,29 +15,34 @@ public: /// @param adjustR /// @param adjustG /// @param adjustB - - RgbChannelAdjustment(int adjustR, int adjustG, int adjustB); + RgbChannelAdjustment(uint8_t adjustR, uint8_t adjustG, uint8_t adjustB); /// Destructor ~RgbChannelAdjustment(); /// @return The current adjustR value - uint8_t getadjustmentR() const; + uint8_t getAdjustmentR() const; + + /// setAdjustment RGB + /// @param adjustR + /// @param adjustG + /// @param adjustB + void setAdjustment(uint8_t adjustR, uint8_t adjustG, uint8_t adjustB); /// @param threshold New adjustR value - void setadjustmentR(uint8_t adjustR); + void setAdjustmentR(uint8_t adjustR); /// @return The current adjustG value - uint8_t getadjustmentG() const; + uint8_t getAdjustmentG() const; /// @param gamma New adjustG value - void setadjustmentG(uint8_t adjustG); + void setAdjustmentG(uint8_t adjustG); /// @return The current adjustB value - uint8_t getadjustmentB() const; + uint8_t getAdjustmentB() const; /// @param blacklevel New adjustB value - void setadjustmentB(uint8_t adjustB); + void setAdjustmentB(uint8_t adjustB); /// Transform the given array value /// @param input The input color bytes @@ -48,19 +53,15 @@ public: private: + /// color channels + enum ColorChannel { RED=0,GREEN=1, BLUE=2 }; + /// (re)-initilize the color mapping void initializeMapping(); - -private: - /// The adjustment of R channel - int _adjustR; - /// The adjustment of G channel - int _adjustG; - /// The adjustment of B channel - int _adjustB; + + /// The adjustment of RGB channel + uint8_t _adjust[3]; /// The mapping from input color to output color - int _mappingR[256]; - int _mappingG[256]; - int _mappingB[256]; + uint8_t _mapping[3][256]; }; diff --git a/libsrc/hyperion/MultiColorAdjustment.cpp b/libsrc/hyperion/MultiColorAdjustment.cpp index 9348a8f6..33ce400b 100644 --- a/libsrc/hyperion/MultiColorAdjustment.cpp +++ b/libsrc/hyperion/MultiColorAdjustment.cpp @@ -98,11 +98,11 @@ void MultiColorAdjustment::applyAdjustment(std::vector& ledColors) int BB = adjustment->_rgbBlueAdjustment.adjustmentB(color.blue); int ledR = RR + GR + BR; - int maxR = (int)adjustment->_rgbRedAdjustment.getadjustmentR(); + int maxR = (int)adjustment->_rgbRedAdjustment.getAdjustmentR(); int ledG = RG + GG + BG; - int maxG = (int)adjustment->_rgbGreenAdjustment.getadjustmentG(); + int maxG = (int)adjustment->_rgbGreenAdjustment.getAdjustmentG(); int ledB = RB + GB + BB; - int maxB = (int)adjustment->_rgbBlueAdjustment.getadjustmentB(); + int maxB = (int)adjustment->_rgbBlueAdjustment.getAdjustmentB(); if (ledR > maxR) color.red = (uint8_t)maxR; diff --git a/libsrc/jsonserver/JsonClientConnection.cpp b/libsrc/jsonserver/JsonClientConnection.cpp index 932cd7f4..307a085b 100644 --- a/libsrc/jsonserver/JsonClientConnection.cpp +++ b/libsrc/jsonserver/JsonClientConnection.cpp @@ -470,17 +470,17 @@ void JsonClientConnection::handleServerInfoCommand(const Json::Value &) adjustment["id"] = adjustmentId; Json::Value & redAdjust = adjustment["redAdjust"]; - redAdjust.append(colorAdjustment->_rgbRedAdjustment.getadjustmentR()); - redAdjust.append(colorAdjustment->_rgbRedAdjustment.getadjustmentG()); - redAdjust.append(colorAdjustment->_rgbRedAdjustment.getadjustmentB()); + redAdjust.append(colorAdjustment->_rgbRedAdjustment.getAdjustmentR()); + redAdjust.append(colorAdjustment->_rgbRedAdjustment.getAdjustmentG()); + redAdjust.append(colorAdjustment->_rgbRedAdjustment.getAdjustmentB()); Json::Value & greenAdjust = adjustment["greenAdjust"]; - greenAdjust.append(colorAdjustment->_rgbGreenAdjustment.getadjustmentR()); - greenAdjust.append(colorAdjustment->_rgbGreenAdjustment.getadjustmentG()); - greenAdjust.append(colorAdjustment->_rgbGreenAdjustment.getadjustmentB()); + greenAdjust.append(colorAdjustment->_rgbGreenAdjustment.getAdjustmentR()); + greenAdjust.append(colorAdjustment->_rgbGreenAdjustment.getAdjustmentG()); + greenAdjust.append(colorAdjustment->_rgbGreenAdjustment.getAdjustmentB()); Json::Value & blueAdjust = adjustment["blueAdjust"]; - blueAdjust.append(colorAdjustment->_rgbBlueAdjustment.getadjustmentR()); - blueAdjust.append(colorAdjustment->_rgbBlueAdjustment.getadjustmentG()); - blueAdjust.append(colorAdjustment->_rgbBlueAdjustment.getadjustmentB()); + blueAdjust.append(colorAdjustment->_rgbBlueAdjustment.getAdjustmentR()); + blueAdjust.append(colorAdjustment->_rgbBlueAdjustment.getAdjustmentG()); + blueAdjust.append(colorAdjustment->_rgbBlueAdjustment.getAdjustmentB()); } // collect effect info @@ -726,25 +726,25 @@ void JsonClientConnection::handleAdjustmentCommand(const Json::Value &message) if (adjustment.isMember("redAdjust")) { const Json::Value & values = adjustment["redAdjust"]; - colorAdjustment->_rgbRedAdjustment.setadjustmentR(values[0u].asInt()); - colorAdjustment->_rgbRedAdjustment.setadjustmentG(values[1u].asInt()); - colorAdjustment->_rgbRedAdjustment.setadjustmentB(values[2u].asInt()); + colorAdjustment->_rgbRedAdjustment.setAdjustmentR(values[0u].asInt()); + colorAdjustment->_rgbRedAdjustment.setAdjustmentG(values[1u].asInt()); + colorAdjustment->_rgbRedAdjustment.setAdjustmentB(values[2u].asInt()); } if (adjustment.isMember("greenAdjust")) { const Json::Value & values = adjustment["greenAdjust"]; - colorAdjustment->_rgbGreenAdjustment.setadjustmentR(values[0u].asInt()); - colorAdjustment->_rgbGreenAdjustment.setadjustmentG(values[1u].asInt()); - colorAdjustment->_rgbGreenAdjustment.setadjustmentB(values[2u].asInt()); + colorAdjustment->_rgbGreenAdjustment.setAdjustmentR(values[0u].asInt()); + colorAdjustment->_rgbGreenAdjustment.setAdjustmentG(values[1u].asInt()); + colorAdjustment->_rgbGreenAdjustment.setAdjustmentB(values[2u].asInt()); } if (adjustment.isMember("blueAdjust")) { const Json::Value & values = adjustment["blueAdjust"]; - colorAdjustment->_rgbBlueAdjustment.setadjustmentR(values[0u].asInt()); - colorAdjustment->_rgbBlueAdjustment.setadjustmentG(values[1u].asInt()); - colorAdjustment->_rgbBlueAdjustment.setadjustmentB(values[2u].asInt()); + colorAdjustment->_rgbBlueAdjustment.setAdjustmentR(values[0u].asInt()); + colorAdjustment->_rgbBlueAdjustment.setAdjustmentG(values[1u].asInt()); + colorAdjustment->_rgbBlueAdjustment.setAdjustmentB(values[2u].asInt()); } // commit the changes _hyperion->adjustmentsUpdated(); diff --git a/libsrc/utils/RgbChannelAdjustment.cpp b/libsrc/utils/RgbChannelAdjustment.cpp index 0c5468c7..79ddff99 100644 --- a/libsrc/utils/RgbChannelAdjustment.cpp +++ b/libsrc/utils/RgbChannelAdjustment.cpp @@ -1,107 +1,84 @@ // STL includes #include +#include +#include // Utils includes #include -RgbChannelAdjustment::RgbChannelAdjustment() : - _adjustR(255), - _adjustG(255), - _adjustB(255) +RgbChannelAdjustment::RgbChannelAdjustment() { - initializeMapping(); + setAdjustment(UINT8_MAX, UINT8_MAX, UINT8_MAX); } -RgbChannelAdjustment::RgbChannelAdjustment(int adjustR, int adjustG, int adjustB) : - _adjustR(adjustR), - _adjustG(adjustG), - _adjustB(adjustB) +RgbChannelAdjustment::RgbChannelAdjustment(uint8_t adjustR, uint8_t adjustG, uint8_t adjustB) { - initializeMapping(); + setAdjustment(adjustR, adjustG, adjustB); } RgbChannelAdjustment::~RgbChannelAdjustment() { } -uint8_t RgbChannelAdjustment::getadjustmentR() const +void RgbChannelAdjustment::setAdjustment(uint8_t adjustR, uint8_t adjustG, uint8_t adjustB) { - return _adjustR; -} - -void RgbChannelAdjustment::setadjustmentR(uint8_t adjustR) -{ - _adjustR = adjustR; + _adjust[RED] = adjustR; + _adjust[GREEN] = adjustG; + _adjust[BLUE] = adjustB; initializeMapping(); } -uint8_t RgbChannelAdjustment::getadjustmentG() const +uint8_t RgbChannelAdjustment::getAdjustmentR() const { - return _adjustG; + return _adjust[RED]; } -void RgbChannelAdjustment::setadjustmentG(uint8_t adjustG) +void RgbChannelAdjustment::setAdjustmentR(uint8_t adjustR) { - _adjustG = adjustG; - initializeMapping(); + setAdjustment(adjustR, _adjust[GREEN], _adjust[BLUE]); } -uint8_t RgbChannelAdjustment::getadjustmentB() const +uint8_t RgbChannelAdjustment::getAdjustmentG() const { - return _adjustB; + return _adjust[GREEN]; } -void RgbChannelAdjustment::setadjustmentB(uint8_t adjustB) +void RgbChannelAdjustment::setAdjustmentG(uint8_t adjustG) { - _adjustB = adjustB; - initializeMapping(); + setAdjustment(_adjust[RED], adjustG, _adjust[BLUE]); +} + +uint8_t RgbChannelAdjustment::getAdjustmentB() const +{ + return _adjust[BLUE]; +} + +void RgbChannelAdjustment::setAdjustmentB(uint8_t adjustB) +{ + setAdjustment(_adjust[RED], _adjust[GREEN], adjustB); } uint8_t RgbChannelAdjustment::adjustmentR(uint8_t inputR) const { - return _mappingR[inputR]; + return _mapping[RED][inputR]; } uint8_t RgbChannelAdjustment::adjustmentG(uint8_t inputG) const { - return _mappingG[inputG]; + return _mapping[GREEN][inputG]; } uint8_t RgbChannelAdjustment::adjustmentB(uint8_t inputB) const { - return _mappingB[inputB]; + return _mapping[BLUE][inputB]; } void RgbChannelAdjustment::initializeMapping() { - // initialize the mapping - for (int i = 0; i < 256; ++i) - { - int outputR = (i * _adjustR) / 255; - if (outputR > 255) + // initialize linear mapping + for (unsigned channel=0; channel<3; channel++) + for (unsigned idx=0; idx<=UINT8_MAX; idx++) { - outputR = 255; + _mapping[channel][idx] = std::min( ((idx * _adjust[channel]) / UINT8_MAX), (unsigned)UINT8_MAX); } - _mappingR[i] = outputR; - } - for (int i = 0; i < 256; ++i) - { - int outputG = (i * _adjustG) / 255; - if (outputG > 255) - { - outputG = 255; - } - _mappingG[i] = outputG; - } - for (int i = 0; i < 256; ++i) - { - int outputB = (i * _adjustB) / 255; - if (outputB > 255) - { - outputB = 255; - } - _mappingB[i] = outputB; - } - - }