283 const int num_iterations,
284 const float compare_min_value)
286 TCompareSelector selector;
288 const int width = output->get_width();
289 const int height = output->get_height();
291 const int half_window = num_iterations;
292 const int window = half_window * 2 + 1;
294 const int xmin = std::max(0, area.xmin - half_window);
295 const int ymin = std::max(0, area.ymin - half_window);
296 const int xmax = std::min(width, area.xmax + half_window);
297 const int ymax = std::min(height, area.ymax + half_window);
299 const int bwidth = area.xmax - area.xmin;
300 const int bheight = area.ymax - area.ymin;
312 float *temp = (
float *)
MEM_mallocN(
sizeof(
float) * (2 * window - 1),
"dilate erode temp");
313 float *buf = (
float *)
MEM_mallocN(
sizeof(
float) * (std::max(bwidth, bheight) + 5 * half_window),
318 for (
int y = ymin; y < ymax; y++) {
319 for (
int x = 0; x < bwidth + 5 * half_window; x++) {
320 buf[
x] = compare_min_value;
322 for (
int x = xmin; x < xmax; x++) {
323 buf[x - area.xmin + window - 1] = input->get_value(x, y, 0);
326 for (
int i = 0; i < (bwidth + 3 * half_window) / window; i++) {
327 int start = (i + 1) * window - 1;
329 temp[window - 1] = buf[start];
330 for (
int x = 1; x < window; x++) {
331 temp[window - 1 -
x] = selector(temp[window - x], buf[start - x]);
332 temp[window - 1 +
x] = selector(temp[window + x - 2], buf[start + x]);
335 start = half_window + (i - 1) * window + 1;
336 for (
int x = -std::min(0, start); x < window - std::max(0, start + window - bwidth); x++) {
337 result.get_value(start + x + area.xmin, y, 0) = selector(temp[x], temp[x + window - 1]);
343 for (
int x = 0; x < bwidth; x++) {
344 for (
int y = 0; y < bheight + 5 * half_window; y++) {
345 buf[
y] = compare_min_value;
347 for (
int y = ymin; y < ymax; y++) {
348 buf[y - area.ymin + window - 1] = result.get_value(x + area.xmin, y, 0);
351 for (
int i = 0; i < (bheight + 3 * half_window) / window; i++) {
352 int start = (i + 1) * window - 1;
354 temp[window - 1] = buf[start];
355 for (
int y = 1; y < window; y++) {
356 temp[window - 1 -
y] = selector(temp[window - y], buf[start - y]);
357 temp[window - 1 +
y] = selector(temp[window + y - 2], buf[start + y]);
360 start = half_window + (i - 1) * window + 1;
361 for (
int y = -std::min(0, start); y < window - std::max(0, start + window - bheight); y++) {
362 result.get_value(x + area.xmin, y + start + area.ymin, 0) = selector(temp[y],
363 temp[y + window - 1]);
371 output->copy_from(&result, area);