diff options
Diffstat (limited to 'source/blender/sequencer/intern/strip_time.c')
-rw-r--r-- | source/blender/sequencer/intern/strip_time.c | 60 |
1 files changed, 38 insertions, 22 deletions
diff --git a/source/blender/sequencer/intern/strip_time.c b/source/blender/sequencer/intern/strip_time.c index 5d8266dbc6e..c484cd425c4 100644 --- a/source/blender/sequencer/intern/strip_time.c +++ b/source/blender/sequencer/intern/strip_time.c @@ -53,7 +53,7 @@ float seq_give_frame_index(const Scene *scene, Sequence *seq, float timeline_fra { float frame_index; float sta = SEQ_time_start_frame_get(seq); - float end = SEQ_time_start_frame_get(seq) + SEQ_time_strip_length_get(scene, seq) - 1; + float end = SEQ_time_content_end_frame_get(scene, seq) - 1; if (seq->type & SEQ_TYPE_EFFECT) { end = SEQ_time_right_handle_frame_get(scene, seq); @@ -169,11 +169,16 @@ void SEQ_time_update_meta_strip_range(const Scene *scene, Sequence *seq_meta) seq_meta->len -= seq_meta->anim_startofs; seq_meta->len -= seq_meta->anim_endofs; - seq_update_sound_bounds_recursive(scene, seq_meta); + /* Functions `SEQ_time_*_handle_frame_set()` can not be used here, because they are clamped, so + * change must be done at once. */ + seq_meta->startofs = strip_start - seq_meta->start; + seq_meta->startdisp = strip_start; /* Only to make files usable in older versions. */ + seq_meta->endofs = seq_meta->start + SEQ_time_strip_length_get(scene, seq_meta) - strip_end; + seq_meta->enddisp = strip_end; /* Only to make files usable in older versions. */ - /* Prevent meta-strip to move in timeline. */ - SEQ_time_left_handle_frame_set(scene, seq_meta, strip_start); - SEQ_time_right_handle_frame_set(scene, seq_meta, strip_end); + seq_update_sound_bounds_recursive(scene, seq_meta); + SEQ_time_update_meta_strip_range(scene, seq_sequence_lookup_meta_by_seq(scene, seq_meta)); + seq_time_update_effects_strip_range(scene, seq_sequence_lookup_effects_by_seq(scene, seq_meta)); } void seq_time_effect_range_set(const Scene *scene, Sequence *seq) @@ -465,8 +470,7 @@ bool SEQ_time_has_left_still_frames(const Scene *scene, const Sequence *seq) bool SEQ_time_has_right_still_frames(const Scene *scene, const Sequence *seq) { - return SEQ_time_right_handle_frame_get(scene, seq) > - SEQ_time_start_frame_get(seq) + SEQ_time_strip_length_get(scene, seq); + return SEQ_time_right_handle_frame_get(scene, seq) > SEQ_time_content_end_frame_get(scene, seq); } bool SEQ_time_has_still_frames(const Scene *scene, const Sequence *seq) @@ -474,8 +478,6 @@ bool SEQ_time_has_still_frames(const Scene *scene, const Sequence *seq) return SEQ_time_has_right_still_frames(scene, seq) || SEQ_time_has_left_still_frames(scene, seq); } -/* Length of strip content in frames. This is number of original frames adjusted by playback rate - * factor */ int SEQ_time_strip_length_get(const Scene *scene, const Sequence *seq) { if (seq->type == SEQ_TYPE_SOUND_RAM) { @@ -485,7 +487,6 @@ int SEQ_time_strip_length_get(const Scene *scene, const Sequence *seq) return seq->len / seq_time_playback_rate_factor_get(scene, seq); } -/* Return timeline frame, where strip content starts. */ float SEQ_time_start_frame_get(const Sequence *seq) { return seq->start; @@ -498,6 +499,11 @@ void SEQ_time_start_frame_set(const Scene *scene, Sequence *seq, int timeline_fr seq_time_update_effects_strip_range(scene, seq_sequence_lookup_effects_by_seq(scene, seq)); } +float SEQ_time_content_end_frame_get(const Scene *scene, const Sequence *seq) +{ + return SEQ_time_start_frame_get(seq) + SEQ_time_strip_length_get(scene, seq); +} + int SEQ_time_left_handle_frame_get(const Scene *UNUSED(scene), const Sequence *seq) { if (seq->seq1 || seq->seq2) { @@ -513,35 +519,45 @@ int SEQ_time_right_handle_frame_get(const Scene *scene, const Sequence *seq) return seq->enddisp; } - return seq->start + SEQ_time_strip_length_get(scene, seq) - seq->endofs; + return SEQ_time_content_end_frame_get(scene, seq) - seq->endofs; } -void SEQ_time_left_handle_frame_set(const Scene *scene, Sequence *seq, int val) +void SEQ_time_left_handle_frame_set(const Scene *scene, Sequence *seq, int timeline_frame) { const float right_handle_orig_frame = SEQ_time_right_handle_frame_get(scene, seq); - if (val >= right_handle_orig_frame) { - val = right_handle_orig_frame - 1; + if (timeline_frame >= right_handle_orig_frame) { + timeline_frame = right_handle_orig_frame - 1; } - seq->startofs = val - seq->start; - seq->startdisp = val; /* Only to make files usable in older versions. */ + seq->startofs = timeline_frame - SEQ_time_start_frame_get(seq); + seq->startdisp = timeline_frame; /* Only to make files usable in older versions. */ SEQ_time_update_meta_strip_range(scene, seq_sequence_lookup_meta_by_seq(scene, seq)); seq_time_update_effects_strip_range(scene, seq_sequence_lookup_effects_by_seq(scene, seq)); } -void SEQ_time_right_handle_frame_set(const Scene *scene, Sequence *seq, int val) +void SEQ_time_right_handle_frame_set(const Scene *scene, Sequence *seq, int timeline_frame) { - const float strip_content_end_frame = seq->start + SEQ_time_strip_length_get(scene, seq); const float left_handle_orig_frame = SEQ_time_left_handle_frame_get(scene, seq); - if (val <= left_handle_orig_frame) { - val = left_handle_orig_frame + 1; + if (timeline_frame <= left_handle_orig_frame) { + timeline_frame = left_handle_orig_frame + 1; } - seq->endofs = strip_content_end_frame - val; - seq->enddisp = val; /* Only to make files usable in older versions. */ + seq->endofs = SEQ_time_content_end_frame_get(scene, seq) - timeline_frame; + seq->enddisp = timeline_frame; /* Only to make files usable in older versions. */ + + SEQ_time_update_meta_strip_range(scene, seq_sequence_lookup_meta_by_seq(scene, seq)); + seq_time_update_effects_strip_range(scene, seq_sequence_lookup_effects_by_seq(scene, seq)); +} + +void seq_time_translate_handles(const Scene *scene, Sequence *seq, const int offset) +{ + seq->startofs += offset; + seq->endofs -= offset; + seq->startdisp += offset; /* Only to make files usable in older versions. */ + seq->enddisp -= offset; /* Only to make files usable in older versions. */ SEQ_time_update_meta_strip_range(scene, seq_sequence_lookup_meta_by_seq(scene, seq)); seq_time_update_effects_strip_range(scene, seq_sequence_lookup_effects_by_seq(scene, seq)); |