Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Castilla <manzanillawork@gmail.com>2021-09-30 22:35:32 +0300
committerManuel Castilla <manzanillawork@gmail.com>2021-10-01 00:56:53 +0300
commite2df5c8a56c06acde486d8a9094d41671ec09398 (patch)
tree44869a17c11a527796e120e21d8ba7dd3eff7777 /source/blender/compositor
parentf3274bfa70f0bb24e8f4d8cdd8393babddbf986c (diff)
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.
Diffstat (limited to 'source/blender/compositor')
-rw-r--r--source/blender/compositor/operations/COM_FlipOperation.cc28
-rw-r--r--source/blender/compositor/operations/COM_FlipOperation.h1
2 files changed, 25 insertions, 4 deletions
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,