diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-05-22 18:12:13 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-05-22 18:15:45 +0300 |
commit | 8cc4c3da8cbe8da197928fa821e140f4b2615c4c (patch) | |
tree | cde2eb40138570d46f68cae8e10d5d5bb4103fd9 /source/blender/compositor | |
parent | 849e77b1f957b25ac9223a3dc510e234f4467fd1 (diff) |
Fix T51308: Bright/Contrast Doesn't respect Pre-multiplied Alpha
Brightness/contrast node was changing color but did not modify alpha
or ensured colors are premultiplied on the output. This was giving
artifacts later on unless alpha was manually converted.
Compositor is supposed to work in premultiplied alpha (except of
some really corner cases) so it makes sense to ensure premultiplied
alpha after brightness/contrast node.
This is now done as an option enabled by default, so we:
(a) Keep compatibility with old files.
(b) Have correct behavior for newly created files.
Later on we can get rid of this option.
Diffstat (limited to 'source/blender/compositor')
3 files changed, 18 insertions, 1 deletions
diff --git a/source/blender/compositor/nodes/COM_BrightnessNode.cpp b/source/blender/compositor/nodes/COM_BrightnessNode.cpp index 053f286c66e..6729571fac0 100644 --- a/source/blender/compositor/nodes/COM_BrightnessNode.cpp +++ b/source/blender/compositor/nodes/COM_BrightnessNode.cpp @@ -31,7 +31,9 @@ BrightnessNode::BrightnessNode(bNode *editorNode) : Node(editorNode) void BrightnessNode::convertToOperations(NodeConverter &converter, const CompositorContext &/*context*/) const { + bNode *bnode = this->getbNode(); BrightnessOperation *operation = new BrightnessOperation(); + operation->setUsePremultiply((bnode->custom1 & 1) != 0); converter.addOperation(operation); converter.mapInputSocket(getInputSocket(0), operation->getInputSocket(0)); diff --git a/source/blender/compositor/operations/COM_BrightnessOperation.cpp b/source/blender/compositor/operations/COM_BrightnessOperation.cpp index 33e35c3fe3b..c7ba86b66bc 100644 --- a/source/blender/compositor/operations/COM_BrightnessOperation.cpp +++ b/source/blender/compositor/operations/COM_BrightnessOperation.cpp @@ -29,7 +29,14 @@ BrightnessOperation::BrightnessOperation() : NodeOperation() this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_COLOR); this->m_inputProgram = NULL; + this->m_use_premultiply = false; } + +void BrightnessOperation::setUsePremultiply(bool use_premultiply) +{ + this->m_use_premultiply = use_premultiply; +} + void BrightnessOperation::initExecution() { this->m_inputProgram = this->getInputSocketReader(0); @@ -64,11 +71,16 @@ void BrightnessOperation::executePixelSampled(float output[4], float x, float y, delta *= -1; b = a * (brightness + delta); } - + if (this->m_use_premultiply) { + premul_to_straight_v4(inputValue); + } output[0] = a * inputValue[0] + b; output[1] = a * inputValue[1] + b; output[2] = a * inputValue[2] + b; output[3] = inputValue[3]; + if (this->m_use_premultiply) { + straight_to_premul_v4(output); + } } void BrightnessOperation::deinitExecution() diff --git a/source/blender/compositor/operations/COM_BrightnessOperation.h b/source/blender/compositor/operations/COM_BrightnessOperation.h index 22086ae11e8..ff492f2b102 100644 --- a/source/blender/compositor/operations/COM_BrightnessOperation.h +++ b/source/blender/compositor/operations/COM_BrightnessOperation.h @@ -34,6 +34,8 @@ private: SocketReader *m_inputBrightnessProgram; SocketReader *m_inputContrastProgram; + bool m_use_premultiply; + public: BrightnessOperation(); @@ -52,5 +54,6 @@ public: */ void deinitExecution(); + void setUsePremultiply(bool use_premultiply); }; #endif |