From 0e59f2b256fbf81145fd26f9f37f46b07c9e54b4 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sat, 6 Jan 2018 16:41:33 +0100 Subject: Fix T47212: incorrect luma coefficients for Luminance Key node. Differential Revision: https://developer.blender.org/D2982 --- .../operations/COM_LuminanceMatteOperation.cpp | 25 ++++++++++------------ 1 file changed, 11 insertions(+), 14 deletions(-) (limited to 'source/blender/compositor/operations') 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]); } -- cgit v1.2.3