Fix box blur symmetry & simplify code (#3631)

This commit is contained in:
Romash
2023-12-13 23:21:08 +03:00
committed by GitHub
parent 6083d2b9f3
commit 222f6f7877

View File

@@ -1959,29 +1959,24 @@ void ImageBlurGaussian(Image *image, int blurSize) {
float avgG = 0.0f; float avgG = 0.0f;
float avgB = 0.0f; float avgB = 0.0f;
float avgAlpha = 0.0f; float avgAlpha = 0.0f;
int convolutionSize = blurSize+1; int convolutionSize = blurSize;
for (int i = 0; i < blurSize+1; i++) for (int i = 0; i < blurSize; i++)
{ {
avgR += pixelsCopy1[row*image->width + i].x; avgR += pixelsCopy1[row*image->width + i].x;
avgG += pixelsCopy1[row*image->width + i].y; avgG += pixelsCopy1[row*image->width + i].y;
avgB += pixelsCopy1[row*image->width + i].z; avgB += pixelsCopy1[row*image->width + i].z;
avgAlpha += pixelsCopy1[row*image->width + i].w; avgAlpha += pixelsCopy1[row*image->width + i].w;
} }
pixelsCopy2[row*image->width].x = avgR/convolutionSize; for (int x = 0; x < image->width; x++)
pixelsCopy2[row*image->width].y = avgG/convolutionSize;
pixelsCopy2[row*image->width].z = avgB/convolutionSize;
pixelsCopy2[row*image->width].w = avgAlpha/convolutionSize;
for (int x = 1; x < image->width; x++)
{ {
if (x-blurSize >= 0) if (x-blurSize-1 >= 0)
{ {
avgR -= pixelsCopy1[row*image->width + x-blurSize].x; avgR -= pixelsCopy1[row*image->width + x-blurSize-1].x;
avgG -= pixelsCopy1[row*image->width + x-blurSize].y; avgG -= pixelsCopy1[row*image->width + x-blurSize-1].y;
avgB -= pixelsCopy1[row*image->width + x-blurSize].z; avgB -= pixelsCopy1[row*image->width + x-blurSize-1].z;
avgAlpha -= pixelsCopy1[row*image->width + x-blurSize].w; avgAlpha -= pixelsCopy1[row*image->width + x-blurSize-1].w;
convolutionSize--; convolutionSize--;
} }
@@ -1999,7 +1994,7 @@ void ImageBlurGaussian(Image *image, int blurSize) {
pixelsCopy2[row*image->width + x].z = avgB/convolutionSize; pixelsCopy2[row*image->width + x].z = avgB/convolutionSize;
pixelsCopy2[row*image->width + x].w = avgAlpha/convolutionSize; pixelsCopy2[row*image->width + x].w = avgAlpha/convolutionSize;
} }
} }
// Vertical motion blur // Vertical motion blur
for (int col = 0; col < image->width; col++) for (int col = 0; col < image->width; col++)
@@ -2008,9 +2003,9 @@ void ImageBlurGaussian(Image *image, int blurSize) {
float avgG = 0.0f; float avgG = 0.0f;
float avgB = 0.0f; float avgB = 0.0f;
float avgAlpha = 0.0f; float avgAlpha = 0.0f;
int convolutionSize = blurSize+1; int convolutionSize = blurSize;
for (int i = 0; i < blurSize+1; i++) for (int i = 0; i < blurSize; i++)
{ {
avgR += pixelsCopy2[i*image->width + col].x; avgR += pixelsCopy2[i*image->width + col].x;
avgG += pixelsCopy2[i*image->width + col].y; avgG += pixelsCopy2[i*image->width + col].y;
@@ -2018,19 +2013,14 @@ void ImageBlurGaussian(Image *image, int blurSize) {
avgAlpha += pixelsCopy2[i*image->width + col].w; avgAlpha += pixelsCopy2[i*image->width + col].w;
} }
pixelsCopy1[col].x = (unsigned char) (avgR/convolutionSize); for (int y = 0; y < image->height; y++)
pixelsCopy1[col].y = (unsigned char) (avgG/convolutionSize);
pixelsCopy1[col].z = (unsigned char) (avgB/convolutionSize);
pixelsCopy1[col].w = (unsigned char) (avgAlpha/convolutionSize);
for (int y = 1; y < image->height; y++)
{ {
if (y-blurSize >= 0) if (y-blurSize-1 >= 0)
{ {
avgR -= pixelsCopy2[(y-blurSize)*image->width + col].x; avgR -= pixelsCopy2[(y-blurSize-1)*image->width + col].x;
avgG -= pixelsCopy2[(y-blurSize)*image->width + col].y; avgG -= pixelsCopy2[(y-blurSize-1)*image->width + col].y;
avgB -= pixelsCopy2[(y-blurSize)*image->width + col].z; avgB -= pixelsCopy2[(y-blurSize-1)*image->width + col].z;
avgAlpha -= pixelsCopy2[(y-blurSize)*image->width + col].w; avgAlpha -= pixelsCopy2[(y-blurSize-1)*image->width + col].w;
convolutionSize--; convolutionSize--;
} }
if (y+blurSize < image->height) if (y+blurSize < image->height)