[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47182] trunk/blender/source/blender/ compositor/operations: Compositor filter node
Jeroen Bakker
j.bakker at atmind.nl
Tue May 29 16:38:28 CEST 2012
Revision: 47182
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47182
Author: jbakker
Date: 2012-05-29 14:38:28 +0000 (Tue, 29 May 2012)
Log Message:
-----------
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
Modified Paths:
--------------
trunk/blender/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp
trunk/blender/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cpp
Modified: trunk/blender/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp 2012-05-29 14:25:28 UTC (rev 47181)
+++ trunk/blender/source/blender/compositor/operations/COM_ConvolutionEdgeFilterOperation.cpp 2012-05-29 14:38:28 UTC (rev 47182)
@@ -36,9 +36,22 @@
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 @@
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]);
Modified: trunk/blender/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cpp 2012-05-29 14:25:28 UTC (rev 47181)
+++ trunk/blender/source/blender/compositor/operations/COM_ConvolutionFilterOperation.cpp 2012-05-29 14:38:28 UTC (rev 47182)
@@ -22,6 +22,8 @@
#include "COM_ConvolutionFilterOperation.h"
+#include "BLI_utildefines.h"
+
ConvolutionFilterOperation::ConvolutionFilterOperation() : NodeOperation()
{
this->addInputSocket(COM_DT_COLOR);
@@ -73,51 +75,62 @@
color[3] = 0.0;
float in1[4];
float in2[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];
-
- this->inputOperation->read(in1, x-1, y-1, inputBuffers, NULL);
+ this->inputOperation->read(in1, x1, y1, inputBuffers, NULL);
color[0] += in1[0] * this->filter[0];
color[1] += in1[1] * this->filter[0];
color[2] += in1[2] * this->filter[0];
color[3] += in1[3] * this->filter[0];
- this->inputOperation->read(in1, x, y-1, inputBuffers, NULL);
+ this->inputOperation->read(in1, x2, y1, inputBuffers, NULL);
color[0] += in1[0] * this->filter[1];
color[1] += in1[1] * this->filter[1];
color[2] += in1[2] * this->filter[1];
color[3] += in1[3] * this->filter[1];
- this->inputOperation->read(in1, x+1, y-1, inputBuffers, NULL);
+ this->inputOperation->read(in1, x3, y1, inputBuffers, NULL);
color[0] += in1[0] * this->filter[2];
color[1] += in1[1] * this->filter[2];
color[2] += in1[2] * this->filter[2];
color[3] += in1[3] * this->filter[2];
- this->inputOperation->read(in1, x-1, y, inputBuffers, NULL);
+ this->inputOperation->read(in1, x1, y2, inputBuffers, NULL);
color[0] += in1[0] * this->filter[3];
color[1] += in1[1] * this->filter[3];
color[2] += in1[2] * this->filter[3];
color[3] += in1[3] * this->filter[3];
- this->inputOperation->read(in2, x, y, inputBuffers, NULL);
+ this->inputOperation->read(in2, x2, y2, inputBuffers, NULL);
color[0] += in2[0] * this->filter[4];
color[1] += in2[1] * this->filter[4];
color[2] += in2[2] * this->filter[4];
color[3] += in2[3] * this->filter[4];
- this->inputOperation->read(in1, x+1, y, inputBuffers, NULL);
+ this->inputOperation->read(in1, x3, y2, inputBuffers, NULL);
color[0] += in1[0] * this->filter[5];
color[1] += in1[1] * this->filter[5];
color[2] += in1[2] * this->filter[5];
color[3] += in1[3] * this->filter[5];
- this->inputOperation->read(in1, x-1, y+1, inputBuffers, NULL);
+ this->inputOperation->read(in1, x1, y3, inputBuffers, NULL);
color[0] += in1[0] * this->filter[6];
color[1] += in1[1] * this->filter[6];
color[2] += in1[2] * this->filter[6];
color[3] += in1[3] * this->filter[6];
- this->inputOperation->read(in1, x, y+1, inputBuffers, NULL);
+ this->inputOperation->read(in1, x2, y3, inputBuffers, NULL);
color[0] += in1[0] * this->filter[7];
color[1] += in1[1] * this->filter[7];
color[2] += in1[2] * this->filter[7];
color[3] += in1[3] * this->filter[7];
- this->inputOperation->read(in1, x+1, y+1, inputBuffers, NULL);
+ this->inputOperation->read(in1, x3, y3, inputBuffers, NULL);
color[0] += in1[0] * this->filter[8];
color[1] += in1[1] * this->filter[8];
color[2] += in1[2] * this->filter[8];
More information about the Bf-blender-cvs
mailing list