diff options
Diffstat (limited to 'source/blender/editors/sculpt_paint/paint_image.c')
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_image.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index 5a4fda033d8..e9e1615b27d 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -515,10 +515,10 @@ BlurKernel *paint_new_blur_kernel(Brush *br) { int i, j; BlurKernel *kernel = MEM_mallocN(sizeof(BlurKernel), "blur kernel"); - float pixel_len = br->blur_kernel_radius / 2.0f; + int pixel_len = br->blur_kernel_radius; BlurKernelType type = br->blur_mode; - kernel->side = br->blur_kernel_radius + 1; + kernel->side = pixel_len * 2 + 1; kernel->side_squared = kernel->side * kernel->side; kernel->wdata = MEM_mallocN(sizeof(float) * kernel->side_squared, "blur kernel data"); kernel->pixel_len = pixel_len; @@ -531,19 +531,26 @@ BlurKernel *paint_new_blur_kernel(Brush *br) case KERNEL_GAUSSIAN: { - float standard_dev = pixel_len / 3.0f; /* at standard deviation of 3.0 kernel is at about zero */ + float standard_dev = pixel_len / 3.0; /* at standard deviation of 3.0 kernel is at about zero */ + int i_term = pixel_len + 1; /* make the necessary adjustment to the value for use in the normal distribution formula */ standard_dev = standard_dev * standard_dev * 2; - for (i = 0; i < kernel->side; i++) { - for (j = 0; j < kernel->side; j++) { + kernel->wdata[pixel_len + pixel_len * kernel->side] = 1.0; + /* fill in all four quadrants at once */ + for (i = 0; i < i_term; i++) { + for (j = 0; j < pixel_len; j++) { float idist = pixel_len - i; float jdist = pixel_len - j; float value = exp((idist * idist + jdist * jdist) / standard_dev); - kernel->wdata[i + j * kernel->side] = value; + kernel->wdata[i + j * kernel->side] = + kernel->wdata[(kernel->side - j - 1) + i * kernel->side] = + kernel->wdata[(kernel->side - i - 1) + (kernel->side - j - 1) * kernel->side] = + kernel->wdata[j + (kernel->side - i - 1) * kernel->side] = + value; } } |