[Bf-blender-cvs] [1be813c8e57] compositor-full-frame: Compositor: Full frame Luminance Key node

Manuel Castilla noreply at git.blender.org
Sun Aug 15 17:09:49 CEST 2021


Commit: 1be813c8e5721226190fd6b3a8be296c45a52787
Author: Manuel Castilla
Date:   Sun Aug 15 16:33:09 2021 +0200
Branches: compositor-full-frame
https://developer.blender.org/rB1be813c8e5721226190fd6b3a8be296c45a52787

Compositor: Full frame Luminance Key node

===================================================================

M	source/blender/compositor/operations/COM_LuminanceMatteOperation.cc
M	source/blender/compositor/operations/COM_LuminanceMatteOperation.h

===================================================================

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



More information about the Bf-blender-cvs mailing list