Make keying clamping operation complex so it might directly access input buffer
authorSergey Sharybin <sergey.vfx@gmail.com>
Sun, 10 Jun 2012 18:15:28 +0000 (18:15 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Sun, 10 Jun 2012 18:15:28 +0000 (18:15 +0000)
Seems to give quite noticeable speedup, but there's sometimes strange artifacts
showing as darker lines placed in along some kind of tiles.
Not sure what causes them yet.

source/blender/compositor/operations/COM_KeyingClipOperation.cpp
source/blender/compositor/operations/COM_KeyingClipOperation.h

index 1c92e76c51a01d306ebc31f18bbe77db0b3e6afd..38d67a76c72ced5e5ba454ce1b21e2cfe8a87359 100644 (file)
@@ -36,29 +36,30 @@ KeyingClipOperation::KeyingClipOperation(): NodeOperation()
        this->clipBlack = 0.0f;
        this->clipWhite = 1.0f;
 
-       this->pixelReader = NULL;
+       this->setComplex(true);
 }
 
-void KeyingClipOperation::initExecution()
+void *KeyingClipOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
 {
-       this->pixelReader = this->getInputSocketReader(0);
-}
+       void *buffer = getInputOperation(0)->initializeTileData(rect, memoryBuffers);
 
-void KeyingClipOperation::deinitExecution()
-{
-       this->pixelReader = NULL;
+       return buffer;
 }
 
-void KeyingClipOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[])
+void KeyingClipOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data)
 {
        const int delta = 3;
 
-       float pixelColor[4];
-       int width = this->getWidth(), height = this->getHeight();
+       MemoryBuffer *inputBuffer = (MemoryBuffer*)data;
+       float *buffer = inputBuffer->getBuffer();
+
+       int bufferWidth = inputBuffer->getWidth();
+       int bufferHeight = inputBuffer->getHeight();
+
        int count_black = 0, count_white = 0;
        int i, j;
 
-       this->pixelReader->read(pixelColor, x, y, sampler, inputBuffers);
+       int srcIndex = (y * bufferWidth + x) * 4;
 
        for (i = -delta + 1; i < delta; i++) {
                for (j = -delta + 1; j < delta; j++) {
@@ -67,20 +68,18 @@ void KeyingClipOperation::executePixel(float *color, float x, float y, PixelSamp
                        if (i == 0 && j == 0)
                                continue;
 
-                       if (cx >= 0 && cx < width && cy >= 0 && cy < height) {
-                               float value[4];
-
-                               this->pixelReader->read(value, cx, cy, sampler, inputBuffers);
+                       if (cx >= 0 && cx < bufferWidth && cy >= 0 && cy < bufferHeight) {
+                               int bufferIndex = (cy * bufferWidth + cx) * 4;
 
-                               if (value[0] < 0.4f)
+                               if (buffer[bufferIndex] < 0.4f)
                                        count_black++;
-                               else if (value[0] > 0.6f)
+                               else if (buffer[bufferIndex] > 0.6f)
                                        count_white++;
                        }
                }
        }
 
-       color[0] = pixelColor[0];
+       color[0] = buffer[srcIndex];
 
        if (count_black >= 22 || count_white >= 22) {
                if (color[0] < this->clipBlack)
index 1141e0b47ab702a469d81fd5f770927497084171..4eab7d6b0e3865692a7ce05b4b782c92eb0e2647 100644 (file)
   */
 class KeyingClipOperation : public NodeOperation {
 protected:
-       SocketReader *pixelReader;
        float clipBlack;
        float clipWhite;
 
 public:
        KeyingClipOperation();
 
-       void initExecution();
-       void deinitExecution();
-
        void setClipBlack(float value) {this->clipBlack = value;}
        void setClipWhite(float value) {this->clipWhite = value;}
 
-       void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]);
+       void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers);
+
+       void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data);
 };
 
 #endif