From b57403eebcf741fe72017ddebe268e1ed2e9d856 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sun, 10 Jun 2012 18:15:28 +0000 Subject: [PATCH] Make keying clamping operation complex so it might directly access input buffer 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. --- .../operations/COM_KeyingClipOperation.cpp | 37 +++++++++---------- .../operations/COM_KeyingClipOperation.h | 8 ++-- 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/source/blender/compositor/operations/COM_KeyingClipOperation.cpp b/source/blender/compositor/operations/COM_KeyingClipOperation.cpp index 1c92e76c51a..38d67a76c72 100644 --- a/source/blender/compositor/operations/COM_KeyingClipOperation.cpp +++ b/source/blender/compositor/operations/COM_KeyingClipOperation.cpp @@ -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); + + return buffer; } -void KeyingClipOperation::deinitExecution() -{ - this->pixelReader = NULL; -} - -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]; + if (cx >= 0 && cx < bufferWidth && cy >= 0 && cy < bufferHeight) { + int bufferIndex = (cy * bufferWidth + cx) * 4; - this->pixelReader->read(value, cx, cy, sampler, inputBuffers); - - 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) diff --git a/source/blender/compositor/operations/COM_KeyingClipOperation.h b/source/blender/compositor/operations/COM_KeyingClipOperation.h index 1141e0b47ab..4eab7d6b0e3 100644 --- a/source/blender/compositor/operations/COM_KeyingClipOperation.h +++ b/source/blender/compositor/operations/COM_KeyingClipOperation.h @@ -31,20 +31,18 @@ */ 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