diff options
Diffstat (limited to 'source/blender/blenkernel/intern/colortools.c')
-rw-r--r-- | source/blender/blenkernel/intern/colortools.c | 44 |
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) { |