diff options
author | Jeroen Bakker <j.bakker@atmind.nl> | 2018-08-24 11:04:33 +0300 |
---|---|---|
committer | Jeroen Bakker <j.bakker@atmind.nl> | 2018-08-24 11:04:33 +0300 |
commit | b8c9df6f21587014cb6f11aa5bed6f9c1044e6ee (patch) | |
tree | b106ebde0ac8edda4ec69ccc45f494a407bae5c4 /source/blender | |
parent | f029aefe3e051d213292cf0d9be20d5438ca618f (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')
-rw-r--r-- | source/blender/blenkernel/intern/colortools.c | 44 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_templates.c | 2 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_color_types.h | 5 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_color.c | 5 |
4 files changed, 50 insertions, 6 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) { diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 9c4e7faa73e..27805f2cf1e 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -2965,7 +2965,7 @@ static void curvemap_buttons_layout( if (tone) { split = uiLayoutSplit(layout, 0.0f, false); - uiItemR(uiLayoutRow(split, false), ptr, "tone", UI_ITEM_R_EXPAND, NULL, ICON_NONE); + uiItemR(uiLayoutRow(split, false), ptr, "tone", 0, NULL, ICON_NONE); } /* curve chooser */ diff --git a/source/blender/makesdna/DNA_color_types.h b/source/blender/makesdna/DNA_color_types.h index fe158f85cd9..def1a2bad91 100644 --- a/source/blender/makesdna/DNA_color_types.h +++ b/source/blender/makesdna/DNA_color_types.h @@ -107,8 +107,9 @@ typedef enum eCurveMappingPreset { /* CurveMapping->tone */ typedef enum eCurveMappingTone { - CURVE_TONE_STANDARD = 0, - CURVE_TONE_FILMLIKE = 1, + CURVE_TONE_STANDARD = 0, + CURVE_TONE_WEIGHTED_STANDARD = 1, + CURVE_TONE_FILMLIKE = 2, } eCurveMappingTone; /* histogram->mode */ diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c index 4cbe365167c..f91be9ae1e9 100644 --- a/source/blender/makesrna/intern/rna_color.c +++ b/source/blender/makesrna/intern/rna_color.c @@ -764,8 +764,9 @@ static void rna_def_curvemapping(BlenderRNA *brna) FunctionRNA *func; static const EnumPropertyItem tone_items[] = { - {CURVE_TONE_STANDARD, "STANDARD", 0, "Standard", ""}, - {CURVE_TONE_FILMLIKE, "FILMLIKE", 0, "Film like", ""}, + {CURVE_TONE_STANDARD, "STANDARD", 0, "Standard", ""}, + {CURVE_TONE_WEIGHTED_STANDARD, "WEIGHTED", 0, "Weighted Standard", ""}, + {CURVE_TONE_FILMLIKE, "FILMLIKE", 0, "Film like", ""}, {0, NULL, 0, NULL, NULL} }; |