Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/compositor/COM_defines.h9
-rw-r--r--source/blender/compositor/nodes/COM_BlurNode.cpp1
-rw-r--r--source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp121
-rw-r--r--source/blender/compositor/operations/COM_FastGaussianBlurOperation.h7
4 files changed, 14 insertions, 124 deletions
diff --git a/source/blender/compositor/COM_defines.h b/source/blender/compositor/COM_defines.h
index d086f81d03c..b60fffc6a22 100644
--- a/source/blender/compositor/COM_defines.h
+++ b/source/blender/compositor/COM_defines.h
@@ -109,13 +109,4 @@ typedef enum OrderOfChunks {
#define COM_BLUR_BOKEH_PIXELS 512
-/**
- * The fast gaussien blur is not an accurate blur.
- * This setting can be used to increase/decrease the
- * amount of the input data. (dependent area of interest)
- *
- * Fix for: T39307
- */
-#define COM_FAST_GAUSSIAN_MULTIPLIER 3
-
#endif /* __COM_DEFINES_H__ */
diff --git a/source/blender/compositor/nodes/COM_BlurNode.cpp b/source/blender/compositor/nodes/COM_BlurNode.cpp
index b8421dcb102..76e52c14685 100644
--- a/source/blender/compositor/nodes/COM_BlurNode.cpp
+++ b/source/blender/compositor/nodes/COM_BlurNode.cpp
@@ -53,7 +53,6 @@ void BlurNode::convertToOperations(NodeConverter &converter, const CompositorCon
if (data->filtertype == R_FILTER_FAST_GAUSS) {
FastGaussianBlurOperation *operationfgb = new FastGaussianBlurOperation();
operationfgb->setData(data);
- operationfgb->setChunksize(context.getChunksize());
converter.addOperation(operationfgb);
converter.mapInputSocket(getInputSocket(1), operationfgb->getInputSocket(1));
diff --git a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp
index 9d96ebbb33f..705a8c07381 100644
--- a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp
+++ b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp
@@ -29,7 +29,6 @@
FastGaussianBlurOperation::FastGaussianBlurOperation() : BlurBaseOperation(COM_DT_COLOR)
{
this->m_iirgaus = NULL;
- this->m_chunksize = 256;
}
void FastGaussianBlurOperation::executePixel(float output[4], int x, int y, void *data)
@@ -38,57 +37,22 @@ void FastGaussianBlurOperation::executePixel(float output[4], int x, int y, void
newData->read(output, x, y);
}
-// Calculate the depending area of interest. This depends on the
-// size of the blur operation; if the blur is large it is faster
-// to just calculate the whole image at once.
-// Returns true if the area is just a tile and false if it is
-// the whole image.
-bool FastGaussianBlurOperation::getDAI(rcti *rect, rcti *output)
-{
- // m_data.sizex * m_size should be enough? For some reason there
- // seem to be errors in the boundary between tiles.
- float size = this->m_size * COM_FAST_GAUSSIAN_MULTIPLIER;
- int sx = this->m_data.sizex * size;
- if (sx < 1)
- sx = 1;
- int sy = this->m_data.sizey * size;
- if (sy < 1)
- sy = 1;
-
- if (sx >= this->m_chunksize || sy >= this->m_chunksize) {
- output->xmin = 0;
- output->xmax = this->getWidth();
- output->ymin = 0;
- output->ymax = this->getHeight();
- return false;
- }
- else {
- output->xmin = rect->xmin - sx - 1;
- output->xmax = rect->xmax + sx + 1;
- output->ymin = rect->ymin - sy - 1;
- output->ymax = rect->ymax + sy + 1;
- return true;
- }
-}
-
bool FastGaussianBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)
{
rcti newInput;
-
- if (!this->m_sizeavailable) {
- rcti sizeInput;
- sizeInput.xmin = 0;
- sizeInput.ymin = 0;
- sizeInput.xmax = 5;
- sizeInput.ymax = 5;
- NodeOperation *operation = this->getInputOperation(1);
- if (operation->determineDependingAreaOfInterest(&sizeInput, readOperation, output)) {
- return true;
- }
+ rcti sizeInput;
+ sizeInput.xmin = 0;
+ sizeInput.ymin = 0;
+ sizeInput.xmax = 5;
+ sizeInput.ymax = 5;
+
+ NodeOperation *operation = this->getInputOperation(1);
+ if (operation->determineDependingAreaOfInterest(&sizeInput, readOperation, output)) {
+ return true;
}
- {
- if (this->m_sizeavailable) {
- getDAI(input, &newInput);
+ else {
+ if (this->m_iirgaus) {
+ return false;
}
else {
newInput.xmin = 0;
@@ -117,7 +81,6 @@ void FastGaussianBlurOperation::deinitExecution()
void *FastGaussianBlurOperation::initializeTileData(rcti *rect)
{
-#if 0
lockMutex();
if (!this->m_iirgaus) {
MemoryBuffer *newBuf = (MemoryBuffer *)this->m_inputProgram->initializeTileData(rect);
@@ -146,68 +109,8 @@ void *FastGaussianBlurOperation::initializeTileData(rcti *rect)
}
unlockMutex();
return this->m_iirgaus;
-#else
-
- lockMutex();
- if (this->m_iirgaus) {
- // if this->m_iirgaus is set, we don't do tile rendering, so
- // we can return the already calculated cache
- unlockMutex();
- return this->m_iirgaus;
- }
- updateSize();
- rcti dai;
- bool use_tiles = getDAI(rect, &dai);
- if (use_tiles) {
- unlockMutex();
- }
-
- MemoryBuffer *buffer = (MemoryBuffer *)this->m_inputProgram->initializeTileData(NULL);
- rcti *buf_rect = buffer->getRect();
-
- dai.xmin = max(dai.xmin, buf_rect->xmin);
- dai.xmax = min(dai.xmax, buf_rect->xmax);
- dai.ymin = max(dai.ymin, buf_rect->ymin);
- dai.ymax = min(dai.ymax, buf_rect->ymax);
-
- MemoryBuffer *tile = new MemoryBuffer(NULL, &dai);
- tile->copyContentFrom(buffer);
-
- int c;
- float sx = this->m_data.sizex * this->m_size / 2.0f;
- float sy = this->m_data.sizey * this->m_size / 2.0f;
-
- if ((sx == sy) && (sx > 0.f)) {
- for (c = 0; c < COM_NUMBER_OF_CHANNELS; ++c)
- IIR_gauss(tile, sx, c, 3);
- }
- else {
- if (sx > 0.0f) {
- for (c = 0; c < COM_NUMBER_OF_CHANNELS; ++c)
- IIR_gauss(tile, sx, c, 1);
- }
- if (sy > 0.0f) {
- for (c = 0; c < COM_NUMBER_OF_CHANNELS; ++c)
- IIR_gauss(tile, sy, c, 2);
- }
- }
- if (!use_tiles) {
- this->m_iirgaus = tile;
- unlockMutex();
- }
- return tile;
-#endif
}
-void FastGaussianBlurOperation::deinitializeTileData(rcti *rect, void *data)
-{
- if (!this->m_iirgaus && data) {
- MemoryBuffer *tile = (MemoryBuffer *)data;
- delete tile;
- }
-}
-
-
void FastGaussianBlurOperation::IIR_gauss(MemoryBuffer *src, float sigma, unsigned int chan, unsigned int xy)
{
double q, q2, sc, cf[4], tsM[9], tsu[3], tsv[3];
diff --git a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h
index e12d437b43e..58bf1d4f596 100644
--- a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h
+++ b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h
@@ -28,19 +28,16 @@
class FastGaussianBlurOperation : public BlurBaseOperation {
private:
+ float m_sx;
+ float m_sy;
MemoryBuffer *m_iirgaus;
- int m_chunksize;
-
public:
FastGaussianBlurOperation();
bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
void executePixel(float output[4], int x, int y, void *data);
- void setChunksize(int size) { this->m_chunksize = size; }
static void IIR_gauss(MemoryBuffer *src, float sigma, unsigned int channel, unsigned int xy);
- bool getDAI(rcti *rect, rcti *output);
void *initializeTileData(rcti *rect);
- void deinitializeTileData(rcti *rect, void *data);
void deinitExecution();
void initExecution();
};