Blender
V4.3
source
blender
compositor
operations
COM_CropOperation.cc
Go to the documentation of this file.
1
/* SPDX-FileCopyrightText: 2011 Blender Authors
2
*
3
* SPDX-License-Identifier: GPL-2.0-or-later */
4
5
#include "
BLI_math_vector_types.hh
"
6
7
#include "
COM_CropOperation.h
"
8
9
namespace
blender::compositor
{
10
11
CropBaseOperation::CropBaseOperation
()
12
{
13
this->
add_input_socket
(
DataType::Color
,
ResizeMode::Align
);
14
this->
add_output_socket
(
DataType::Color
);
15
settings_
=
nullptr
;
16
flags_
.can_be_constant =
true
;
17
}
18
19
void
CropBaseOperation::update_area
()
20
{
21
const
NodeTwoXYs
&node_two_xys = *
settings_
;
22
const
SocketReader
*input = this->
get_input_socket_reader
(0);
23
const
int2
input_size =
int2
(input->
get_width
(), input->
get_height
());
24
if
(
relative_
) {
25
/* The cropping bounds are relative to the image size. The factors are in the [0, 1] range,
26
* so it is guaranteed that they won't go over the input image size. */
27
xmin_
= input_size.x * node_two_xys.
fac_x1
;
28
ymin_
= input_size.y * node_two_xys.
fac_y2
;
29
xmax_
= input_size.x * node_two_xys.
fac_x2
;
30
ymax_
= input_size.y * node_two_xys.
fac_y1
;
31
}
32
else
{
33
/* Make sure the bounds don't go over the input image size. */
34
xmin_
=
min_ii
(node_two_xys.
x1
, input_size.x);
35
ymin_
=
min_ii
(node_two_xys.
y2
, input_size.y);
36
xmax_
=
min_ii
(node_two_xys.
x2
, input_size.x);
37
ymax_
=
min_ii
(node_two_xys.
y1
, input_size.y);
38
}
39
40
/* Make sure upper bound is actually higher than the lower bound. */
41
xmin_
=
min_ii
(
xmin_
,
xmax_
);
42
ymin_
=
min_ii
(
ymin_
,
ymax_
);
43
xmax_
=
max_ii
(
xmin_
,
xmax_
);
44
ymax_
=
max_ii
(
ymin_
,
ymax_
);
45
}
46
47
void
CropBaseOperation::init_execution
()
48
{
49
update_area
();
50
}
51
52
CropOperation::CropOperation
() :
CropBaseOperation
()
53
{
54
/* pass */
55
}
56
57
void
CropOperation::update_memory_buffer_partial
(
MemoryBuffer
*
output
,
58
const
rcti
&area,
59
Span<MemoryBuffer *>
inputs
)
60
{
61
for
(
BuffersIterator<float>
it =
output
->iterate_with(
inputs
, area); !it.is_end(); ++it) {
62
if
((it.x <
xmax_
&& it.x >=
xmin_
) && (it.y <
ymax_
&& it.y >=
ymin_
)) {
63
copy_v4_v4
(it.out, it.in(0));
64
}
65
else
{
66
zero_v4
(it.out);
67
}
68
}
69
}
70
71
CropImageOperation::CropImageOperation
() :
CropBaseOperation
()
72
{
73
/* pass */
74
}
75
76
void
CropImageOperation::get_area_of_interest
(
const
int
input_idx,
77
const
rcti
&output_area,
78
rcti
&r_input_area)
79
{
80
BLI_assert
(input_idx == 0);
81
UNUSED_VARS_NDEBUG
(input_idx);
82
r_input_area.
xmax
= output_area.
xmax
+
xmin_
;
83
r_input_area.
xmin
= output_area.
xmin
+
xmin_
;
84
r_input_area.
ymax
= output_area.
ymax
+
ymin_
;
85
r_input_area.
ymin
= output_area.
ymin
+
ymin_
;
86
}
87
88
void
CropImageOperation::determine_canvas
(
const
rcti
&preferred_area,
rcti
&r_area)
89
{
90
NodeOperation::determine_canvas
(preferred_area, r_area);
91
update_area
();
92
r_area.
xmax
= r_area.
xmin
+ (
xmax_
-
xmin_
);
93
r_area.
ymax
= r_area.
ymin
+ (
ymax_
-
ymin_
);
94
}
95
96
void
CropImageOperation::update_memory_buffer_partial
(
MemoryBuffer
*
output
,
97
const
rcti
&area,
98
Span<MemoryBuffer *>
inputs
)
99
{
100
const
MemoryBuffer
*input =
inputs
[0];
101
const
int
width =
get_width
();
102
const
int
height =
get_height
();
103
for
(
BuffersIterator<float>
it =
output
->iterate_with({}, area); !it.is_end(); ++it) {
104
if
(it.x >= 0 && it.x < width && it.y >= 0 && it.y < height) {
105
input->
read_elem_checked
(it.x +
xmin_
, it.y +
ymin_
, it.out);
106
}
107
else
{
108
zero_v4
(it.out);
109
}
110
}
111
}
112
113
}
// namespace blender::compositor
BLI_assert
#define BLI_assert(a)
Definition
BLI_assert.h:50
min_ii
MINLINE int min_ii(int a, int b)
Definition
math_base_inline.c:449
max_ii
MINLINE int max_ii(int a, int b)
Definition
math_base_inline.c:453
copy_v4_v4
MINLINE void copy_v4_v4(float r[4], const float a[4])
Definition
math_vector_inline.c:57
zero_v4
MINLINE void zero_v4(float r[4])
Definition
math_vector_inline.c:29
BLI_math_vector_types.hh
UNUSED_VARS_NDEBUG
#define UNUSED_VARS_NDEBUG(...)
Definition
BLI_utildefines.h:537
COM_CropOperation.h
output
#define output
blender::Span
Definition
BLI_span.hh:75
blender::compositor::CropBaseOperation::ymax_
int ymax_
Definition
COM_CropOperation.h:17
blender::compositor::CropBaseOperation::settings_
NodeTwoXYs * settings_
Definition
COM_CropOperation.h:13
blender::compositor::CropBaseOperation::CropBaseOperation
CropBaseOperation()
Definition
COM_CropOperation.cc:11
blender::compositor::CropBaseOperation::ymin_
int ymin_
Definition
COM_CropOperation.h:18
blender::compositor::CropBaseOperation::xmax_
int xmax_
Definition
COM_CropOperation.h:15
blender::compositor::CropBaseOperation::xmin_
int xmin_
Definition
COM_CropOperation.h:16
blender::compositor::CropBaseOperation::update_area
void update_area()
Definition
COM_CropOperation.cc:19
blender::compositor::CropBaseOperation::init_execution
void init_execution() override
Definition
COM_CropOperation.cc:47
blender::compositor::CropBaseOperation::relative_
bool relative_
Definition
COM_CropOperation.h:14
blender::compositor::CropImageOperation::get_area_of_interest
void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override
Get input operation area being read by this operation on rendering given output area.
Definition
COM_CropOperation.cc:76
blender::compositor::CropImageOperation::CropImageOperation
CropImageOperation()
Definition
COM_CropOperation.cc:71
blender::compositor::CropImageOperation::update_memory_buffer_partial
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
Definition
COM_CropOperation.cc:96
blender::compositor::CropImageOperation::determine_canvas
void determine_canvas(const rcti &preferred_area, rcti &r_area) override
Definition
COM_CropOperation.cc:88
blender::compositor::CropOperation::CropOperation
CropOperation()
Definition
COM_CropOperation.cc:52
blender::compositor::CropOperation::update_memory_buffer_partial
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
Definition
COM_CropOperation.cc:57
blender::compositor::MemoryBuffer
a MemoryBuffer contains access to the data
Definition
COM_MemoryBuffer.h:35
blender::compositor::MemoryBuffer::read_elem_checked
void read_elem_checked(int x, int y, float *out) const
Definition
COM_MemoryBuffer.h:196
blender::compositor::NodeOperation::get_height
unsigned int get_height() const
Definition
COM_NodeOperation.h:465
blender::compositor::NodeOperation::add_output_socket
void add_output_socket(DataType datatype)
Definition
COM_NodeOperation.cc:102
blender::compositor::NodeOperation::get_input_socket_reader
SocketReader * get_input_socket_reader(unsigned int index)
Definition
COM_NodeOperation.cc:180
blender::compositor::NodeOperation::get_width
unsigned int get_width() const
Definition
COM_NodeOperation.h:460
blender::compositor::NodeOperation::flags_
NodeOperationFlags flags_
Definition
COM_NodeOperation.h:295
blender::compositor::NodeOperation::add_input_socket
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
Definition
COM_NodeOperation.cc:97
blender::compositor::NodeOperation::determine_canvas
virtual void determine_canvas(const rcti &preferred_area, rcti &r_area)
Definition
COM_NodeOperation.cc:107
blender::compositor::DataType::Color
@ Color
Color data type.
Definition
COM_defines.h:27
blender::compositor::ResizeMode::Align
@ Align
Definition
COM_NodeOperation.h:57
blender::compositor
Definition
COM_JumpFloodingAlgorithm.cc:20
blender::compositor::SocketReader
NodeOperation SocketReader
Definition
COM_NodeOperation.h:33
blender::compositor::BuffersIterator
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator
Definition
COM_BuffersIterator.h:179
blender::int2
VecBase< int32_t, 2 > int2
Definition
BLI_math_vector_types.hh:594
inputs
static blender::bke::bNodeSocketTemplate inputs[]
Definition
node_texture_at.cc:11
NodeTwoXYs
Definition
DNA_node_types.h:1179
NodeTwoXYs::y2
short y2
Definition
DNA_node_types.h:1180
NodeTwoXYs::x2
short x2
Definition
DNA_node_types.h:1180
NodeTwoXYs::fac_y2
float fac_y2
Definition
DNA_node_types.h:1181
NodeTwoXYs::y1
short y1
Definition
DNA_node_types.h:1180
NodeTwoXYs::fac_x1
float fac_x1
Definition
DNA_node_types.h:1181
NodeTwoXYs::fac_x2
float fac_x2
Definition
DNA_node_types.h:1181
NodeTwoXYs::fac_y1
float fac_y1
Definition
DNA_node_types.h:1181
NodeTwoXYs::x1
short x1
Definition
DNA_node_types.h:1180
rcti
Definition
DNA_vec_types.h:68
rcti::ymin
int ymin
Definition
DNA_vec_types.h:70
rcti::ymax
int ymax
Definition
DNA_vec_types.h:70
rcti::xmin
int xmin
Definition
DNA_vec_types.h:69
rcti::xmax
int xmax
Definition
DNA_vec_types.h:69
Generated on Sat Oct 4 2025 05:32:23 for Blender by
doxygen
1.14.0