[Bf-blender-cvs] [e2df5c8a56c] master: Compositor: Fix Flip node not flipping translation on Full Frame

Manuel Castilla noreply at git.blender.org
Fri Oct 1 00:10:47 CEST 2021


Commit: e2df5c8a56c06acde486d8a9094d41671ec09398
Author: Manuel Castilla
Date:   Thu Sep 30 21:35:32 2021 +0200
Branches: master
https://developer.blender.org/rBe2df5c8a56c06acde486d8a9094d41671ec09398

Compositor: Fix Flip node not flipping translation on Full Frame

To match tiled implementation, flip center should not be translated
when canvas has offset. Instead the canvas offset needs to be flipped.

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

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

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

diff --git a/source/blender/compositor/operations/COM_FlipOperation.cc b/source/blender/compositor/operations/COM_FlipOperation.cc
index c88fcaa7da2..2d8865e41e0 100644
--- a/source/blender/compositor/operations/COM_FlipOperation.cc
+++ b/source/blender/compositor/operations/COM_FlipOperation.cc
@@ -22,7 +22,7 @@ namespace blender::compositor {
 
 FlipOperation::FlipOperation()
 {
-  this->addInputSocket(DataType::Color);
+  this->addInputSocket(DataType::Color, ResizeMode::None);
   this->addOutputSocket(DataType::Color);
   this->set_canvas_input_index(0);
   this->m_inputOperation = nullptr;
@@ -75,6 +75,24 @@ bool FlipOperation::determineDependingAreaOfInterest(rcti *input,
   return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
 }
 
+void FlipOperation::determine_canvas(const rcti &preferred_area, rcti &r_area)
+{
+  NodeOperation::determine_canvas(preferred_area, r_area);
+  if (execution_model_ == eExecutionModel::FullFrame) {
+    rcti input_area = r_area;
+    if (m_flipX) {
+      const int width = BLI_rcti_size_x(&input_area) - 1;
+      r_area.xmax = (width - input_area.xmin) + 1;
+      r_area.xmin = (width - input_area.xmax) + 1;
+    }
+    if (m_flipY) {
+      const int height = BLI_rcti_size_y(&input_area) - 1;
+      r_area.ymax = (height - input_area.ymin) + 1;
+      r_area.ymin = (height - input_area.ymax) + 1;
+    }
+  }
+}
+
 void FlipOperation::get_area_of_interest(const int input_idx,
                                          const rcti &output_area,
                                          rcti &r_input_area)
@@ -84,7 +102,7 @@ void FlipOperation::get_area_of_interest(const int input_idx,
   if (this->m_flipX) {
     const int w = (int)this->getWidth() - 1;
     r_input_area.xmax = (w - output_area.xmin) + 1;
-    r_input_area.xmin = (w - output_area.xmax) - 1;
+    r_input_area.xmin = (w - output_area.xmax) + 1;
   }
   else {
     r_input_area.xmin = output_area.xmin;
@@ -93,7 +111,7 @@ void FlipOperation::get_area_of_interest(const int input_idx,
   if (this->m_flipY) {
     const int h = (int)this->getHeight() - 1;
     r_input_area.ymax = (h - output_area.ymin) + 1;
-    r_input_area.ymin = (h - output_area.ymax) - 1;
+    r_input_area.ymin = (h - output_area.ymax) + 1;
   }
   else {
     r_input_area.ymin = output_area.ymin;
@@ -106,10 +124,12 @@ void FlipOperation::update_memory_buffer_partial(MemoryBuffer *output,
                                                  Span<MemoryBuffer *> inputs)
 {
   const MemoryBuffer *input_img = inputs[0];
+  const int input_offset_x = input_img->get_rect().xmin;
+  const int input_offset_y = input_img->get_rect().ymin;
   for (BuffersIterator<float> it = output->iterate_with({}, area); !it.is_end(); ++it) {
     const int nx = this->m_flipX ? ((int)this->getWidth() - 1) - it.x : it.x;
     const int ny = this->m_flipY ? ((int)this->getHeight() - 1) - it.y : it.y;
-    input_img->read_elem(nx, ny, it.out);
+    input_img->read_elem(input_offset_x + nx, input_offset_y + ny, it.out);
   }
 }
 
diff --git a/source/blender/compositor/operations/COM_FlipOperation.h b/source/blender/compositor/operations/COM_FlipOperation.h
index dba7f82c341..963996a5b0d 100644
--- a/source/blender/compositor/operations/COM_FlipOperation.h
+++ b/source/blender/compositor/operations/COM_FlipOperation.h
@@ -46,6 +46,7 @@ class FlipOperation : public MultiThreadedOperation {
     this->m_flipY = flipY;
   }
 
+  void determine_canvas(const rcti &preferred_area, rcti &r_area) override;
   void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override;
   void update_memory_buffer_partial(MemoryBuffer *output,
                                     const rcti &area,



More information about the Bf-blender-cvs mailing list