Color Adjustment 2.0 (#351)

* Rename test to test123

* Delete test123

* New color Ajustment

Trilinear interpolation between the 8 corners of the color cube (black, red, green, blue, cyan, magenta, yellow, white)

* Renaming

* overloading getadjustmentX()

* Renaming

* Additional renaming

* Added more RgbChannel

* Added more colors to channelAdjustment

* Added additional colors

* Added additional colors

* Added additional colors

* Added additional color adjustments

* Update MultiColorAdjustment.cpp

* Fixed black adjustment

* Color config in array form
This commit is contained in:
Robin Kobus
2016-12-29 17:02:37 +01:00
committed by redPanther
parent db5ce43202
commit 8d304d58d2
9 changed files with 263 additions and 185 deletions

View File

@@ -90,22 +90,47 @@ ColorTransform * Hyperion::createColorTransform(const QJsonObject & transformCon
ColorAdjustment * Hyperion::createColorAdjustment(const QJsonObject & adjustmentConfig)
{
const std::string id = adjustmentConfig["id"].toString("default").toStdString();
RgbChannelAdjustment * redAdjustment = createRgbChannelAdjustment(adjustmentConfig["pureRed"].toObject(),RED);
RgbChannelAdjustment * greenAdjustment = createRgbChannelAdjustment(adjustmentConfig["pureGreen"].toObject(),GREEN);
RgbChannelAdjustment * blueAdjustment = createRgbChannelAdjustment(adjustmentConfig["pureBlue"].toObject(),BLUE);
// QT5.4 needed
//~ RgbChannelAdjustment * blackAdjustment = createRgbChannelAdjustment(adjustmentConfig["black"]. toArray(QJsonArray({"0","0","0" })));
//~ RgbChannelAdjustment * whiteAdjustment = createRgbChannelAdjustment(adjustmentConfig["white"]. toArray(QJsonArray({"255","255","255"})));
//~ RgbChannelAdjustment * redAdjustment = createRgbChannelAdjustment(adjustmentConfig["red"]. toArray(QJsonArray({"255","0","0" })));
//~ RgbChannelAdjustment * greenAdjustment = createRgbChannelAdjustment(adjustmentConfig["green"]. toArray(QJsonArray({"0","255","0" })));
//~ RgbChannelAdjustment * blueAdjustment = createRgbChannelAdjustment(adjustmentConfig["blue"]. toArray(QJsonArray({"0","0","255" })));
//~ RgbChannelAdjustment * cyanAdjustment = createRgbChannelAdjustment(adjustmentConfig["cyan"]. toArray(QJsonArray({"0","255","255" })));
//~ RgbChannelAdjustment * magentaAdjustment = createRgbChannelAdjustment(adjustmentConfig["magenta"].toArray(QJsonArray({"255","0","255" })));
//~ RgbChannelAdjustment * yellowAdjustment = createRgbChannelAdjustment(adjustmentConfig["yellow"]. toArray(QJsonArray({"255","255","0" })));
RgbChannelAdjustment * blackAdjustment = createRgbChannelAdjustment(adjustmentConfig["black"].toArray(),BLACK);
RgbChannelAdjustment * whiteAdjustment = createRgbChannelAdjustment(adjustmentConfig["white"].toArray(),WHITE);
RgbChannelAdjustment * redAdjustment = createRgbChannelAdjustment(adjustmentConfig["pureRed"].toArray(),RED);
RgbChannelAdjustment * greenAdjustment = createRgbChannelAdjustment(adjustmentConfig["pureGreen"].toArray(),GREEN);
RgbChannelAdjustment * blueAdjustment = createRgbChannelAdjustment(adjustmentConfig["pureBlue"].toArray(),BLUE);
RgbChannelAdjustment * cyanAdjustment = createRgbChannelAdjustment(adjustmentConfig["cyan"].toArray(),CYAN);
RgbChannelAdjustment * magentaAdjustment = createRgbChannelAdjustment(adjustmentConfig["magenta"].toArray(),MAGENTA);
RgbChannelAdjustment * yellowAdjustment = createRgbChannelAdjustment(adjustmentConfig["yellow"].toArray(),YELLOW);
ColorAdjustment * adjustment = new ColorAdjustment();
adjustment->_id = id;
adjustment->_rgbRedAdjustment = *redAdjustment;
adjustment->_rgbGreenAdjustment = *greenAdjustment;
adjustment->_rgbBlueAdjustment = *blueAdjustment;
adjustment->_rgbBlackAdjustment = *blackAdjustment;
adjustment->_rgbWhiteAdjustment = *whiteAdjustment;
adjustment->_rgbRedAdjustment = *redAdjustment;
adjustment->_rgbGreenAdjustment = *greenAdjustment;
adjustment->_rgbBlueAdjustment = *blueAdjustment;
adjustment->_rgbCyanAdjustment = *cyanAdjustment;
adjustment->_rgbMagentaAdjustment = *magentaAdjustment;
adjustment->_rgbYellowAdjustment = *yellowAdjustment;
// Cleanup the allocated individual adjustments
delete blackAdjustment;
delete whiteAdjustment;
delete redAdjustment;
delete greenAdjustment;
delete blueAdjustment;
delete cyanAdjustment;
delete magentaAdjustment;
delete yellowAdjustment;
return adjustment;
}
@@ -288,28 +313,58 @@ RgbChannelTransform* Hyperion::createRgbChannelTransform(const QJsonObject& colo
return transform;
}
RgbChannelAdjustment* Hyperion::createRgbChannelAdjustment(const QJsonObject& colorConfig, const RgbChannel color)
RgbChannelAdjustment* Hyperion::createRgbChannelAdjustment(const QJsonArray& colorConfig, const RgbChannel color)
{
int varR=0, varG=0, varB=0;
if (color == RED)
if (color == BLACK)
{
varR = colorConfig["redChannel"].toInt(255);
varG = colorConfig["greenChannel"].toInt(0);
varB = colorConfig["blueChannel"].toInt(0);
varR = colorConfig[0].toInt(0);
varG = colorConfig[1].toInt(0);
varB = colorConfig[2].toInt(0);
}
else if (color == WHITE)
{
varR = colorConfig[0].toInt(255);
varG = colorConfig[1].toInt(255);
varB = colorConfig[2].toInt(255);
}
else if (color == RED)
{
varR = colorConfig[0].toInt(255);
varG = colorConfig[1].toInt(0);
varB = colorConfig[2].toInt(0);
}
else if (color == GREEN)
{
varR = colorConfig["redChannel"].toInt(0);
varG = colorConfig["greenChannel"].toInt(255);
varB = colorConfig["blueChannel"].toInt(0);
varR = colorConfig[0].toInt(0);
varG = colorConfig[1].toInt(255);
varB = colorConfig[2].toInt(0);
}
else if (color == BLUE)
{
varR = colorConfig["redChannel"].toInt(0);
varG = colorConfig["greenChannel"].toInt(0);
varB = colorConfig["blueChannel"].toInt(255);
varR = colorConfig[0].toInt(0);
varG = colorConfig[1].toInt(0);
varB = colorConfig[2].toInt(255);
}
else if (color == CYAN)
{
varR = colorConfig[0].toInt(0);
varG = colorConfig[1].toInt(255);
varB = colorConfig[2].toInt(255);
}
else if (color == MAGENTA)
{
varR = colorConfig[0].toInt(255);
varG = colorConfig[1].toInt(0);
varB = colorConfig[2].toInt(255);
}
else if (color == YELLOW)
{
varR = colorConfig[0].toInt(255);
varG = colorConfig[1].toInt(255);
varB = colorConfig[2].toInt(0);
}
RgbChannelAdjustment* adjustment = new RgbChannelAdjustment(varR, varG, varB);
return adjustment;
}

View File

@@ -85,38 +85,54 @@ void MultiColorAdjustment::applyAdjustment(std::vector<ColorRgb>& ledColors)
}
ColorRgb& color = ledColors[i];
int RR = adjustment->_rgbRedAdjustment.adjustmentR(color.red);
int RG = color.red > color.green ? adjustment->_rgbRedAdjustment.adjustmentG(color.red-color.green) : 0;
int RB = color.red > color.blue ? adjustment->_rgbRedAdjustment.adjustmentB(color.red-color.blue) : 0;
uint32_t nrng = (uint32_t) (255-color.red)*(255-color.green);
uint32_t rng = (uint32_t) (color.red) *(255-color.green);
uint32_t nrg = (uint32_t) (255-color.red)*(color.green);
uint32_t rg = (uint32_t) (color.red) *(color.green);
int GR = color.green > color.red ? adjustment->_rgbGreenAdjustment.adjustmentR(color.green-color.red) : 0;
int GG = adjustment->_rgbGreenAdjustment.adjustmentG(color.green);
int GB = color.green > color.blue ? adjustment->_rgbGreenAdjustment.adjustmentB(color.green-color.blue) : 0;
uint8_t black = nrng*(255-color.blue)/65025;
uint8_t red = rng *(255-color.blue)/65025;
uint8_t green = nrg *(255-color.blue)/65025;
uint8_t blue = nrng*(color.blue) /65025;
uint8_t cyan = nrg *(color.blue) /65025;
uint8_t magenta = rng *(color.blue) /65025;
uint8_t yellow = rg *(255-color.blue)/65025;
uint8_t white = rg *(color.blue) /65025;
int BR = color.blue > color.red ? adjustment->_rgbBlueAdjustment.adjustmentR(color.blue-color.red) : 0;
int BG = color.blue > color.green ? adjustment->_rgbBlueAdjustment.adjustmentG(color.blue-color.green) : 0;
int BB = adjustment->_rgbBlueAdjustment.adjustmentB(color.blue);
int ledR = RR + GR + BR;
int maxR = (int)adjustment->_rgbRedAdjustment.getAdjustmentR();
int ledG = RG + GG + BG;
int maxG = (int)adjustment->_rgbGreenAdjustment.getAdjustmentG();
int ledB = RB + GB + BB;
int maxB = (int)adjustment->_rgbBlueAdjustment.getAdjustmentB();
uint8_t OR = adjustment->_rgbBlackAdjustment.getAdjustmentR(black);
uint8_t OG = adjustment->_rgbBlackAdjustment.getAdjustmentG(black);
uint8_t OB = adjustment->_rgbBlackAdjustment.getAdjustmentB(black);
if (ledR > maxR)
color.red = (uint8_t)maxR;
else
color.red = (uint8_t)ledR;
uint8_t RR = adjustment->_rgbRedAdjustment.getAdjustmentR(red);
uint8_t RG = adjustment->_rgbRedAdjustment.getAdjustmentG(red);
uint8_t RB = adjustment->_rgbRedAdjustment.getAdjustmentB(red);
if (ledG > maxG)
color.green = (uint8_t)maxG;
else
color.green = (uint8_t)ledG;
uint8_t GR = adjustment->_rgbGreenAdjustment.getAdjustmentR(green);
uint8_t GG = adjustment->_rgbGreenAdjustment.getAdjustmentG(green);
uint8_t GB = adjustment->_rgbGreenAdjustment.getAdjustmentB(green);
if (ledB > maxB)
color.blue = (uint8_t)maxB;
else
color.blue = (uint8_t)ledB;
uint8_t BR = adjustment->_rgbBlueAdjustment.getAdjustmentR(blue);
uint8_t BG = adjustment->_rgbBlueAdjustment.getAdjustmentG(blue);
uint8_t BB = adjustment->_rgbBlueAdjustment.getAdjustmentB(blue);
uint8_t CR = adjustment->_rgbCyanAdjustment.getAdjustmentR(cyan);
uint8_t CG = adjustment->_rgbCyanAdjustment.getAdjustmentG(cyan);
uint8_t CB = adjustment->_rgbCyanAdjustment.getAdjustmentB(cyan);
uint8_t MR = adjustment->_rgbMagentaAdjustment.getAdjustmentR(magenta);
uint8_t MG = adjustment->_rgbMagentaAdjustment.getAdjustmentG(magenta);
uint8_t MB = adjustment->_rgbMagentaAdjustment.getAdjustmentB(magenta);
uint8_t YR = adjustment->_rgbYellowAdjustment.getAdjustmentR(yellow);
uint8_t YG = adjustment->_rgbYellowAdjustment.getAdjustmentG(yellow);
uint8_t YB = adjustment->_rgbYellowAdjustment.getAdjustmentB(yellow);
uint8_t WR = adjustment->_rgbWhiteAdjustment.getAdjustmentR(white);
uint8_t WG = adjustment->_rgbWhiteAdjustment.getAdjustmentG(white);
uint8_t WB = adjustment->_rgbWhiteAdjustment.getAdjustmentB(white);
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;
}
}

