From 1775ea74c152ba7cf27a8bc1f071b40992c89013 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 8 Mar 2021 13:41:52 +0100 Subject: Cleanup: Change extension .cpp to .cc --- .../operations/COM_KeyingBlurOperation.cc | 95 ++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 source/blender/compositor/operations/COM_KeyingBlurOperation.cc (limited to 'source/blender/compositor/operations/COM_KeyingBlurOperation.cc') diff --git a/source/blender/compositor/operations/COM_KeyingBlurOperation.cc b/source/blender/compositor/operations/COM_KeyingBlurOperation.cc new file mode 100644 index 00000000000..c9cc8ebc045 --- /dev/null +++ b/source/blender/compositor/operations/COM_KeyingBlurOperation.cc @@ -0,0 +1,95 @@ +/* + * 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. + * + * Copyright 2012, Blender Foundation. + */ + +#include "COM_KeyingBlurOperation.h" + +#include "MEM_guardedalloc.h" + +#include "BLI_listbase.h" +#include "BLI_math.h" + +KeyingBlurOperation::KeyingBlurOperation() +{ + this->addInputSocket(COM_DT_VALUE); + this->addOutputSocket(COM_DT_VALUE); + + this->m_size = 0; + this->m_axis = BLUR_AXIS_X; + + this->setComplex(true); +} + +void *KeyingBlurOperation::initializeTileData(rcti *rect) +{ + void *buffer = getInputOperation(0)->initializeTileData(rect); + + return buffer; +} + +void KeyingBlurOperation::executePixel(float output[4], int x, int y, void *data) +{ + MemoryBuffer *inputBuffer = (MemoryBuffer *)data; + const int bufferWidth = inputBuffer->getWidth(); + float *buffer = inputBuffer->getBuffer(); + int count = 0; + float average = 0.0f; + + if (this->m_axis == 0) { + const int start = MAX2(0, x - this->m_size + 1), end = MIN2(bufferWidth, x + this->m_size); + for (int cx = start; cx < end; cx++) { + int bufferIndex = (y * bufferWidth + cx); + average += buffer[bufferIndex]; + count++; + } + } + else { + const int start = MAX2(0, y - this->m_size + 1), + end = MIN2(inputBuffer->getHeight(), y + this->m_size); + for (int cy = start; cy < end; cy++) { + int bufferIndex = (cy * bufferWidth + x); + average += buffer[bufferIndex]; + count++; + } + } + + average /= (float)count; + + output[0] = average; +} + +bool KeyingBlurOperation::determineDependingAreaOfInterest(rcti *input, + ReadBufferOperation *readOperation, + rcti *output) +{ + rcti newInput; + + if (this->m_axis == BLUR_AXIS_X) { + newInput.xmin = input->xmin - this->m_size; + newInput.ymin = input->ymin; + newInput.xmax = input->xmax + this->m_size; + newInput.ymax = input->ymax; + } + else { + newInput.xmin = input->xmin; + newInput.ymin = input->ymin - this->m_size; + newInput.xmax = input->xmax; + newInput.ymax = input->ymax + this->m_size; + } + + return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output); +} -- cgit v1.2.3