diff options
Diffstat (limited to 'source/blender/compositor/operations/COM_CalculateMeanOperation.cpp')
-rw-r--r-- | source/blender/compositor/operations/COM_CalculateMeanOperation.cpp | 155 |
1 files changed, 78 insertions, 77 deletions
diff --git a/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp b/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp index 2bc3efc60e4..5d01154bbda 100644 --- a/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp +++ b/source/blender/compositor/operations/COM_CalculateMeanOperation.cpp @@ -26,103 +26,104 @@ extern "C" { CalculateMeanOperation::CalculateMeanOperation() : NodeOperation() { - this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); - this->addOutputSocket(COM_DT_VALUE); - this->m_imageReader = NULL; - this->m_iscalculated = false; - this->m_setting = 1; - this->setComplex(true); + this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); + this->addOutputSocket(COM_DT_VALUE); + this->m_imageReader = NULL; + this->m_iscalculated = false; + this->m_setting = 1; + this->setComplex(true); } void CalculateMeanOperation::initExecution() { - this->m_imageReader = this->getInputSocketReader(0); - this->m_iscalculated = false; - NodeOperation::initMutex(); + this->m_imageReader = this->getInputSocketReader(0); + this->m_iscalculated = false; + NodeOperation::initMutex(); } -void CalculateMeanOperation::executePixel(float output[4], - int /*x*/, int /*y*/, - void * /*data*/) +void CalculateMeanOperation::executePixel(float output[4], int /*x*/, int /*y*/, void * /*data*/) { - output[0] = this->m_result; + output[0] = this->m_result; } void CalculateMeanOperation::deinitExecution() { - this->m_imageReader = NULL; - NodeOperation::deinitMutex(); + this->m_imageReader = NULL; + NodeOperation::deinitMutex(); } -bool CalculateMeanOperation::determineDependingAreaOfInterest(rcti * /*input*/, ReadBufferOperation *readOperation, rcti *output) +bool CalculateMeanOperation::determineDependingAreaOfInterest(rcti * /*input*/, + ReadBufferOperation *readOperation, + rcti *output) { - rcti imageInput; - if (this->m_iscalculated) { - return false; - } - NodeOperation *operation = getInputOperation(0); - imageInput.xmax = operation->getWidth(); - imageInput.xmin = 0; - imageInput.ymax = operation->getHeight(); - imageInput.ymin = 0; - if (operation->determineDependingAreaOfInterest(&imageInput, readOperation, output) ) { - return true; - } - return false; + rcti imageInput; + if (this->m_iscalculated) { + return false; + } + NodeOperation *operation = getInputOperation(0); + imageInput.xmax = operation->getWidth(); + imageInput.xmin = 0; + imageInput.ymax = operation->getHeight(); + imageInput.ymin = 0; + if (operation->determineDependingAreaOfInterest(&imageInput, readOperation, output)) { + return true; + } + return false; } void *CalculateMeanOperation::initializeTileData(rcti *rect) { - lockMutex(); - if (!this->m_iscalculated) { - MemoryBuffer *tile = (MemoryBuffer *)this->m_imageReader->initializeTileData(rect); - calculateMean(tile); - this->m_iscalculated = true; - } - unlockMutex(); - return NULL; + lockMutex(); + if (!this->m_iscalculated) { + MemoryBuffer *tile = (MemoryBuffer *)this->m_imageReader->initializeTileData(rect); + calculateMean(tile); + this->m_iscalculated = true; + } + unlockMutex(); + return NULL; } void CalculateMeanOperation::calculateMean(MemoryBuffer *tile) { - this->m_result = 0.0f; - float *buffer = tile->getBuffer(); - int size = tile->getWidth() * tile->getHeight(); - int pixels = 0; - float sum = 0.0f; - for (int i = 0, offset = 0; i < size; i++, offset += 4) { - if (buffer[offset + 3] > 0) { - pixels++; + this->m_result = 0.0f; + float *buffer = tile->getBuffer(); + int size = tile->getWidth() * tile->getHeight(); + int pixels = 0; + float sum = 0.0f; + for (int i = 0, offset = 0; i < size; i++, offset += 4) { + if (buffer[offset + 3] > 0) { + pixels++; - switch (this->m_setting) { - case 1: - { - sum += IMB_colormanagement_get_luminance(&buffer[offset]); - break; - } - case 2: - { - sum += buffer[offset]; - break; - } - case 3: - { - sum += buffer[offset + 1]; - break; - } - case 4: - { - sum += buffer[offset + 2]; - break; - } - case 5: - { - float yuv[3]; - rgb_to_yuv(buffer[offset], buffer[offset + 1], buffer[offset + 2], &yuv[0], &yuv[1], &yuv[2], BLI_YUV_ITU_BT709); - sum += yuv[0]; - break; - } - } - } - } - this->m_result = sum / pixels; + switch (this->m_setting) { + case 1: { + sum += IMB_colormanagement_get_luminance(&buffer[offset]); + break; + } + case 2: { + sum += buffer[offset]; + break; + } + case 3: { + sum += buffer[offset + 1]; + break; + } + case 4: { + sum += buffer[offset + 2]; + break; + } + case 5: { + float yuv[3]; + rgb_to_yuv(buffer[offset], + buffer[offset + 1], + buffer[offset + 2], + &yuv[0], + &yuv[1], + &yuv[2], + BLI_YUV_ITU_BT709); + sum += yuv[0]; + break; + } + } + } + } + this->m_result = sum / pixels; } |