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:
authorJeroen Bakker <j.bakker@atmind.nl>2012-05-29 18:38:28 +0400
committerJeroen Bakker <j.bakker@atmind.nl>2012-05-29 18:38:28 +0400
commitfeb3dc926a74b51789b100ac9532dc196a4cd9ae (patch)
tree60819d056c79caf4266efc34baee87aab39fa0e0 /source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp
parent87d433d16c5c117f69f6ca3f348bf7639bcc4c06 (diff)
Compositor filter node
* edges (x=0, x=width-1, y = 0 y=height-1) were not taken into acount correctly used CLAMP function to limit the filter operation to existing pixels
Diffstat (limited to 'source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp')
-rw-r--r--source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp33
1 files changed, 23 insertions, 10 deletions
diff --git a/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp b/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp
index 0daa2b9c08a..db67412f3e7 100644
--- a/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp
+++ b/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp
@@ -36,9 +36,22 @@ inline void addFilter(float *result, float*input, float value)
void ConvolutionEdgeFilterOperation::executePixel(float *color,int x, int y, MemoryBuffer *inputBuffers[], void *data)
{
float in1[4],in2[4], res1[4], res2[4];
+
+ int x1 = x - 1;
+ int x2 = x;
+ int x3 = x + 1;
+ int y1 = y - 1;
+ int y2 = y;
+ int y3 = y + 1;
+ CLAMP(x1, 0, getWidth()-1);
+ CLAMP(x2, 0, getWidth()-1);
+ CLAMP(x3, 0, getWidth()-1);
+ CLAMP(y1, 0, getHeight()-1);
+ CLAMP(y2, 0, getHeight()-1);
+ CLAMP(y3, 0, getHeight()-1);
float value[4];
- this->inputValueOperation->read(value, x, y, inputBuffers, NULL);
+ this->inputValueOperation->read(value, x2, y2, inputBuffers, NULL);
float mval = 1.0f - value[0];
res1[0] = 0.0f;
@@ -50,39 +63,39 @@ void ConvolutionEdgeFilterOperation::executePixel(float *color,int x, int y, Mem
res2[2] = 0.0f;
res2[3] = 0.0f;
- this->inputOperation->read(in1, x-1, y-1, inputBuffers, NULL);
+ this->inputOperation->read(in1, x1, y1, inputBuffers, NULL);
addFilter(res1, in1, this->filter[0]);
addFilter(res2, in1, this->filter[0]);
- this->inputOperation->read(in1, x, y-1, inputBuffers, NULL);
+ this->inputOperation->read(in1, x2, y1, inputBuffers, NULL);
addFilter(res1, in1, this->filter[1]);
addFilter(res2, in1, this->filter[3]);
- this->inputOperation->read(in1, x+1, y-1, inputBuffers, NULL);
+ this->inputOperation->read(in1, x3, y1, inputBuffers, NULL);
addFilter(res1, in1, this->filter[2]);
addFilter(res2, in1, this->filter[6]);
- this->inputOperation->read(in1, x-1, y, inputBuffers, NULL);
+ this->inputOperation->read(in1, x1, y2, inputBuffers, NULL);
addFilter(res1, in1, this->filter[3]);
addFilter(res2, in1, this->filter[1]);
- this->inputOperation->read(in2, x, y, inputBuffers, NULL);
+ this->inputOperation->read(in2, x2, y2, inputBuffers, NULL);
addFilter(res1, in2, this->filter[4]);
addFilter(res2, in2, this->filter[4]);
- this->inputOperation->read(in1, x+1, y, inputBuffers, NULL);
+ this->inputOperation->read(in1, x3, y2, inputBuffers, NULL);
addFilter(res1, in1, this->filter[5]);
addFilter(res2, in1, this->filter[7]);
- this->inputOperation->read(in1, x-1, y+1, inputBuffers, NULL);
+ this->inputOperation->read(in1, x1, y3, inputBuffers, NULL);
addFilter(res1, in1, this->filter[6]);
addFilter(res2, in1, this->filter[2]);
- this->inputOperation->read(in1, x, y+1, inputBuffers, NULL);
+ this->inputOperation->read(in1, x2, y3, inputBuffers, NULL);
addFilter(res1, in1, this->filter[7]);
addFilter(res2, in1, this->filter[5]);
- this->inputOperation->read(in1, x+1, y+1, inputBuffers, NULL);
+ this->inputOperation->read(in1, x3, y3, inputBuffers, NULL);
addFilter(res1, in1, this->filter[8]);
addFilter(res2, in1, this->filter[8]);