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:
authorJeroen Bakker <j.bakker@atmind.nl>2018-08-24 11:04:33 +0300
committerJeroen Bakker <j.bakker@atmind.nl>2018-08-24 11:04:33 +0300
commitb8c9df6f21587014cb6f11aa5bed6f9c1044e6ee (patch)
treeb106ebde0ac8edda4ec69ccc45f494a407bae5c4 /source/blender/blenkernel/intern/colortools.c
parentf029aefe3e051d213292cf0d9be20d5438ca618f (diff)
Compositor: Added Weighted Standard Curve evaluation
Available in RGB Curve node in the compositor and as modifier in the sequencer. I reshuffled the values of the enum. But a the first commit is just 1 day old I think that the order is more important than the file compatibility.
Diffstat (limited to 'source/blender/blenkernel/intern/colortools.c')
-rw-r--r--source/blender/blenkernel/intern/colortools.c44
1 files changed, 43 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c
index c934adc8762..0684231480b 100644
--- a/source/blender/blenkernel/intern/colortools.c
+++ b/source/blender/blenkernel/intern/colortools.c
@@ -953,6 +953,28 @@ static void curvemapping_evaluateRGBF_filmlike(const CurveMapping *cumap, float
vecout[channel_offset[1]] = v1;
vecout[channel_offset[2]] = v2;
}
+
+static float curvemapping_weighted_standard_triangle(float a, float b, float a1)
+{
+ if (a != b)
+ {
+ float b1;
+ float a2 = a1 - a;
+
+ if (b < a)
+ {
+ b1 = b + a2 * b / a ;
+ }
+ else {
+ b1 = b + a2 * (65535.f - b) / (65535.f - a);
+ }
+
+ return b1;
+ }
+
+ return a1;
+}
+
/** same as #curvemapping_evaluate_premulRGBF
* but black/bwmul are passed as args for the compositor
* where they can change per pixel.
@@ -970,7 +992,8 @@ void curvemapping_evaluate_premulRGBF_ex(
const float g = (vecin[1] - black[1]) * bwmul[1];
const float b = (vecin[2] - black[2]) * bwmul[2];
- switch (cumap->tone) {
+ switch (cumap->tone)
+ {
default:
case CURVE_TONE_STANDARD:
{
@@ -979,6 +1002,25 @@ void curvemapping_evaluate_premulRGBF_ex(
vecout[2] = curvemap_evaluateF(&cumap->cm[2], b);
break;
}
+ case CURVE_TONE_WEIGHTED_STANDARD:
+ {
+ float r1 = curvemap_evaluateF(&cumap->cm[0], r);
+ float g1 = curvemapping_weighted_standard_triangle(r, r1, g);
+ float b1 = curvemapping_weighted_standard_triangle(r, r1, b);
+
+ float g2 = curvemap_evaluateF(&cumap->cm[1], g);
+ float r2 = curvemapping_weighted_standard_triangle(g, g2, r);
+ float b2 = curvemapping_weighted_standard_triangle(g, g2, b);
+
+ float b3 = curvemap_evaluateF(&cumap->cm[2], b);
+ float r3 = curvemapping_weighted_standard_triangle(b, b3, r);
+ float g3 = curvemapping_weighted_standard_triangle(b, b3, g);
+
+ vecout[0] = r1 * 0.50f + r2 * 0.25f + r3 * 0.25f;
+ vecout[1] = g1 * 0.25f + g2 * 0.50f + g3 * 0.25f;
+ vecout[2] = b1 * 0.25f + b2 * 0.25f + b3 * 0.50f;
+ break;
+ }
case CURVE_TONE_FILMLIKE:
{
if (r >= g) {