View File

@@ -131,95 +131,109 @@
"type" : "string",
"required" : true
},
"pureRed" :
"black" :
{
"type":"object",
"type" : "array",
"required" : true,
"properties":
{
"redChannel" :
{
"type": "integer",
"required" : true,
"minimum": 0,
"maximum": 255
},
"greenChannel" :
{
"type": "integer",
"required" : true,
"minimum": 0,
"maximum": 255
},
"blueChannel" :
{
"type": "integer",
"required" : true,
"minimum": 0,
"maximum": 255
}
"default": [0,0,0],
"items" : {
"type" : "integer",
"minimum" : 0,
"maximum" : 255
},
"additionalProperties" : false
"minItems" : 3,
"maxItems" : 3
},
"pureGreen" :
"white" :
{
"type":"object",
"type" : "array",
"required" : true,
"properties":
{
"redChannel" :
{
"type": "integer",
"required" : true,
"minimum": 0,
"maximum": 255
},
"greenChannel" :
{
"type": "integer",
"required" : true,
"minimum": 0,
"maximum": 255
},
"blueChannel" :
{
"type": "integer",
"required" : true,
"minimum": 0,
"maximum": 255
}
"default": [255,255,255],
"items" : {
"type" : "integer",
"minimum" : 0,
"maximum" : 255
},
"additionalProperties" : false
"minItems" : 3,
"maxItems" : 3
},
"pureBlue" :
"red" :
{
"type":"object",
"type" : "array",
"required" : true,
"properties":
{
"redChannel" :
{
"type": "integer",
"required" : true,
"minimum": 0,
"maximum": 255
},
"greenChannel" :
{
"type": "integer",
"required" : true,
"minimum": 0,
"maximum": 255
},
"blueChannel" :
{
"type": "integer",
"required" : true,
"minimum": 0,
"maximum": 255
}
"default": [255,0,0],
"items" : {
"type" : "integer",
"minimum" : 0,
"maximum" : 255
},
"additionalProperties" : false
"minItems" : 3,
"maxItems" : 3
},
"green" :
{
"type" : "array",
"required" : true,
"default": [0,255,0],
"items" : {
"type" : "integer",
"minimum" : 0,
"maximum" : 255
},
"minItems" : 3,
"maxItems" : 3
},
"blue" :
{
"type" : "array",
"required" : true,
"default": [0,0,255],
"items" : {
"type" : "integer",
"minimum" : 0,
"maximum" : 255
},
"minItems" : 3,
"maxItems" : 3
},
"cyan" :
{
"type" : "array",
"required" : true,
"default": [0,255,255],
"items" : {
"type" : "integer",
"minimum" : 0,
"maximum" : 255
},
"minItems" : 3,
"maxItems" : 3
},
"magenta" :
{
"type" : "array",
"required" : true,
"default": [255,0,255],
"items" : {
"type" : "integer",
"minimum" : 0,
"maximum" : 255
},
"minItems" : 3,
"maxItems" : 3
},
"yellow" :
{
"type" : "array",
"required" : true,
"default": [255,255,0],
"items" : {
"type" : "integer",
"minimum" : 0,
"maximum" : 255
},
"minItems" : 3,
"maxItems" : 3
}
},
"additionalProperties" : false

View File

@@ -58,17 +58,17 @@ void RgbChannelAdjustment::setAdjustmentB(uint8_t adjustB)
setAdjustment(_adjust[RED], _adjust[GREEN], adjustB);
}
uint8_t RgbChannelAdjustment::adjustmentR(uint8_t inputR) const
uint8_t RgbChannelAdjustment::getAdjustmentR(uint8_t inputR) const
{
return _mapping[RED][inputR];
}
uint8_t RgbChannelAdjustment::adjustmentG(uint8_t inputG) const
uint8_t RgbChannelAdjustment::getAdjustmentG(uint8_t inputG) const
{
return _mapping[GREEN][inputG];
}
uint8_t RgbChannelAdjustment::adjustmentB(uint8_t inputB) const
uint8_t RgbChannelAdjustment::getAdjustmentB(uint8_t inputB) const
{
return _mapping[BLUE][inputB];
}