diff options
Diffstat (limited to 'source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp')
-rw-r--r-- | source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp | 38 |
1 files changed, 17 insertions, 21 deletions
diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp index 648ca0965c8..127417bf701 100644 --- a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp @@ -31,7 +31,7 @@ extern "C" { GaussianXBlurOperation::GaussianXBlurOperation() : BlurBaseOperation(COM_DT_COLOR) { this->m_gausstab = NULL; - this->m_rad = 0; + this->m_filtersize = 0; } void *GaussianXBlurOperation::initializeTileData(rcti *rect) @@ -52,11 +52,10 @@ void GaussianXBlurOperation::initExecution() initMutex(); if (this->m_sizeavailable) { - float rad = this->m_size * this->m_data->sizex; - CLAMP(rad, 1.0f, MAX_GAUSSTAB_RADIUS); - - this->m_rad = rad; - this->m_gausstab = BlurBaseOperation::make_gausstab(rad); + float rad = max_ff(m_size * m_data->sizex, 0.0f); + m_filtersize = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); + + this->m_gausstab = BlurBaseOperation::make_gausstab(rad, m_filtersize); } } @@ -64,11 +63,10 @@ void GaussianXBlurOperation::updateGauss() { if (this->m_gausstab == NULL) { updateSize(); - float rad = this->m_size * this->m_data->sizex; - CLAMP(rad, 1.0f, MAX_GAUSSTAB_RADIUS); - - this->m_rad = rad; - this->m_gausstab = BlurBaseOperation::make_gausstab(rad); + float rad = max_ff(m_size * m_data->sizex, 0.0f); + m_filtersize = min_ii(ceil(rad), MAX_GAUSSTAB_RADIUS); + + this->m_gausstab = BlurBaseOperation::make_gausstab(rad, m_filtersize); } } @@ -82,17 +80,15 @@ void GaussianXBlurOperation::executePixel(float output[4], int x, int y, void *d int bufferstartx = inputBuffer->getRect()->xmin; int bufferstarty = inputBuffer->getRect()->ymin; - int miny = y; - int minx = x - this->m_rad; - int maxx = x + this->m_rad; - miny = max(miny, inputBuffer->getRect()->ymin); - minx = max(minx, inputBuffer->getRect()->xmin); - maxx = min(maxx, inputBuffer->getRect()->xmax - 1); + rcti &rect = *inputBuffer->getRect(); + int xmin = max_ii(x - m_filtersize, rect.xmin); + int xmax = min_ii(x + m_filtersize + 1, rect.xmax); + int ymin = max_ii(y, rect.ymin); int step = getStep(); int offsetadd = getOffsetAdd(); - int bufferindex = ((minx - bufferstartx) * 4) + ((miny - bufferstarty) * 4 * bufferwidth); - for (int nx = minx, index = (minx - x) + this->m_rad; nx <= maxx; nx += step, index += step) { + int bufferindex = ((xmin - bufferstartx) * 4) + ((ymin - bufferstarty) * 4 * bufferwidth); + for (int nx = xmin, index = (xmin - x) + this->m_filtersize; nx < xmax; nx += step, index += step) { const float multiplier = this->m_gausstab[index]; madd_v4_v4fl(color_accum, &buffer[bufferindex], multiplier); multiplier_accum += multiplier; @@ -129,8 +125,8 @@ bool GaussianXBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadB } { if (this->m_sizeavailable && this->m_gausstab != NULL) { - newInput.xmax = input->xmax + this->m_rad + 1; - newInput.xmin = input->xmin - this->m_rad - 1; + newInput.xmax = input->xmax + this->m_filtersize + 1; + newInput.xmin = input->xmin - this->m_filtersize - 1; newInput.ymax = input->ymax; newInput.ymin = input->ymin; } |