== Inpaint Node ==
authorPeter Schlaile <peter@schlaile.de>
Sun, 12 Aug 2012 15:59:40 +0000 (15:59 +0000)
committerPeter Schlaile <peter@schlaile.de>
Sun, 12 Aug 2012 15:59:40 +0000 (15:59 +0000)
Fixed several small (stupid) issues with the inpaint node:

* on pixel order building, some ranges got wrong and origin was considered
  several times.

* the convolution kernel didn't consider all pixels (+1,0),(-1,0),(0,1) and (0-1)
  were omited, leading to suboptimal results (sometimes even black areas)

* alpha channel is now only affected an areas considered by inpaint.
  That's only important, if you choose low iteration counts.

source/blender/compositor/operations/COM_InpaintOperation.cpp

index e586dded8db964e09c645a97c20978f56401e237..eb732cc2b80f5f6b5b82d4743c0e25a57940c757 100644 (file)
@@ -142,7 +142,7 @@ void InpaintSimpleOperation::calc_manhatten_distance()
        }
        
        for (int j = height - 1; j >= 0; j--) {
-               for (int i = width; i >= 0; i--) {
+               for (int i = width - 1; i >= 0; i--) {
                        int r = m[j * width + i];
                        
                        if (i + 1 < width) 
@@ -184,8 +184,7 @@ void InpaintSimpleOperation::pix_step(int x, int y)
 
        for (int dx = -1; dx <= 1; dx++) {
                for (int dy = -1; dy <= 1; dy++) {
-                       if (dx != 0 && dy != 0) {
-
+                       if (dx != 0 || dy != 0) {
                                int x_ofs = x + dx;
                                int y_ofs = y + dy;
 
@@ -210,6 +209,8 @@ void InpaintSimpleOperation::pix_step(int x, int y)
        }
 
        mul_v3_v3fl(this->get_pixel(x, y), pix, 1.0f / n);
+
+       this->get_pixel(x, y)[3] = 1.0f;
 }
 
 void *InpaintSimpleOperation::initializeTileData(rcti *rect)
@@ -243,8 +244,7 @@ void *InpaintSimpleOperation::initializeTileData(rcti *rect)
 void InpaintSimpleOperation::executePixel(float output[4], int x, int y, void *data)
 {
        this->clamp_xy(x, y);
-       copy_v3_v3(output, this->get_pixel(x, y));
-       output[3] = 1.0f;
+       copy_v4_v4(output, this->get_pixel(x, y));
 }
 
 void InpaintSimpleOperation::deinitExecution()