Revert "Fix part of T41406"
This reverts commit 7c7cb01aa5.
The smoothing weights will cause shifting in the image if not calculated
as they were in the branch. Solution for better performance will be to force-clip
kernel to a square of size two for projective painting.
This commit is contained in:
@@ -515,10 +515,10 @@ BlurKernel *paint_new_blur_kernel(Brush *br)
|
|||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
BlurKernel *kernel = MEM_mallocN(sizeof(BlurKernel), "blur kernel");
|
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;
|
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->side_squared = kernel->side * kernel->side;
|
||||||
kernel->wdata = MEM_mallocN(sizeof(float) * kernel->side_squared, "blur kernel data");
|
kernel->wdata = MEM_mallocN(sizeof(float) * kernel->side_squared, "blur kernel data");
|
||||||
kernel->pixel_len = pixel_len;
|
kernel->pixel_len = pixel_len;
|
||||||
@@ -531,19 +531,26 @@ BlurKernel *paint_new_blur_kernel(Brush *br)
|
|||||||
|
|
||||||
case KERNEL_GAUSSIAN:
|
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 */
|
/* make the necessary adjustment to the value for use in the normal distribution formula */
|
||||||
standard_dev = standard_dev * standard_dev * 2;
|
standard_dev = standard_dev * standard_dev * 2;
|
||||||
|
|
||||||
for (i = 0; i < kernel->side; i++) {
|
kernel->wdata[pixel_len + pixel_len * kernel->side] = 1.0;
|
||||||
for (j = 0; j < kernel->side; j++) {
|
/* 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 idist = pixel_len - i;
|
||||||
float jdist = pixel_len - j;
|
float jdist = pixel_len - j;
|
||||||
|
|
||||||
float value = exp((idist * idist + jdist * jdist) / standard_dev);
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -877,10 +877,8 @@ static void paint_2d_lift_soften(ImagePaintState *s, ImBuf *ibuf, ImBuf *ibufb,
|
|||||||
|
|
||||||
for (yk = 0; yk < kernel->side; yk++) {
|
for (yk = 0; yk < kernel->side; yk++) {
|
||||||
for (xk = 0; xk < kernel->side; xk++) {
|
for (xk = 0; xk < kernel->side; xk++) {
|
||||||
float x_offs = xk - kernel->pixel_len;
|
count += paint_2d_ibuf_add_if(ibuf, xi + xk - kernel->pixel_len,
|
||||||
float y_offs = yk - kernel->pixel_len;
|
yi + yk - kernel->pixel_len, outrgb, is_torus,
|
||||||
count += paint_2d_ibuf_add_if(ibuf, xi + signf(x_offs) * fabs(x_offs + 0.51f),
|
|
||||||
yi + signf(y_offs) * fabs(y_offs + 0.51f), outrgb, is_torus,
|
|
||||||
kernel->wdata[xk + yk * kernel->side]);
|
kernel->wdata[xk + yk * kernel->side]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3763,9 +3763,7 @@ static void do_projectpaint_soften_f(ProjPaintState *ps, ProjPixel *projPixel, f
|
|||||||
for (yk = 0; yk < kernel->side; yk++) {
|
for (yk = 0; yk < kernel->side; yk++) {
|
||||||
for (xk = 0; xk < kernel->side; xk++) {
|
for (xk = 0; xk < kernel->side; xk++) {
|
||||||
float rgba_tmp[4];
|
float rgba_tmp[4];
|
||||||
float x_offs = xk - kernel->pixel_len;
|
float co_ofs[2] = {xk - kernel->pixel_len, yk - kernel->pixel_len};
|
||||||
float y_offs = yk - kernel->pixel_len;
|
|
||||||
float co_ofs[2] = {x_offs, y_offs};
|
|
||||||
|
|
||||||
add_v2_v2(co_ofs, projPixel->projCoSS);
|
add_v2_v2(co_ofs, projPixel->projCoSS);
|
||||||
|
|
||||||
|
|||||||
@@ -288,7 +288,7 @@ typedef struct {
|
|||||||
float *wdata; /* actual kernel */
|
float *wdata; /* actual kernel */
|
||||||
int side; /* kernel side */
|
int side; /* kernel side */
|
||||||
int side_squared; /* data side */
|
int side_squared; /* data side */
|
||||||
float pixel_len; /* pixels around center that kernel is wide */
|
int pixel_len; /* pixels around center that kernel is wide */
|
||||||
} BlurKernel;
|
} BlurKernel;
|
||||||
|
|
||||||
enum BlurKernelType;
|
enum BlurKernelType;
|
||||||
|
|||||||
Reference in New Issue
Block a user