Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-06-14 16:19:13 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-06-14 16:19:13 +0400
commit1f19bacf8ee39b779b4e2940bed758ade1191ee2 (patch)
tree6182f55adf381a3632376d0b236e6751d8a629ee /source/blender/compositor/operations
parentd56e77ada59050d02a03b44e9d5a7b122683615f (diff)
parent075b35572ecaa6e6e47e2e6e97c3711df74580ed (diff)
Kaying node from tomato branch
Merge keying node from tomato branch into trunk. It was considered stable and helpful by Mango team and it'll help studio pipeline, because nodes would stop disappearing when opening files in current trunk. Full information about keying nodes could be found there: http://wiki.blender.org/index.php/User:Nazg-gul/Keying
Diffstat (limited to 'source/blender/compositor/operations')
-rw-r--r--source/blender/compositor/operations/COM_KeyingBlurOperation.cpp88
-rw-r--r--source/blender/compositor/operations/COM_KeyingBlurOperation.h48
-rw-r--r--source/blender/compositor/operations/COM_KeyingClipOperation.cpp123
-rw-r--r--source/blender/compositor/operations/COM_KeyingClipOperation.h59
-rw-r--r--source/blender/compositor/operations/COM_KeyingDespillOperation.cpp89
-rw-r--r--source/blender/compositor/operations/COM_KeyingDespillOperation.h49
-rw-r--r--source/blender/compositor/operations/COM_KeyingOperation.cpp115
-rw-r--r--source/blender/compositor/operations/COM_KeyingOperation.h56
8 files changed, 627 insertions, 0 deletions
diff --git a/source/blender/compositor/operations/COM_KeyingBlurOperation.cpp b/source/blender/compositor/operations/COM_KeyingBlurOperation.cpp
new file mode 100644
index 00000000000..3ed3921e0c1
--- /dev/null
+++ b/source/blender/compositor/operations/COM_KeyingBlurOperation.cpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor:
+ * Jeroen Bakker
+ * Monique Dewanchand
+ * Sergey Sharybin
+ */
+
+#include "COM_KeyingBlurOperation.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+
+KeyingBlurOperation::KeyingBlurOperation(): NodeOperation()
+{
+ this->addInputSocket(COM_DT_VALUE);
+ this->addOutputSocket(COM_DT_VALUE);
+
+ this->size = 0.0f;
+
+ this->setComplex(true);
+}
+
+void *KeyingBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
+{
+ void *buffer = getInputOperation(0)->initializeTileData(rect, memoryBuffers);
+
+ return buffer;
+}
+
+void KeyingBlurOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data)
+{
+ MemoryBuffer *inputBuffer = (MemoryBuffer*)data;
+ float *buffer = inputBuffer->getBuffer();
+
+ int bufferWidth = inputBuffer->getWidth();
+ int bufferHeight = inputBuffer->getHeight();
+
+ int i, j, count = 0;
+
+ float average = 0.0f;
+
+ for (i = -this->size + 1; i < this->size; i++) {
+ for (j = -this->size + 1; j < this->size; j++) {
+ int cx = x + j, cy = y + i;
+
+ if (cx >= 0 && cx < bufferWidth && cy >= 0 && cy < bufferHeight) {
+ int bufferIndex = (cy * bufferWidth + cx) * 4;
+
+ average += buffer[bufferIndex];
+ count++;
+ }
+ }
+ }
+
+ average /= (float) count;
+
+ color[0] = average;
+}
+
+bool KeyingBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)
+{
+ rcti newInput;
+
+ newInput.xmin = 0;
+ newInput.ymin = 0;
+ newInput.xmax = this->getWidth();
+ newInput.ymax = this->getHeight();
+
+ return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
+}
diff --git a/source/blender/compositor/operations/COM_KeyingBlurOperation.h b/source/blender/compositor/operations/COM_KeyingBlurOperation.h
new file mode 100644
index 00000000000..8d7834c7265
--- /dev/null
+++ b/source/blender/compositor/operations/COM_KeyingBlurOperation.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor:
+ * Jeroen Bakker
+ * Monique Dewanchand
+ * Sergey Sharybin
+ */
+
+#ifndef _COM_KeyingBlurOperation_h
+#define _COM_KeyingBlurOperation_h
+
+#include "COM_NodeOperation.h"
+
+/**
+ * Class with implementation of bluring for keying node
+ */
+class KeyingBlurOperation : public NodeOperation {
+protected:
+ int size;
+
+public:
+ KeyingBlurOperation();
+
+ void setSize(float value) {this->size = value;}
+
+ void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers);
+
+ void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data);
+
+ bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
+};
+
+#endif
diff --git a/source/blender/compositor/operations/COM_KeyingClipOperation.cpp b/source/blender/compositor/operations/COM_KeyingClipOperation.cpp
new file mode 100644
index 00000000000..09b5b7a523c
--- /dev/null
+++ b/source/blender/compositor/operations/COM_KeyingClipOperation.cpp
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2012, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor:
+ * Jeroen Bakker
+ * Monique Dewanchand
+ * Sergey Sharybin
+ */
+
+#include "COM_KeyingClipOperation.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+
+KeyingClipOperation::KeyingClipOperation(): NodeOperation()
+{
+ this->addInputSocket(COM_DT_VALUE);
+ this->addOutputSocket(COM_DT_VALUE);
+
+ this->kernelRadius = 3;
+ this->kernelTolerance = 0.1f;
+
+ this->clipBlack = 0.0f;
+ this->clipWhite = 1.0f;
+
+ this->isEdgeMatte = false;
+
+ this->setComplex(true);
+}
+
+void *KeyingClipOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
+{
+ void *buffer = getInputOperation(0)->initializeTileData(rect, memoryBuffers);
+
+ return buffer;
+}
+
+void KeyingClipOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data)
+{
+ const int delta = this->kernelRadius;
+ const float tolerance = this->kernelTolerance;
+
+ MemoryBuffer *inputBuffer = (MemoryBuffer*)data;
+ float *buffer = inputBuffer->getBuffer();
+
+ int bufferWidth = inputBuffer->getWidth();
+ int bufferHeight = inputBuffer->getHeight();
+
+ int i, j, count = 0, totalCount = 0;
+
+ float value = buffer[(y * bufferWidth + x) * 4];
+
+ bool ok = false;
+
+ for (i = -delta + 1; i < delta; i++) {
+ for (j = -delta + 1; j < delta; j++) {
+ int cx = x + j, cy = y + i;
+
+ if (i == 0 && j == 0)
+ continue;
+
+ if (cx >= 0 && cx < bufferWidth && cy >= 0 && cy < bufferHeight) {
+ int bufferIndex = (cy * bufferWidth + cx) * 4;
+ float currentValue = buffer[bufferIndex];
+
+ if (fabsf(currentValue - value) < tolerance) {
+ count++;
+ }
+
+ totalCount++;
+ }
+ }
+ }
+
+ ok = count >= (float) totalCount * 0.9f;
+
+ if (this->isEdgeMatte) {
+ if (ok)
+ color[0] = 0.0f;
+ else
+ color[0] = 1.0f;
+ }
+ else {
+ color[0] = value;
+
+ if (ok) {
+ if (color[0] < this->clipBlack)
+ color[0] = 0.0f;
+ else if (color[0] >= this->clipWhite)
+ color[0] = 1.0f;
+ else
+ color[0] = (color[0] - this->clipBlack) / (this->clipWhite - this->clipBlack);
+ }
+ }
+}
+
+bool KeyingClipOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)
+{
+ rcti newInput;
+
+ newInput.xmin = 0;
+ newInput.ymin = 0;
+ newInput.xmax = this->getWidth();
+ newInput.ymax = this->getHeight();
+
+ return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
+}
diff --git a/source/blender/compositor/operations/COM_KeyingClipOperation.h b/source/blender/compositor/operations/COM_KeyingClipOperation.h
new file mode 100644
index 00000000000..9c7b23b0160
--- /dev/null
+++ b/source/blender/compositor/operations/COM_KeyingClipOperation.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor:
+ * Jeroen Bakker
+ * Monique Dewanchand
+ * Sergey Sharybin
+ */
+
+#ifndef _COM_KeyingClipOperation_h
+#define _COM_KeyingClipOperation_h
+
+#include "COM_NodeOperation.h"
+
+/**
+ * Class with implementation of black/white clipping for keying node
+ */
+class KeyingClipOperation : public NodeOperation {
+protected:
+ float clipBlack;
+ float clipWhite;
+
+ int kernelRadius;
+ float kernelTolerance;
+
+ bool isEdgeMatte;
+public:
+ KeyingClipOperation();
+
+ void setClipBlack(float value) {this->clipBlack = value;}
+ void setClipWhite(float value) {this->clipWhite = value;}
+
+ void setKernelRadius(int value) {this->kernelRadius = value;}
+ void setKernelTolerance(float value) {this->kernelTolerance = value;}
+
+ void setIsEdgeMatte(bool value) {this->isEdgeMatte = value;}
+
+ void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers);
+
+ void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data);
+
+ bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
+};
+
+#endif
diff --git a/source/blender/compositor/operations/COM_KeyingDespillOperation.cpp b/source/blender/compositor/operations/COM_KeyingDespillOperation.cpp
new file mode 100644
index 00000000000..b7fd2772729
--- /dev/null
+++ b/source/blender/compositor/operations/COM_KeyingDespillOperation.cpp
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2012, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor:
+ * Jeroen Bakker
+ * Monique Dewanchand
+ * Sergey Sharybin
+ */
+
+#include "COM_KeyingDespillOperation.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+
+static int get_pixel_primary_channel(float *pixel)
+{
+ float max_value = MAX3(pixel[0], pixel[1], pixel[2]);
+
+ if (max_value == pixel[0])
+ return 0;
+ else if (max_value == pixel[1])
+ return 1;
+
+ return 2;
+}
+
+KeyingDespillOperation::KeyingDespillOperation(): NodeOperation()
+{
+ this->addInputSocket(COM_DT_COLOR);
+ this->addInputSocket(COM_DT_COLOR);
+ this->addOutputSocket(COM_DT_COLOR);
+
+ this->despillFactor = 0.5f;
+
+ this->pixelReader = NULL;
+ this->screenReader = NULL;
+}
+
+void KeyingDespillOperation::initExecution()
+{
+ this->pixelReader = this->getInputSocketReader(0);
+ this->screenReader = this->getInputSocketReader(1);
+}
+
+void KeyingDespillOperation::deinitExecution()
+{
+ this->pixelReader = NULL;
+ this->screenReader = NULL;
+}
+
+void KeyingDespillOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[])
+{
+ float pixelColor[4];
+ float screenColor[4];
+
+ this->pixelReader->read(pixelColor, x, y, sampler, inputBuffers);
+ this->screenReader->read(screenColor, x, y, sampler, inputBuffers);
+
+ int screen_primary_channel = get_pixel_primary_channel(screenColor);
+ float average_value, amount;
+
+ average_value = (pixelColor[0] + pixelColor[1] + pixelColor[2] - pixelColor[screen_primary_channel]) / 2.0f;
+ amount = pixelColor[screen_primary_channel] - average_value;
+
+ color[0] = pixelColor[0];
+ color[1] = pixelColor[1];
+ color[2] = pixelColor[2];
+ color[3] = pixelColor[3];
+
+ if (this->despillFactor * amount > 0) {
+ color[screen_primary_channel] = pixelColor[screen_primary_channel] - this->despillFactor * amount;
+ }
+}
diff --git a/source/blender/compositor/operations/COM_KeyingDespillOperation.h b/source/blender/compositor/operations/COM_KeyingDespillOperation.h
new file mode 100644
index 00000000000..92a1415a1f0
--- /dev/null
+++ b/source/blender/compositor/operations/COM_KeyingDespillOperation.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor:
+ * Jeroen Bakker
+ * Monique Dewanchand
+ * Sergey Sharybin
+ */
+
+#ifndef _COM_KeyingDespillOperation_h
+#define _COM_KeyingDespillOperation_h
+
+#include "COM_NodeOperation.h"
+
+/**
+ * Class with implementation of keying despill node
+ */
+class KeyingDespillOperation : public NodeOperation {
+protected:
+ SocketReader *pixelReader;
+ SocketReader *screenReader;
+ float despillFactor;
+
+public:
+ KeyingDespillOperation();
+
+ void initExecution();
+ void deinitExecution();
+
+ void setDespillFactor(float value) {this->despillFactor = value;}
+
+ void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]);
+};
+
+#endif
diff --git a/source/blender/compositor/operations/COM_KeyingOperation.cpp b/source/blender/compositor/operations/COM_KeyingOperation.cpp
new file mode 100644
index 00000000000..fba4dc65faf
--- /dev/null
+++ b/source/blender/compositor/operations/COM_KeyingOperation.cpp
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2012, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor:
+ * Jeroen Bakker
+ * Monique Dewanchand
+ * Sergey Sharybin
+ */
+
+#include "COM_KeyingOperation.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+
+static int get_pixel_primary_channel(float pixelColor[4])
+{
+ float max_value = MAX3(pixelColor[0], pixelColor[1], pixelColor[2]);
+
+ if (max_value == pixelColor[0])
+ return 0;
+ else if (max_value == pixelColor[1])
+ return 1;
+
+ return 2;
+}
+
+static float get_pixel_saturation(float pixelColor[4], float screen_balance, int primary_channel)
+{
+ int other_1 = (primary_channel + 1) % 3;
+ int other_2 = (primary_channel + 2) % 3;
+
+ float min = MIN2(pixelColor[other_1], pixelColor[other_2]);
+ float max = MAX2(pixelColor[other_1], pixelColor[other_2]);
+ float val = screen_balance * min + (1.0f - screen_balance) * max;
+
+ return (pixelColor[primary_channel] - val) * fabsf(1.0f - val);
+}
+
+KeyingOperation::KeyingOperation(): NodeOperation()
+{
+ this->addInputSocket(COM_DT_COLOR);
+ this->addInputSocket(COM_DT_COLOR);
+ this->addOutputSocket(COM_DT_VALUE);
+
+ this->screenBalance = 0.5f;
+
+ this->pixelReader = NULL;
+ this->screenReader = NULL;
+}
+
+void KeyingOperation::initExecution()
+{
+ this->pixelReader = this->getInputSocketReader(0);
+ this->screenReader = this->getInputSocketReader(1);
+}
+
+void KeyingOperation::deinitExecution()
+{
+ this->pixelReader = NULL;
+ this->screenReader = NULL;
+}
+
+void KeyingOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[])
+{
+ float pixelColor[4];
+ float screenColor[4];
+
+ this->pixelReader->read(pixelColor, x, y, sampler, inputBuffers);
+ this->screenReader->read(screenColor, x, y, sampler, inputBuffers);
+
+ int primary_channel = get_pixel_primary_channel(screenColor);
+
+ float saturation = get_pixel_saturation(pixelColor, this->screenBalance, primary_channel);
+ float screen_saturation = get_pixel_saturation(screenColor, this->screenBalance, primary_channel);
+
+ if (saturation < 0) {
+ color[0] = 1.0f;
+ }
+ else if (saturation >= screen_saturation) {
+ color[0] = 0.0f;
+ }
+ else {
+ float distance = 1.0f - saturation / screen_saturation;
+
+ color[0] = distance;
+ }
+}
+
+bool KeyingOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)
+{
+ rcti newInput;
+
+ newInput.xmin = 0;
+ newInput.ymin = 0;
+ newInput.xmax = this->getWidth();
+ newInput.ymax = this->getHeight();
+
+ return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
+}
diff --git a/source/blender/compositor/operations/COM_KeyingOperation.h b/source/blender/compositor/operations/COM_KeyingOperation.h
new file mode 100644
index 00000000000..0fc13407d14
--- /dev/null
+++ b/source/blender/compositor/operations/COM_KeyingOperation.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor:
+ * Jeroen Bakker
+ * Monique Dewanchand
+ * Sergey Sharybin
+ */
+
+
+#ifndef _COM_KeyingOperation_h
+#define _COM_KeyingOperation_h
+
+#include <string.h>
+
+#include "COM_NodeOperation.h"
+
+#include "BLI_listbase.h"
+
+/**
+ * Class with implementation of keying node
+ */
+class KeyingOperation : public NodeOperation {
+protected:
+ SocketReader *pixelReader;
+ SocketReader *screenReader;
+ float screenBalance;
+
+public:
+ KeyingOperation();
+
+ void initExecution();
+ void deinitExecution();
+
+ void setScreenBalance(float value) {this->screenBalance = value;}
+
+ void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]);
+
+ bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
+};
+
+#endif