Compositor: make Flip node works in local space

This patch changes the operation space of the Flip node from the global
space to the local space. This means that the Flip node will now flip
the image without changing its location.
This commit is contained in:
Omar Emara
2024-01-24 11:08:41 +02:00
parent 03828a47f4
commit 70a8a9e4d9
2 changed files with 0 additions and 77 deletions
@@ -34,78 +34,6 @@ void FlipOperation::execute_pixel_sampled(float output[4], float x, float y, Pix
input_operation_->read_sampled(output, nx, ny, sampler);
}
bool FlipOperation::determine_depending_area_of_interest(rcti *input,
ReadBufferOperation *read_operation,
rcti *output)
{
rcti new_input;
if (flip_x_) {
const int w = int(this->get_width()) - 1;
new_input.xmax = (w - input->xmin) + 1;
new_input.xmin = (w - input->xmax) - 1;
}
else {
new_input.xmin = input->xmin;
new_input.xmax = input->xmax;
}
if (flip_y_) {
const int h = int(this->get_height()) - 1;
new_input.ymax = (h - input->ymin) + 1;
new_input.ymin = (h - input->ymax) - 1;
}
else {
new_input.ymin = input->ymin;
new_input.ymax = input->ymax;
}
return NodeOperation::determine_depending_area_of_interest(&new_input, read_operation, 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 (flip_x_) {
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 (flip_y_) {
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)
{
BLI_assert(input_idx == 0);
UNUSED_VARS_NDEBUG(input_idx);
if (flip_x_) {
const int w = int(this->get_width()) - 1;
r_input_area.xmax = (w - output_area.xmin) + 1;
r_input_area.xmin = (w - output_area.xmax) + 1;
}
else {
r_input_area.xmin = output_area.xmin;
r_input_area.xmax = output_area.xmax;
}
if (flip_y_) {
const int h = int(this->get_height()) - 1;
r_input_area.ymax = (h - output_area.ymin) + 1;
r_input_area.ymin = (h - output_area.ymax) + 1;
}
else {
r_input_area.ymin = output_area.ymin;
r_input_area.ymax = output_area.ymax;
}
}
void FlipOperation::update_memory_buffer_partial(MemoryBuffer *output,
const rcti &area,
Span<MemoryBuffer *> inputs)
@@ -16,9 +16,6 @@ class FlipOperation : public MultiThreadedOperation {
public:
FlipOperation();
bool determine_depending_area_of_interest(rcti *input,
ReadBufferOperation *read_operation,
rcti *output) override;
void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override;
void init_execution() override;
@@ -32,8 +29,6 @@ class FlipOperation : public MultiThreadedOperation {
flip_y_ = 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,
Span<MemoryBuffer *> inputs) override;