From 7fed213ba40d6f36282b09245ea459b22d4f6c5b Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sat, 19 Mar 2022 00:36:07 +0100 Subject: Revert "Compositor: Support backdrop offset for the Viewer node" This reverts commit 33409f9f1cd42e899f2706fe7878e5e89b50d617, as it breaks panning in the image editor. Fixes T96543 --- .../compositor/operations/COM_ViewerOperation.cc | 46 +++++++++++++++------- .../compositor/operations/COM_ViewerOperation.h | 3 ++ 2 files changed, 35 insertions(+), 14 deletions(-) (limited to 'source/blender/compositor') diff --git a/source/blender/compositor/operations/COM_ViewerOperation.cc b/source/blender/compositor/operations/COM_ViewerOperation.cc index 7f0eaecfff7..bc7e08ee98a 100644 --- a/source/blender/compositor/operations/COM_ViewerOperation.cc +++ b/source/blender/compositor/operations/COM_ViewerOperation.cc @@ -10,10 +10,10 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" -#include "DNA_node_types.h" - namespace blender::compositor { +static int MAX_VIEWER_TRANSLATION_PADDING = 12000; + ViewerOperation::ViewerOperation() { this->set_image(nullptr); @@ -137,12 +137,23 @@ void ViewerOperation::init_image() return; } - if (ibuf->x != get_width() || ibuf->y != get_height()) { + int padding_x = abs(canvas_.xmin) * 2; + int padding_y = abs(canvas_.ymin) * 2; + if (padding_x > MAX_VIEWER_TRANSLATION_PADDING) { + padding_x = MAX_VIEWER_TRANSLATION_PADDING; + } + if (padding_y > MAX_VIEWER_TRANSLATION_PADDING) { + padding_y = MAX_VIEWER_TRANSLATION_PADDING; + } + + display_width_ = get_width() + padding_x; + display_height_ = get_height() + padding_y; + if (ibuf->x != display_width_ || ibuf->y != display_height_) { imb_freerectImBuf(ibuf); imb_freerectfloatImBuf(ibuf); IMB_freezbuffloatImBuf(ibuf); - ibuf->x = get_width(); - ibuf->y = get_height(); + ibuf->x = display_width_; + ibuf->y = display_height_; /* zero size can happen if no image buffers exist to define a sensible resolution */ if (ibuf->x > 0 && ibuf->y > 0) { imb_addrectfloatImBuf(ibuf); @@ -176,13 +187,11 @@ void ViewerOperation::update_image(const rcti *rect) return; } - image_->display_offset_x = canvas_.xmin; - image_->display_offset_y = canvas_.ymin; float *buffer = output_buffer_; IMB_partial_display_buffer_update(ibuf_, buffer, nullptr, - get_width(), + display_width_, 0, 0, view_settings_, @@ -215,23 +224,32 @@ void ViewerOperation::update_memory_buffer_partial(MemoryBuffer *UNUSED(output), return; } + const int offset_x = area.xmin + (canvas_.xmin > 0 ? canvas_.xmin * 2 : 0); + const int offset_y = area.ymin + (canvas_.ymin > 0 ? canvas_.ymin * 2 : 0); MemoryBuffer output_buffer( - output_buffer_, COM_DATA_TYPE_COLOR_CHANNELS, get_width(), get_height()); + output_buffer_, COM_DATA_TYPE_COLOR_CHANNELS, display_width_, display_height_); const MemoryBuffer *input_image = inputs[0]; - output_buffer.copy_from(input_image, area); + output_buffer.copy_from(input_image, area, offset_x, offset_y); if (use_alpha_input_) { const MemoryBuffer *input_alpha = inputs[1]; - output_buffer.copy_from(input_alpha, area, 0, COM_DATA_TYPE_VALUE_CHANNELS, 3); + output_buffer.copy_from( + input_alpha, area, 0, COM_DATA_TYPE_VALUE_CHANNELS, offset_x, offset_y, 3); } if (depth_buffer_) { MemoryBuffer depth_buffer( - depth_buffer_, COM_DATA_TYPE_VALUE_CHANNELS, get_width(), get_height()); + depth_buffer_, COM_DATA_TYPE_VALUE_CHANNELS, display_width_, display_height_); const MemoryBuffer *input_depth = inputs[2]; - depth_buffer.copy_from(input_depth, area); + depth_buffer.copy_from(input_depth, area, offset_x, offset_y); } - update_image(&area); + rcti display_area; + BLI_rcti_init(&display_area, + offset_x, + offset_x + BLI_rcti_size_x(&area), + offset_y, + offset_y + BLI_rcti_size_y(&area)); + update_image(&display_area); } void ViewerOperation::clear_display_buffer() diff --git a/source/blender/compositor/operations/COM_ViewerOperation.h b/source/blender/compositor/operations/COM_ViewerOperation.h index ed9e5871eae..1ad6cc51269 100644 --- a/source/blender/compositor/operations/COM_ViewerOperation.h +++ b/source/blender/compositor/operations/COM_ViewerOperation.h @@ -35,6 +35,9 @@ class ViewerOperation : public MultiThreadedOperation { SocketReader *alpha_input_; SocketReader *depth_input_; + int display_width_; + int display_height_; + public: ViewerOperation(); void init_execution() override; -- cgit v1.2.3