diff --git a/scripts/startup/bl_ui/space_sequencer.py b/scripts/startup/bl_ui/space_sequencer.py index f32282a87e5..cf35abcfe78 100644 --- a/scripts/startup/bl_ui/space_sequencer.py +++ b/scripts/startup/bl_ui/space_sequencer.py @@ -2256,6 +2256,7 @@ class SEQUENCER_PT_adjust_color(SequencerButtonsPanel, Panel): col = layout.column() col.prop(strip, "color_saturation", text="Saturation") col.prop(strip, "color_multiply", text="Multiply") + col.prop(strip, "multiply_alpha") col.prop(strip, "use_float", text="Convert to Float") diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index c4450974b9a..223890e1ca9 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -613,7 +613,7 @@ enum { SEQ_AUTO_PLAYBACK_RATE = (1 << 17), SEQ_SINGLE_FRAME_CONTENT = (1 << 18), SEQ_SHOW_RETIMING = (1 << 19), - SEQ_FLAG_UNUSED_21 = (1 << 21), /* cleared */ + SEQ_MULTIPLY_ALPHA = (1 << 21), SEQ_USE_EFFECT_DEFAULT_FADE = (1 << 22), SEQ_USE_LINEAR_MODIFIERS = (1 << 23), diff --git a/source/blender/makesrna/intern/rna_sequencer.cc b/source/blender/makesrna/intern/rna_sequencer.cc index f24f5a8aa4a..7f2bca241a5 100644 --- a/source/blender/makesrna/intern/rna_sequencer.cc +++ b/source/blender/makesrna/intern/rna_sequencer.cc @@ -2625,6 +2625,11 @@ static void rna_def_filter_video(StructRNA *srna) RNA_def_property_update( prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_invalidate_preprocessed_update"); + prop = RNA_def_property(srna, "multiply_alpha", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, nullptr, "flag", SEQ_MULTIPLY_ALPHA); + RNA_def_property_ui_text(prop, "Multiply Alpha", "Multiply alpha along with color channels"); + RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_invalidate_raw_update"); + prop = RNA_def_property(srna, "color_saturation", PROP_FLOAT, PROP_UNSIGNED); RNA_def_property_float_sdna(prop, nullptr, "sat"); RNA_def_property_range(prop, 0.0f, 20.0f); diff --git a/source/blender/sequencer/intern/render.cc b/source/blender/sequencer/intern/render.cc index 033a0d4922a..434cb75fb20 100644 --- a/source/blender/sequencer/intern/render.cc +++ b/source/blender/sequencer/intern/render.cc @@ -571,7 +571,7 @@ static void sequencer_preprocess_transform_crop( } } -static void multibuf(ImBuf *ibuf, const float fmul) +static void multibuf(ImBuf *ibuf, const float fmul, const bool multiply_alpha) { uchar *rt; float *rt_float; @@ -588,6 +588,9 @@ static void multibuf(ImBuf *ibuf, const float fmul) rt[0] = min_ii((imul * rt[0]) >> 8, 255); rt[1] = min_ii((imul * rt[1]) >> 8, 255); rt[2] = min_ii((imul * rt[2]) >> 8, 255); + if (multiply_alpha) { + rt[3] = min_ii((imul * rt[3]) >> 8, 255); + } rt += 4; } @@ -598,6 +601,9 @@ static void multibuf(ImBuf *ibuf, const float fmul) rt_float[0] *= fmul; rt_float[1] *= fmul; rt_float[2] *= fmul; + if (multiply_alpha) { + rt_float[3] *= fmul; + } rt_float += 4; } @@ -669,7 +675,8 @@ static ImBuf *input_preprocess(const SeqRenderData *context, } if (mul != 1.0f) { - multibuf(preprocessed_ibuf, mul); + const bool multiply_alpha = (seq->flag & SEQ_MULTIPLY_ALPHA); + multibuf(preprocessed_ibuf, mul, multiply_alpha); } if (seq->modifiers.first) {