Merge branch 'master' into blender2.8
[blender.git] / source / blender / compositor / operations / COM_LuminanceMatteOperation.cpp
1 /*
2  * Copyright 2011, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor:
19  *              Dalai Felinto
20  */
21
22 #include "COM_LuminanceMatteOperation.h"
23 #include "BLI_math.h"
24
25 extern "C" {
26 #include "IMB_colormanagement.h"
27 }
28
29 LuminanceMatteOperation::LuminanceMatteOperation() : NodeOperation()
30 {
31         addInputSocket(COM_DT_COLOR);
32         addOutputSocket(COM_DT_VALUE);
33
34         this->m_inputImageProgram = NULL;
35 }
36
37 void LuminanceMatteOperation::initExecution()
38 {
39         this->m_inputImageProgram = this->getInputSocketReader(0);
40 }
41
42 void LuminanceMatteOperation::deinitExecution()
43 {
44         this->m_inputImageProgram = NULL;
45 }
46
47 void LuminanceMatteOperation::executePixelSampled(float output[4], float x, float y, PixelSampler sampler)
48 {
49         float inColor[4];
50         this->m_inputImageProgram->readSampled(inColor, x, y, sampler);
51
52         const float high = this->m_settings->t1;
53         const float low = this->m_settings->t2;
54         const float luminance = IMB_colormanagement_get_luminance(inColor);
55
56         float alpha;
57         
58         /* one line thread-friend algorithm:
59          * output[0] = min(inputValue[3], min(1.0f, max(0.0f, ((luminance - low) / (high - low))));
60          */
61                 
62         /* test range */
63         if (luminance > high) {
64                 alpha = 1.0f;
65         }
66         else if (luminance < low) {
67                 alpha = 0.0f;
68         }
69         else { /*blend */
70                 alpha = (luminance - low) / (high - low);
71         }
72
73         /* store matte(alpha) value in [0] to go with
74          * COM_SetAlphaOperation and the Value output
75          */
76
77         /* don't make something that was more transparent less transparent */
78         output[0] = min_ff(alpha, inColor[3]);
79 }
80