Blender V4.3
COM_BilateralBlurOperation.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
6
7namespace blender::compositor {
8
16
18 const rcti &output_area,
19 rcti &r_input_area)
20{
21 const int add = radius_ + 1;
22
23 r_input_area.xmax = output_area.xmax + (add);
24 r_input_area.xmin = output_area.xmin - (add);
25 r_input_area.ymax = output_area.ymax + (add);
26 r_input_area.ymin = output_area.ymin - (add);
27}
28
41
42static void blur_pixel(PixelCursor &p)
43{
44 float blur_divider = 0.0f;
45 zero_v4(p.out);
46
47 /* TODO(sergey): This isn't really good bilateral filter, it should be
48 * using gaussian bell for weights. Also sigma_color doesn't seem to be
49 * used correct at all.
50 */
51 for (int yi = -p.radius; yi <= p.radius; yi += p.step) {
52 for (int xi = -p.radius; xi <= p.radius; xi += p.step) {
54 /* Do not take the alpha channel into account. */
55 const float delta_color = (fabsf(p.determ_reference_color[0] - p.temp_color[0]) +
58 if (delta_color < p.sigma_color) {
59 /* Add this to the blur. */
60 p.input_color->read_elem_clamped(p.x + xi, p.y + yi, p.temp_color);
62 blur_divider += 1.0f;
63 }
64 }
65 }
66
67 if (blur_divider > 0.0f) {
68 mul_v4_fl(p.out, 1.0f / blur_divider);
69 }
70 else {
72 }
73}
74
76 const rcti &area,
78{
79 PixelCursor p = {};
80 p.step = 1;
81 p.sigma_color = data_->sigma_color;
82 p.radius = radius_;
83 p.input_color = inputs[0];
84 p.input_determinator = inputs[1];
85 for (int y = area.ymin; y < area.ymax; y++) {
86 p.out = output->get_elem(area.xmin, y);
87 p.y = y;
88 for (int x = area.xmin; x < area.xmax; x++) {
89 p.x = x;
90 /* This will be used as the reference color for the determinator. */
92 blur_pixel(p);
93 p.out += output->elem_stride;
94 }
95 }
96}
97
98} // namespace blender::compositor
MINLINE void mul_v4_fl(float r[4], float f)
MINLINE void add_v4_v4(float r[4], const float a[4])
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void zero_v4(float r[4])
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
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.
a MemoryBuffer contains access to the data
void read_elem_clamped(int x, int y, float *out) const
void add_output_socket(DataType datatype)
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
#define fabsf(x)
static void add(blender::Map< std::string, std::string > &messages, Message &msg)
Definition msgfmt.cc:227
static void blur_pixel(PixelCursor &p)
constexpr float COM_COLOR_BLACK[4]
Definition COM_defines.h:63
int ymin
int ymax
int xmin
int xmax