Blender  V3.3
COM_GaussianAlphaBlurBaseOperation.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2021 Blender Foundation. */
3 
5 
6 namespace blender::compositor {
7 
10 {
11  gausstab_ = nullptr;
12  filtersize_ = 0;
13  falloff_ = -1; /* Intentionally invalid, so we can detect uninitialized values. */
14  dimension_ = dim;
15 }
16 
18 {
21  rad_ = max_ff(size_ * this->get_blur_size(dimension_), 0.0f);
24  }
25 }
26 
28 {
33  }
34 }
35 
37 {
39 
40  if (gausstab_) {
42  gausstab_ = nullptr;
43  }
44 
45  if (distbuf_inv_) {
47  distbuf_inv_ = nullptr;
48  }
49 }
50 
52  const rcti &output_area,
53  rcti &r_input_area)
54 {
55  if (input_idx != IMAGE_INPUT_INDEX) {
56  BlurBaseOperation::get_area_of_interest(input_idx, output_area, r_input_area);
57  return;
58  }
59 
60  r_input_area = output_area;
61  switch (dimension_) {
62  case eDimension::X:
63  r_input_area.xmin = output_area.xmin - filtersize_ - 1;
64  r_input_area.xmax = output_area.xmax + filtersize_ + 1;
65  break;
66  case eDimension::Y:
67  r_input_area.ymin = output_area.ymin - filtersize_ - 1;
68  r_input_area.ymax = output_area.ymax + filtersize_ + 1;
69  break;
70  }
71 }
72 
74  const rcti &area,
76 {
78  const rcti &input_rect = input->get_rect();
79  BuffersIterator<float> it = output->iterate_with({input}, area);
80 
81  int min_input_coord = -1;
82  int max_input_coord = -1;
83  int elem_stride = -1;
84  std::function<int()> get_current_coord;
85  switch (dimension_) {
86  case eDimension::X:
87  min_input_coord = input_rect.xmin;
88  max_input_coord = input_rect.xmax;
89  get_current_coord = [&] { return it.x; };
90  elem_stride = input->elem_stride;
91  break;
92  case eDimension::Y:
93  min_input_coord = input_rect.ymin;
94  max_input_coord = input_rect.ymax;
95  get_current_coord = [&] { return it.y; };
96  elem_stride = input->row_stride;
97  break;
98  }
99 
100  for (; !it.is_end(); ++it) {
101  const int coord = get_current_coord();
102  const int coord_min = max_ii(coord - filtersize_, min_input_coord);
103  const int coord_max = min_ii(coord + filtersize_ + 1, max_input_coord);
104 
105  /* *** This is the main part which is different to #GaussianBlurBaseOperation. *** */
106  /* Gauss. */
107  float alpha_accum = 0.0f;
108  float multiplier_accum = 0.0f;
109 
110  /* Dilate. */
111  const bool do_invert = do_subtract_;
112  /* Init with the current color to avoid unneeded lookups. */
113  float value_max = finv_test(*it.in(0), do_invert);
114  float distfacinv_max = 1.0f; /* 0 to 1 */
115 
116  const int step = QualityStepHelper::get_step();
117  const float *in = it.in(0) + ((intptr_t)coord_min - coord) * elem_stride;
118  const int in_stride = elem_stride * step;
119  int index = (coord_min - coord) + filtersize_;
120  const int index_end = index + (coord_max - coord_min);
121  for (; index < index_end; in += in_stride, index += step) {
122  float value = finv_test(*in, do_invert);
123 
124  /* Gauss. */
125  float multiplier = gausstab_[index];
126  alpha_accum += value * multiplier;
127  multiplier_accum += multiplier;
128 
129  /* Dilate - find most extreme color. */
130  if (value > value_max) {
131  multiplier = distbuf_inv_[index];
132  value *= multiplier;
133  if (value > value_max) {
134  value_max = value;
135  distfacinv_max = multiplier;
136  }
137  }
138  }
139 
140  /* Blend between the max value and gauss blue - gives nice feather. */
141  const float value_blur = alpha_accum / multiplier_accum;
142  const float value_final = (value_max * distfacinv_max) +
143  (value_blur * (1.0f - distfacinv_max));
144  *it.out = finv_test(value_final, do_invert);
145  }
146 }
147 
148 } // namespace blender::compositor
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
#define MAX_GAUSSTAB_RADIUS
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to used to fine tune the interpolation of the input Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert a producing a negative Combine Generate a color from its and blue Hue Saturation Value
float * make_gausstab(float rad, int size)
virtual 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.
float * make_dist_fac_inverse(float rad, int size, int falloff)
BLI_INLINE float finv_test(const float f, const bool test)
void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) final
Get input operation area being read by this operation on rendering given output area.
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) final
a MemoryBuffer contains access to the data of a chunk
DataType
possible data types for sockets
Definition: COM_defines.h:30
ccl_global KernelShaderEvalInput ccl_global float * output
ccl_global KernelShaderEvalInput * input
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
ccl_device_inline float3 ceil(const float3 &a)
Definition: math_float3.h:363
static void area(int d1, int d2, int e1, int e2, float weights[2])
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator
static bNodeSocketTemplate inputs[]
_W64 int intptr_t
Definition: stdint.h:118
int ymin
Definition: DNA_vec_types.h:64
int ymax
Definition: DNA_vec_types.h:64
int xmin
Definition: DNA_vec_types.h:63
int xmax
Definition: DNA_vec_types.h:63