diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-01-06 18:41:33 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-01-06 18:41:33 +0300 |
commit | 0e59f2b256fbf81145fd26f9f37f46b07c9e54b4 (patch) | |
tree | 669c6e725335c8b0ca2ea740221aea8bfded23ae /source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp | |
parent | c6abf41f71210b56c9484bf6bbd0df90d9c93fdc (diff) |
Fix T47212: incorrect luma coefficients for Luminance Key node.
Differential Revision: https://developer.blender.org/D2982
Diffstat (limited to 'source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp')
-rw-r--r-- | source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp b/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp index 3be5447db3b..1401ab56fbd 100644 --- a/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp +++ b/source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp @@ -22,6 +22,10 @@ #include "COM_LuminanceMatteOperation.h" #include "BLI_math.h" +extern "C" { +#include "IMB_colormanagement.h" +} + LuminanceMatteOperation::LuminanceMatteOperation() : NodeOperation() { addInputSocket(COM_DT_COLOR); @@ -43,41 +47,34 @@ void LuminanceMatteOperation::deinitExecution() void LuminanceMatteOperation::executePixelSampled(float output[4], float x, float y, PixelSampler sampler) { float inColor[4]; + this->m_inputImageProgram->readSampled(inColor, x, y, sampler); const float high = this->m_settings->t1; const float low = this->m_settings->t2; + const float luminance = IMB_colormanagement_get_luminance(inColor); float alpha; - - this->m_inputImageProgram->readSampled(inColor, x, y, sampler); /* one line thread-friend algorithm: - * output[0] = max(inputValue[3], min(high, max(low, ((inColor[0] - low) / (high - low)))); + * output[0] = min(inputValue[3], min(1.0f, max(0.0f, ((luminance - low) / (high - low)))); */ /* test range */ - if (inColor[0] > high) { + if (luminance > high) { alpha = 1.0f; } - else if (inColor[0] < low) { + else if (luminance < low) { alpha = 0.0f; } else { /*blend */ - alpha = (inColor[0] - low) / (high - low); + alpha = (luminance - low) / (high - low); } - /* store matte(alpha) value in [0] to go with * COM_SetAlphaOperation and the Value output */ /* don't make something that was more transparent less transparent */ - if (alpha < inColor[3]) { - output[0] = alpha; - } - else { - /* leave now it was before */ - output[0] = inColor[3]; - } + output[0] = min_ff(alpha, inColor[3]); } |