[Bf-blender-cvs] [6beaa297918] master: Compositing Convert color space node

Jeroen Bakker noreply at git.blender.org
Mon Jan 10 08:59:48 CET 2022


Commit: 6beaa297918b24de00d26886e981312b041748b0
Author: Jeroen Bakker
Date:   Mon Jan 10 08:57:53 2022 +0100
Branches: master
https://developer.blender.org/rB6beaa297918b24de00d26886e981312b041748b0

Compositing Convert color space node

Compositor node to convert between color spaces.

Conversion is skipped when converting between the same color spaces or to or from data spaces.
Implementation done for tiled and full frame compositor.

Reviewed By: Blendify, jbakker

Differential Revision: https://developer.blender.org/D12481

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

M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/node.cc
M	source/blender/compositor/CMakeLists.txt
M	source/blender/compositor/intern/COM_Converter.cc
M	source/blender/compositor/intern/COM_MemoryBuffer.cc
M	source/blender/compositor/intern/COM_MemoryBuffer.h
A	source/blender/compositor/nodes/COM_ConvertColorSpaceNode.cc
A	source/blender/compositor/nodes/COM_ConvertColorSpaceNode.h
A	source/blender/compositor/operations/COM_ConvertColorSpaceOperation.cc
A	source/blender/compositor/operations/COM_ConvertColorSpaceOperation.h
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/nodes/NOD_composite.h
M	source/blender/nodes/NOD_static_types.h
M	source/blender/nodes/composite/CMakeLists.txt
A	source/blender/nodes/composite/nodes/node_composite_convert_color_space.cc

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

diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 142028e8d4d..cd67a41a701 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -542,6 +542,7 @@ compositor_node_categories = [
         NodeItem("CompositorNodeSepYCCA"),
         NodeItem("CompositorNodeCombYCCA"),
         NodeItem("CompositorNodeSwitchView"),
+        NodeItem("CompositorNodeConvertColorSpace"),
     ]),
     CompositorNodeCategory("CMP_OP_FILTER", "Filter", items=[
         NodeItem("CompositorNodeBlur"),
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index ed1b1397219..f58094bf77e 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1318,6 +1318,7 @@ void ntreeGPUMaterialNodes(struct bNodeTree *localtree,
 #define CMP_NODE_EXPOSURE 325
 #define CMP_NODE_CRYPTOMATTE 326
 #define CMP_NODE_POSTERIZE 327
+#define CMP_NODE_CONVERT_COLOR_SPACE 328
 
 /* channel toggles */
 #define CMP_CHAN_RGB 1
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 51fc7b99fce..c84d43b2a39 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -4582,6 +4582,7 @@ static void registerCompositNodes()
   register_node_type_cmp_denoise();
   register_node_type_cmp_antialiasing();
 
+  register_node_type_cmp_convert_color_space();
   register_node_type_cmp_valtorgb();
   register_node_type_cmp_rgbtobw();
   register_node_type_cmp_setalpha();
diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt
index 10e385e0187..f59fd885871 100644
--- a/source/blender/compositor/CMakeLists.txt
+++ b/source/blender/compositor/CMakeLists.txt
@@ -39,6 +39,7 @@ set(INC
   ../../../extern/clew/include
   ../../../intern/atomic
   ../../../intern/guardedalloc
+  ../../../intern/clog
 )
 
 set(INC_SYS
@@ -242,6 +243,8 @@ set(SRC
   nodes/COM_ColorToBWNode.h
   nodes/COM_ConvertAlphaNode.cc
   nodes/COM_ConvertAlphaNode.h
+  nodes/COM_ConvertColorSpaceNode.cc
+  nodes/COM_ConvertColorSpaceNode.h
   nodes/COM_GammaNode.cc
   nodes/COM_GammaNode.h
   nodes/COM_HueSaturationValueCorrectNode.cc
@@ -567,6 +570,8 @@ set(SRC
 
   operations/COM_DotproductOperation.cc
   operations/COM_DotproductOperation.h
+  operations/COM_ConvertColorSpaceOperation.cc
+  operations/COM_ConvertColorSpaceOperation.h
 
   # Matte operation
   operations/COM_BoxMaskOperation.cc
diff --git a/source/blender/compositor/intern/COM_Converter.cc b/source/blender/compositor/intern/COM_Converter.cc
index 0af4ff7d98d..1b98a04cf96 100644
--- a/source/blender/compositor/intern/COM_Converter.cc
+++ b/source/blender/compositor/intern/COM_Converter.cc
@@ -46,6 +46,7 @@
 #include "COM_CombineColorNode.h"
 #include "COM_CompositorNode.h"
 #include "COM_ConvertAlphaNode.h"
+#include "COM_ConvertColorSpaceNode.h"
 #include "COM_ConvertOperation.h"
 #include "COM_Converter.h"
 #include "COM_CornerPinNode.h"
@@ -426,6 +427,9 @@ Node *COM_convert_bnode(bNode *b_node)
     case CMP_NODE_POSTERIZE:
       node = new PosterizeNode(b_node);
       break;
+    case CMP_NODE_CONVERT_COLOR_SPACE:
+      node = new ConvertColorSpaceNode(b_node);
+      break;
   }
   return node;
 }
diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.cc b/source/blender/compositor/intern/COM_MemoryBuffer.cc
index ae925f796ee..dcc279e3b88 100644
--- a/source/blender/compositor/intern/COM_MemoryBuffer.cc
+++ b/source/blender/compositor/intern/COM_MemoryBuffer.cc
@@ -289,6 +289,23 @@ void MemoryBuffer::copy_from(const uchar *src,
   }
 }
 
+void MemoryBuffer::apply_processor(ColormanageProcessor &processor, const rcti area)
+{
+  const int width = BLI_rcti_size_x(&area);
+  const int height = BLI_rcti_size_y(&area);
+  float *out = get_elem(area.xmin, area.ymin);
+  /* If area allows continuous memory do conversion in one step. Otherwise per row. */
+  if (get_width() == width) {
+    IMB_colormanagement_processor_apply(&processor, out, width, height, get_num_channels(), false);
+  }
+  else {
+    for (int y = 0; y < height; y++) {
+      IMB_colormanagement_processor_apply(&processor, out, width, 1, get_num_channels(), false);
+      out += row_stride;
+    }
+  }
+}
+
 static void colorspace_to_scene_linear(MemoryBuffer *buf, const rcti &area, ColorSpace *colorspace)
 {
   const int width = BLI_rcti_size_x(&area);
diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.h b/source/blender/compositor/intern/COM_MemoryBuffer.h
index dd18a7403da..1765fb93035 100644
--- a/source/blender/compositor/intern/COM_MemoryBuffer.h
+++ b/source/blender/compositor/intern/COM_MemoryBuffer.h
@@ -26,6 +26,8 @@
 #include "BLI_math_interp.h"
 #include "BLI_rect.h"
 
+#include "IMB_colormanagement.h"
+
 struct ImBuf;
 
 namespace blender::compositor {
@@ -578,6 +580,11 @@ class MemoryBuffer {
     return state_ == MemoryBufferState::Temporary;
   }
 
+  /**
+   * \brief Apply a color processor on the given area.
+   */
+  void apply_processor(ColormanageProcessor &processor, const rcti area);
+
   void copy_from(const MemoryBuffer *src, const rcti &area);
   void copy_from(const MemoryBuffer *src, const rcti &area, int to_x, int to_y);
   void copy_from(const MemoryBuffer *src,
diff --git a/source/blender/compositor/nodes/COM_ConvertColorSpaceNode.cc b/source/blender/compositor/nodes/COM_ConvertColorSpaceNode.cc
new file mode 100644
index 00000000000..4e7bbefc22d
--- /dev/null
+++ b/source/blender/compositor/nodes/COM_ConvertColorSpaceNode.cc
@@ -0,0 +1,100 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2021, Blender Foundation.
+ */
+
+#include "COM_ConvertColorSpaceNode.h"
+
+#include "BKE_node.h"
+
+#include "BLI_utildefines.h"
+
+#include "COM_ConvertColorSpaceOperation.h"
+#include "COM_ConvertOperation.h"
+#include "COM_ExecutionSystem.h"
+#include "COM_ImageOperation.h"
+#include "COM_MultilayerImageOperation.h"
+
+#include "CLG_log.h"
+
+static CLG_LogRef LOG = {"compositor"};
+
+namespace blender::compositor {
+
+ConvertColorSpaceNode::ConvertColorSpaceNode(bNode *editorNode) : Node(editorNode)
+{
+  /* pass */
+}
+
+void ConvertColorSpaceNode::convert_to_operations(NodeConverter &converter,
+                                                  const CompositorContext &UNUSED(context)) const
+{
+  bNode *b_node = get_bnode();
+
+  NodeInput *inputSocketImage = this->get_input_socket(0);
+  NodeOutput *outputSocketImage = this->get_output_socket(0);
+
+  NodeConvertColorSpace *settings = static_cast<NodeConvertColorSpace *>(b_node->storage);
+
+  if (!performs_conversion(*settings)) {
+    converter.map_output_socket(get_output_socket(0),
+                                converter.add_input_proxy(get_input_socket(0), false));
+    return;
+  }
+
+  ConvertColorSpaceOperation *operation = new ConvertColorSpaceOperation();
+  operation->set_settings((NodeConvertColorSpace *)b_node->storage);
+  converter.add_operation(operation);
+
+  converter.map_input_socket(inputSocketImage, operation->get_input_socket(0));
+  converter.map_output_socket(outputSocketImage, operation->get_output_socket());
+}
+
+bool ConvertColorSpaceNode::performs_conversion(NodeConvertColorSpace &settings) const
+{
+  bNode *b_node = get_bnode();
+
+  if (IMB_colormanagement_space_name_is_data(settings.from_color_space)) {
+    CLOG_INFO(&LOG,
+              2,
+              "Color space conversion bypassed for node: %s. From color space is data: %s.",
+              b_node->name,
+              settings.from_color_space);
+    return false;
+  }
+
+  if (IMB_colormanagement_space_name_is_data(settings.to_color_space)) {
+    CLOG_INFO(&LOG,
+              2,
+              "Color space conversion bypassed for node: %s. To color space is data: %s.",
+              b_node->name,
+              settings.to_color_space);
+    return false;
+  }
+
+  if (STREQLEN(
+          settings.from_color_space, settings.to_color_space, sizeof(settings.from_color_space))) {
+    CLOG_INFO(&LOG,
+              2,
+              "Color space conversion bypassed for node: %s. To and from are the same: %s.",
+              b_node->name,
+              settings.from_color_space);
+    return false;
+  }
+  return true;
+}
+
+}  // namespace blender::compositor
diff --git a/source/blender/compositor/nodes/COM_ConvertColorSpaceNode.h b/source/blender/compositor/nodes/COM_ConvertColorSpaceNode.h
new file mode 100644
index 00000000000..b3460abea27
--- /dev/null
+++ b/source/blender/compositor/nodes/COM_ConvertColorSpaceNode.h
@@ -0,0 +1,46 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2021, Blender Foundation.
+ */
+
+#pragma once
+
+#include "COM_Node.h"
+#include "COM_defines.h"
+#include "DNA_image_types.h"
+#

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list