diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-02-20 11:52:49 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-02-20 11:52:49 +0400 |
commit | 4823bd14542ce1d4251a35bc055cb1a8e947d085 (patch) | |
tree | 7444a4f6085d2e88af7646dd7c3b1e7968d78e36 /source/blender/editors/space_sequencer/sequencer_edit.c | |
parent | 361fc09792f12b2efc164e5e4d16789f7659d871 (diff) |
Fix crash when deleting strip used as mask in another strip modifier
Diffstat (limited to 'source/blender/editors/space_sequencer/sequencer_edit.c')
-rw-r--r-- | source/blender/editors/space_sequencer/sequencer_edit.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 92d8a0ae066..0a37496c88a 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -614,6 +614,26 @@ static Sequence *del_seq_find_replace_recurs(Scene *scene, Sequence *seq) return seq; } +static void del_seq_clear_modifiers_recurs(Scene *scene, Sequence *deleting_sequence) +{ + Editing *ed = BKE_sequencer_editing_get(scene, FALSE); + Sequence *current_sequence; + + SEQP_BEGIN(ed, current_sequence) + { + if (!(current_sequence->flag & SELECT) && current_sequence != deleting_sequence) { + SequenceModifierData *smd; + + for (smd = current_sequence->modifiers.first; smd; smd = smd->next) { + if (smd->mask_sequence == deleting_sequence) { + smd->mask_sequence = NULL; + } + } + } + } + SEQ_END +} + static void recurs_del_seq_flag(Scene *scene, ListBase *lb, short flag, short deleteall) { Sequence *seq, *seqn; @@ -1746,10 +1766,17 @@ static int sequencer_delete_exec(bContext *C, wmOperator *UNUSED(op)) if (nothingSelected) return OPERATOR_FINISHED; - /* for effects, try to find a replacement input */ - for (seq = ed->seqbasep->first; seq; seq = seq->next) - if ((seq->type & SEQ_TYPE_EFFECT) && !(seq->flag & SELECT)) - del_seq_find_replace_recurs(scene, seq); + /* for effects and modifiers, try to find a replacement input */ + for (seq = ed->seqbasep->first; seq; seq = seq->next) { + if (!(seq->flag & SELECT)) { + if ((seq->type & SEQ_TYPE_EFFECT)) { + del_seq_find_replace_recurs(scene, seq); + } + } + else { + del_seq_clear_modifiers_recurs(scene, seq); + } + } /* delete all selected strips */ recurs_del_seq_flag(scene, ed->seqbasep, SELECT, 0); |