Changeset View
Changeset View
Standalone View
Standalone View
source/blender/compositor/operations/COM_LuminanceMatteOperation.cpp
| Show All 16 Lines | |||||
| * | * | ||||
| * Contributor: | * Contributor: | ||||
| * Dalai Felinto | * Dalai Felinto | ||||
| */ | */ | ||||
| #include "COM_LuminanceMatteOperation.h" | #include "COM_LuminanceMatteOperation.h" | ||||
| #include "BLI_math.h" | #include "BLI_math.h" | ||||
| extern "C" { | |||||
| #include "IMB_colormanagement.h" | |||||
| } | |||||
| LuminanceMatteOperation::LuminanceMatteOperation() : NodeOperation() | LuminanceMatteOperation::LuminanceMatteOperation() : NodeOperation() | ||||
| { | { | ||||
| addInputSocket(COM_DT_COLOR); | addInputSocket(COM_DT_COLOR); | ||||
| addOutputSocket(COM_DT_VALUE); | addOutputSocket(COM_DT_VALUE); | ||||
| this->m_inputImageProgram = NULL; | this->m_inputImageProgram = NULL; | ||||
| } | } | ||||
| void LuminanceMatteOperation::initExecution() | void LuminanceMatteOperation::initExecution() | ||||
| { | { | ||||
| this->m_inputImageProgram = this->getInputSocketReader(0); | this->m_inputImageProgram = this->getInputSocketReader(0); | ||||
| } | } | ||||
| void LuminanceMatteOperation::deinitExecution() | void LuminanceMatteOperation::deinitExecution() | ||||
| { | { | ||||
| this->m_inputImageProgram = NULL; | this->m_inputImageProgram = NULL; | ||||
| } | } | ||||
| void LuminanceMatteOperation::executePixelSampled(float output[4], float x, float y, PixelSampler sampler) | void LuminanceMatteOperation::executePixelSampled(float output[4], float x, float y, PixelSampler sampler) | ||||
| { | { | ||||
| float inColor[4]; | float inColor[4]; | ||||
| this->m_inputImageProgram->readSampled(inColor, x, y, sampler); | |||||
| const float high = this->m_settings->t1; | const float high = this->m_settings->t1; | ||||
| const float low = this->m_settings->t2; | const float low = this->m_settings->t2; | ||||
| const float luminance = IMB_colormanagement_get_luminance(inColor); | |||||
| float alpha; | float alpha; | ||||
| this->m_inputImageProgram->readSampled(inColor, x, y, sampler); | |||||
| /* one line thread-friend algorithm: | /* 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 */ | /* test range */ | ||||
| if (inColor[0] > high) { | if (luminance > high) { | ||||
| alpha = 1.0f; | alpha = 1.0f; | ||||
| } | } | ||||
| else if (inColor[0] < low) { | else if (luminance < low) { | ||||
| alpha = 0.0f; | alpha = 0.0f; | ||||
| } | } | ||||
| else { /*blend */ | else { /*blend */ | ||||
| alpha = (inColor[0] - low) / (high - low); | alpha = (luminance - low) / (high - low); | ||||
| } | } | ||||
| /* store matte(alpha) value in [0] to go with | /* store matte(alpha) value in [0] to go with | ||||
| * COM_SetAlphaOperation and the Value output | * COM_SetAlphaOperation and the Value output | ||||
| */ | */ | ||||
| /* don't make something that was more transparent less transparent */ | /* don't make something that was more transparent less transparent */ | ||||
| if (alpha < inColor[3]) { | output[0] = min_ff(alpha, inColor[3]); | ||||
| output[0] = alpha; | |||||
| } | |||||
| else { | |||||
| /* leave now it was before */ | |||||
| output[0] = inColor[3]; | |||||
| } | |||||
| } | } | ||||