49 if (
data->size_x == 0.0f &&
data->size_y == 0) {
65 dst +=
int64_t(start_line) * width * 4;
66 for (
int y = start_line;
y < start_line + height;
y++) {
67 for (
int x = 0;
x < width;
x++) {
69 float accum_weight = 0.0f;
72 int xmax =
math::min(
x + half_size, width - 1);
73 for (
int nx = xmin, index = (xmin -
x) + half_size; nx <= xmax; nx++, index++) {
74 float weight = gaussian[index];
75 int offset = (
y * width + nx) * 4;
76 accum +=
float4(rect + offset) * weight;
77 accum_weight += weight;
79 accum *= (1.0f / accum_weight);
87 dst[0] = accum[0] + 0.5f;
88 dst[1] = accum[1] + 0.5f;
89 dst[2] = accum[2] + 0.5f;
90 dst[3] = accum[3] + 0.5f;
107 dst +=
int64_t(start_line) * width * 4;
108 for (
int y = start_line;
y < start_line + height;
y++) {
109 for (
int x = 0;
x < width;
x++) {
111 float accum_weight = 0.0f;
113 int ymax =
math::min(
y + half_size, frame_height - 1);
114 for (
int ny = ymin, index = (ymin -
y) + half_size; ny <= ymax; ny++, index++) {
115 float weight = gaussian[index];
116 int offset = (ny * width +
x) * 4;
117 accum +=
float4(rect + offset) * weight;
118 accum_weight += weight;
120 accum *= (1.0f / accum_weight);
128 dst[0] = accum[0] + 0.5f;
129 dst[1] = accum[1] + 0.5f;
130 dst[2] = accum[2] + 0.5f;
131 dst[3] = accum[3] + 0.5f;
149 const int half_size_x = int(
data->size_x + 0.5f);
150 const int half_size_y = int(
data->size_y + 0.5f);
154 const int width = context->rectx;
155 const int height = context->recty;
161 const int y_first = y_range.first();
162 const int y_size = y_range.size();
164 gaussian_blur_x(gaussian_x,
170 ibuf1->float_buffer.data,
171 out->float_buffer.data);
174 gaussian_blur_x(gaussian_x,
180 ibuf1->byte_buffer.data,
181 out->byte_buffer.data);
189 const int y_first = y_range.first();
190 const int y_size = y_range.size();
192 gaussian_blur_y(gaussian_y,
198 ibuf1->float_buffer.data,
199 out->float_buffer.data);
202 gaussian_blur_y(gaussian_y,
208 ibuf1->byte_buffer.data,
209 out->byte_buffer.data);
void IMB_freeImBuf(ImBuf *ibuf)
BMesh const char void * data
void * MEM_callocN(size_t len, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
constexpr bool is_math_float_type
T min(const T &a, const T &b)
T max(const T &a, const T &b)
static void init_gaussian_blur_effect(Strip *strip)
void gaussian_blur_effect_get_handle(EffectHandle &rval)
static void free_gaussian_blur_effect(Strip *strip, const bool)
Array< float > make_gaussian_blur_kernel(float rad, int size)
ImBuf * prepare_effect_imbufs(const RenderData *context, ImBuf *ibuf1, ImBuf *ibuf2, bool uninitialized_pixels)
static void gaussian_blur_x(const Span< float > gaussian, int half_size, int start_line, int width, int height, int, const T *rect, T *dst)
static ImBuf * do_gaussian_blur_effect(const RenderData *context, Strip *strip, float, float, ImBuf *ibuf1, ImBuf *)
static StripEarlyOut early_out_gaussian_blur(const Strip *strip, float)
static int num_inputs_gaussian_blur()
static void gaussian_blur_y(const Span< float > gaussian, int half_size, int start_line, int width, int height, int frame_height, const T *rect, T *dst)
static void copy_gaussian_blur_effect(Strip *dst, const Strip *src, const int)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
VecBase< float, 4 > float4
ImBufFloatBuffer float_buffer
void(* copy)(Strip *dst, const Strip *src, int flag)
ImBuf *(* execute)(const RenderData *context, Strip *strip, float timeline_frame, float fac, ImBuf *ibuf1, ImBuf *ibuf2)
void(* free)(Strip *strip, bool do_id_user)
StripEarlyOut(* early_out)(const Strip *strip, float fac)
void(* init)(Strip *strip)