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.
This commit is contained in:
Sergey Sharybin
2012-06-10 18:15:28 +00:00
parent ecbd2842dc
commit b57403eebc
2 changed files with 21 additions and 24 deletions

View 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);
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)

View File

@@ -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