Fix bug at right border in new boxblur function, #5456

This commit is contained in:
Ingo Weyrich 2019-09-19 22:21:45 +02:00
parent 3981e285b9
commit 7d5ec6c067

View File

@ -26,6 +26,7 @@
#include "alignedbuffer.h" #include "alignedbuffer.h"
#include "rt_math.h" #include "rt_math.h"
#include "opthelper.h" #include "opthelper.h"
#include "StopWatch.h"
namespace rtengine namespace rtengine
@ -485,41 +486,42 @@ inline void boxblur (float** src, float** dst, int radius, int W, int H, bool mu
#endif #endif
{ {
const int remaining = W % numCols; const int remaining = W % numCols;
if (remaining > 0) { if (remaining > 0) {
float (* const rowBuffer)[8] = (float(*)[8]) buffer; float (* const rowBuffer)[8] = (float(*)[8]) buffer;
const int col = W - remaining; const int col = W - remaining;
float len = radius + 1; float len = radius + 1;
for(int k = 0; k < remaining; k++) { for(int k = 0; k < remaining; ++k) {
rowBuffer[0][k] = dst[0][col + k]; rowBuffer[0][k] = dst[0][col + k];
} }
for (int i = 1; i <= radius; i++) { for (int row = 1; row <= radius; ++row) {
for(int k = 0; k < remaining; k++) { for(int k = 0; k < remaining; ++k) {
dst[0][col + k] += dst[i][col + k]; dst[0][col + k] += dst[row][col + k];
} }
} }
for(int k = 0; k < remaining; k++) { for(int k = 0; k < remaining; ++k) {
dst[0][col + k] /= len; dst[0][col + k] /= len;
} }
for (int row = 1; row <= radius; row++) { for (int row = 1; row <= radius; ++row) {
for(int k = 0; k < remaining; k++) { for(int k = 0; k < remaining; ++k) {
rowBuffer[row][k] = dst[row][col + k]; rowBuffer[row][k] = dst[row][col + k];
dst[row][col + k] = (dst[(row - 1)][col + k] * len + dst[row + radius][col + k]) / (len + 1); dst[row][col + k] = (dst[row - 1][col + k] * len + dst[row + radius][col + k]) / (len + 1);
len ++;
} }
len ++;
} }
const float rlen = 1.f / len; const float rlen = 1.f / len;
for (int row = radius + 1; row < H - radius; row++) { for (int row = radius + 1; row < H - radius; ++row) {
for(int k = 0; k < remaining; k++) { for(int k = 0; k < remaining; ++k) {
rowBuffer[row][k] = dst[row][col + k]; rowBuffer[row][k] = dst[row][col + k];
dst[row][col + k] = dst[(row - 1)][col + k] + (dst[row + radius][col + k] - rowBuffer[row - radius - 1][k]) * rlen; dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - rowBuffer[row - radius - 1][k]) * rlen;
} }
} }
for (int row = H - radius; row < H; row++) { for (int row = H - radius; row < H; ++row) {
for(int k = 0; k < remaining; k++) { for(int k = 0; k < remaining; ++k) {
dst[row][col + k] = (dst[(row - 1)][col + k] * len - rowBuffer[row - radius - 1][k]) / (len - 1); dst[row][col + k] = (dst[(row - 1)][col + k] * len - rowBuffer[row - radius - 1][k]) / (len - 1);
len --;
} }
len --;
} }
} }
} }