diff options
-rw-r--r-- | source/blender/compositor/operations/COM_LuminanceMatteOperation.cc | 35 | ||||
-rw-r--r-- | source/blender/compositor/operations/COM_LuminanceMatteOperation.h | 8 |
2 files changed, 41 insertions, 2 deletions
diff --git a/source/blender/compositor/operations/COM_LuminanceMatteOperation.cc b/source/blender/compositor/operations/COM_LuminanceMatteOperation.cc index 5ca16e40ce3..5ff6be6b8f6 100644 --- a/source/blender/compositor/operations/COM_LuminanceMatteOperation.cc +++ b/source/blender/compositor/operations/COM_LuminanceMatteOperation.cc @@ -78,4 +78,39 @@ void LuminanceMatteOperation::executePixelSampled(float output[4], output[0] = min_ff(alpha, inColor[3]); } +void LuminanceMatteOperation::update_memory_buffer_partial(MemoryBuffer *output, + const rcti &area, + Span<MemoryBuffer *> inputs) +{ + for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) { + const float *color = it.in(0); + const float luminance = IMB_colormanagement_get_luminance(color); + + /* One line thread-friend algorithm: + * `it.out[0] = MIN2(color[3], MIN2(1.0f, MAX2(0.0f, ((luminance - low) / (high - low))));` + */ + + /* Test range. */ + const float high = m_settings->t1; + const float low = m_settings->t2; + float alpha; + if (luminance > high) { + alpha = 1.0f; + } + else if (luminance < low) { + alpha = 0.0f; + } + else { /* Blend. */ + alpha = (luminance - low) / (high - low); + } + + /* Store matte(alpha) value in [0] to go with + * COM_SetAlphaMultiplyOperation and the Value output. + */ + + /* Don't make something that was more transparent less transparent. */ + it.out[0] = MIN2(alpha, color[3]); + } +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_LuminanceMatteOperation.h b/source/blender/compositor/operations/COM_LuminanceMatteOperation.h index 035c68b9d59..aedfc715382 100644 --- a/source/blender/compositor/operations/COM_LuminanceMatteOperation.h +++ b/source/blender/compositor/operations/COM_LuminanceMatteOperation.h @@ -18,7 +18,7 @@ #pragma once -#include "COM_MixOperation.h" +#include "COM_MultiThreadedOperation.h" namespace blender::compositor { @@ -26,7 +26,7 @@ namespace blender::compositor { * this program converts an input color to an output value. * it assumes we are in sRGB color space. */ -class LuminanceMatteOperation : public NodeOperation { +class LuminanceMatteOperation : public MultiThreadedOperation { private: NodeChroma *m_settings; SocketReader *m_inputImageProgram; @@ -49,6 +49,10 @@ class LuminanceMatteOperation : public NodeOperation { { this->m_settings = nodeChroma; } + + void update_memory_buffer_partial(MemoryBuffer *output, + const rcti &area, + Span<MemoryBuffer *> inputs) override; }; } // namespace blender::compositor |