52 if (
data->size_x == 0.0f &&
data->size_y == 0) {
68 dst +=
int64_t(start_line) * width * 4;
69 for (
int y = start_line;
y < start_line + height;
y++) {
70 for (
int x = 0;
x < width;
x++) {
72 float accum_weight = 0.0f;
75 int xmax =
math::min(
x + half_size, width - 1);
76 for (
int nx = xmin, index = (xmin -
x) + half_size; nx <= xmax; nx++, index++) {
77 float weight = gaussian[index];
78 int offset = (
y * width + nx) * 4;
79 accum +=
float4(rect + offset) * weight;
80 accum_weight += weight;
82 accum *= (1.0f / accum_weight);
90 dst[0] = accum[0] + 0.5f;
91 dst[1] = accum[1] + 0.5f;
92 dst[2] = accum[2] + 0.5f;
93 dst[3] = accum[3] + 0.5f;
110 dst +=
int64_t(start_line) * width * 4;
111 for (
int y = start_line;
y < start_line + height;
y++) {
112 for (
int x = 0;
x < width;
x++) {
114 float accum_weight = 0.0f;
116 int ymax =
math::min(
y + half_size, frame_height - 1);
117 for (
int ny = ymin, index = (ymin -
y) + half_size; ny <= ymax; ny++, index++) {
118 float weight = gaussian[index];
119 int offset = (ny * width +
x) * 4;
120 accum +=
float4(rect + offset) * weight;
121 accum_weight += weight;
123 accum *= (1.0f / accum_weight);
131 dst[0] = accum[0] + 0.5f;
132 dst[1] = accum[1] + 0.5f;
133 dst[2] = accum[2] + 0.5f;
134 dst[3] = accum[3] + 0.5f;
155 const float size_x =
data->size_x * size_scale;
156 const float size_y =
data->size_y * size_scale;
158 const int half_size_x = int(size_x + 0.5f);
159 const int half_size_y = int(size_y + 0.5f);
163 const int width = context->rectx;
164 const int height = context->recty;
170 const int y_first = y_range.first();
171 const int y_size = y_range.size();
173 gaussian_blur_x(gaussian_x,
179 ibuf1->float_buffer.data,
180 out->float_buffer.data);
183 gaussian_blur_x(gaussian_x,
189 ibuf1->byte_buffer.data,
190 out->byte_buffer.data);
198 const int y_first = y_range.first();
199 const int y_size = y_range.size();
201 gaussian_blur_y(gaussian_y,
207 ibuf1->float_buffer.data,
208 out->float_buffer.data);
211 gaussian_blur_y(gaussian_y,
217 ibuf1->byte_buffer.data,
218 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)
float get_render_scale_factor(eSpaceSeq_Proxy_RenderSize render_size, short scene_render_scale)
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, SeqRenderState *, 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, SeqRenderState *state, 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)