Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/sequencer/intern/strip_transform.c')
-rw-r--r--source/blender/sequencer/intern/strip_transform.c188
1 files changed, 80 insertions, 108 deletions
diff --git a/source/blender/sequencer/intern/strip_transform.c b/source/blender/sequencer/intern/strip_transform.c
index 19caf12ff2a..68b30c9ce19 100644
--- a/source/blender/sequencer/intern/strip_transform.c
+++ b/source/blender/sequencer/intern/strip_transform.c
@@ -34,15 +34,6 @@
static CLG_LogRef LOG = {"seq.strip_transform"};
-static int seq_tx_get_start(Sequence *seq)
-{
- return seq->start;
-}
-static int seq_tx_get_end(Sequence *seq)
-{
- return seq->start + seq->len;
-}
-
bool SEQ_transform_single_image_check(Sequence *seq)
{
return ((seq->len == 1) &&
@@ -91,49 +82,6 @@ bool SEQ_transform_seqbase_isolated_sel_check(ListBase *seqbase)
return true;
}
-void SEQ_transform_handle_xlimits(const Scene *scene, Sequence *seq, int leftflag, int rightflag)
-{
- if (leftflag) {
- if (SEQ_time_left_handle_frame_get(seq) >= SEQ_time_right_handle_frame_get(seq)) {
- SEQ_time_left_handle_frame_set(scene, seq, SEQ_time_right_handle_frame_get(seq) - 1);
- }
-
- if (SEQ_transform_single_image_check(seq) == 0) {
- if (SEQ_time_left_handle_frame_get(seq) >= seq_tx_get_end(seq)) {
- SEQ_time_left_handle_frame_set(scene, seq, seq_tx_get_end(seq) - 1);
- }
-
- /* TODO: This doesn't work at the moment. */
-#if 0
- if (seq_tx_get_start(seq) >= seq_tx_get_final_right(seq, 0)) {
- int ofs;
- ofs = seq_tx_get_start(seq) - seq_tx_get_final_right(seq, 0);
- seq->start -= ofs;
- seq_tx_set_final_left(seq, seq_tx_get_final_left(seq, 0) + ofs);
- }
-#endif
- }
- }
-
- if (rightflag) {
- if (SEQ_time_right_handle_frame_get(seq) <= SEQ_time_left_handle_frame_get(seq)) {
- SEQ_time_right_handle_frame_set(scene, seq, SEQ_time_left_handle_frame_get(seq) + 1);
- }
-
- if (SEQ_transform_single_image_check(seq) == 0) {
- if (SEQ_time_right_handle_frame_get(seq) <= seq_tx_get_start(seq)) {
- SEQ_time_right_handle_frame_set(scene, seq, seq_tx_get_start(seq) + 1);
- }
- }
- }
-
- /* sounds cannot be extended past their endpoints */
- if (seq->type == SEQ_TYPE_SOUND_RAM) {
- CLAMP(seq->startofs, 0, MAXFRAME);
- CLAMP(seq->endofs, 0, MAXFRAME);
- }
-}
-
void SEQ_transform_fix_single_image_seq_offsets(const Scene *scene, Sequence *seq)
{
int left, start, offset;
@@ -143,12 +91,14 @@ void SEQ_transform_fix_single_image_seq_offsets(const Scene *scene, Sequence *se
/* make sure the image is always at the start since there is only one,
* adjusting its start should be ok */
- left = SEQ_time_left_handle_frame_get(seq);
+ left = SEQ_time_left_handle_frame_get(scene, seq);
start = seq->start;
if (start != left) {
offset = left - start;
- SEQ_time_left_handle_frame_set(scene, seq, SEQ_time_left_handle_frame_get(seq) - offset);
- SEQ_time_right_handle_frame_set(scene, seq, SEQ_time_right_handle_frame_get(seq) - offset);
+ SEQ_time_left_handle_frame_set(
+ scene, seq, SEQ_time_left_handle_frame_get(scene, seq) - offset);
+ SEQ_time_right_handle_frame_set(
+ scene, seq, SEQ_time_right_handle_frame_get(scene, seq) - offset);
seq->start += offset;
}
}
@@ -158,20 +108,22 @@ bool SEQ_transform_sequence_can_be_translated(Sequence *seq)
return !(seq->type & SEQ_TYPE_EFFECT) || (SEQ_effect_get_num_inputs(seq->type) == 0);
}
-bool SEQ_transform_test_overlap_seq_seq(Sequence *seq1, Sequence *seq2)
+bool SEQ_transform_test_overlap_seq_seq(const Scene *scene, Sequence *seq1, Sequence *seq2)
{
return (seq1 != seq2 && seq1->machine == seq2->machine &&
- ((SEQ_time_right_handle_frame_get(seq1) <= SEQ_time_left_handle_frame_get(seq2)) ||
- (SEQ_time_left_handle_frame_get(seq1) >= SEQ_time_right_handle_frame_get(seq2))) == 0);
+ ((SEQ_time_right_handle_frame_get(scene, seq1) <=
+ SEQ_time_left_handle_frame_get(scene, seq2)) ||
+ (SEQ_time_left_handle_frame_get(scene, seq1) >=
+ SEQ_time_right_handle_frame_get(scene, seq2))) == 0);
}
-bool SEQ_transform_test_overlap(ListBase *seqbasep, Sequence *test)
+bool SEQ_transform_test_overlap(const Scene *scene, ListBase *seqbasep, Sequence *test)
{
Sequence *seq;
seq = seqbasep->first;
while (seq) {
- if (SEQ_transform_test_overlap_seq_seq(test, seq)) {
+ if (SEQ_transform_test_overlap_seq_seq(scene, test, seq)) {
return true;
}
@@ -194,14 +146,16 @@ void SEQ_transform_translate_sequence(Scene *evil_scene, Sequence *seq, int delt
SEQ_transform_translate_sequence(evil_scene, seq_child, delta);
}
/* Move meta start/end points. */
- SEQ_time_left_handle_frame_set(evil_scene, seq, SEQ_time_left_handle_frame_get(seq) + delta);
- SEQ_time_right_handle_frame_set(evil_scene, seq, SEQ_time_right_handle_frame_get(seq) + delta);
+ SEQ_time_left_handle_frame_set(
+ evil_scene, seq, SEQ_time_left_handle_frame_get(evil_scene, seq) + delta);
+ SEQ_time_right_handle_frame_set(
+ evil_scene, seq, SEQ_time_right_handle_frame_get(evil_scene, seq) + delta);
}
else { /* All other strip types. */
seq->start += delta;
/* Only to make files usable in older versions. */
- seq->startdisp = SEQ_time_left_handle_frame_get(seq);
- seq->enddisp = SEQ_time_right_handle_frame_get(seq);
+ seq->startdisp = SEQ_time_left_handle_frame_get(evil_scene, seq);
+ seq->enddisp = SEQ_time_right_handle_frame_get(evil_scene, seq);
}
SEQ_offset_animdata(evil_scene, seq, delta);
@@ -219,7 +173,7 @@ bool SEQ_transform_seqbase_shuffle_ex(ListBase *seqbasep,
BLI_assert(ELEM(channel_delta, -1, 1));
test->machine += channel_delta;
- while (SEQ_transform_test_overlap(seqbasep, test)) {
+ while (SEQ_transform_test_overlap(evil_scene, seqbasep, test)) {
if ((channel_delta > 0) ? (test->machine >= MAXSEQ) : (test->machine < 1)) {
break;
}
@@ -232,17 +186,17 @@ bool SEQ_transform_seqbase_shuffle_ex(ListBase *seqbasep,
* nicer to move it to the end */
Sequence *seq;
- int new_frame = SEQ_time_right_handle_frame_get(test);
+ int new_frame = SEQ_time_right_handle_frame_get(evil_scene, test);
for (seq = seqbasep->first; seq; seq = seq->next) {
if (seq->machine == orig_machine) {
- new_frame = max_ii(new_frame, SEQ_time_right_handle_frame_get(seq));
+ new_frame = max_ii(new_frame, SEQ_time_right_handle_frame_get(evil_scene, seq));
}
}
test->machine = orig_machine;
- new_frame = new_frame +
- (test->start - SEQ_time_left_handle_frame_get(test)); /* adjust by the startdisp */
+ new_frame = new_frame + (test->start - SEQ_time_left_handle_frame_get(
+ evil_scene, test)); /* adjust by the startdisp */
SEQ_transform_translate_sequence(evil_scene, test, new_frame - test->start);
return false;
}
@@ -255,16 +209,20 @@ bool SEQ_transform_seqbase_shuffle(ListBase *seqbasep, Sequence *test, Scene *ev
return SEQ_transform_seqbase_shuffle_ex(seqbasep, test, evil_scene, 1);
}
-static bool shuffle_seq_test_overlap(const Sequence *seq1, const Sequence *seq2, const int offset)
+static bool shuffle_seq_test_overlap(const Scene *scene,
+ const Sequence *seq1,
+ const Sequence *seq2,
+ const int offset)
{
- return (
- seq1 != seq2 && seq1->machine == seq2->machine &&
- ((SEQ_time_right_handle_frame_get(seq1) + offset <= SEQ_time_left_handle_frame_get(seq2)) ||
- (SEQ_time_left_handle_frame_get(seq1) + offset >= SEQ_time_right_handle_frame_get(seq2))) ==
- 0);
+ return (seq1 != seq2 && seq1->machine == seq2->machine &&
+ ((SEQ_time_right_handle_frame_get(scene, seq1) + offset <=
+ SEQ_time_left_handle_frame_get(scene, seq2)) ||
+ (SEQ_time_left_handle_frame_get(scene, seq1) + offset >=
+ SEQ_time_right_handle_frame_get(scene, seq2))) == 0);
}
-static int shuffle_seq_time_offset_get(SeqCollection *strips_to_shuffle,
+static int shuffle_seq_time_offset_get(const Scene *scene,
+ SeqCollection *strips_to_shuffle,
ListBase *seqbasep,
char dir)
{
@@ -276,7 +234,7 @@ static int shuffle_seq_time_offset_get(SeqCollection *strips_to_shuffle,
all_conflicts_resolved = true;
SEQ_ITERATOR_FOREACH (seq, strips_to_shuffle) {
LISTBASE_FOREACH (Sequence *, seq_other, seqbasep) {
- if (!shuffle_seq_test_overlap(seq, seq_other, offset)) {
+ if (!shuffle_seq_test_overlap(scene, seq, seq_other, offset)) {
continue;
}
if (SEQ_relation_is_effect_of_strip(seq_other, seq)) {
@@ -293,13 +251,13 @@ static int shuffle_seq_time_offset_get(SeqCollection *strips_to_shuffle,
if (dir == 'L') {
offset = min_ii(offset,
- SEQ_time_left_handle_frame_get(seq_other) -
- SEQ_time_right_handle_frame_get(seq));
+ SEQ_time_left_handle_frame_get(scene, seq_other) -
+ SEQ_time_right_handle_frame_get(scene, seq));
}
else {
offset = max_ii(offset,
- SEQ_time_right_handle_frame_get(seq_other) -
- SEQ_time_left_handle_frame_get(seq));
+ SEQ_time_right_handle_frame_get(scene, seq_other) -
+ SEQ_time_left_handle_frame_get(scene, seq));
}
}
}
@@ -315,8 +273,8 @@ bool SEQ_transform_seqbase_shuffle_time(SeqCollection *strips_to_shuffle,
ListBase *markers,
const bool use_sync_markers)
{
- int offset_l = shuffle_seq_time_offset_get(strips_to_shuffle, seqbasep, 'L');
- int offset_r = shuffle_seq_time_offset_get(strips_to_shuffle, seqbasep, 'R');
+ int offset_l = shuffle_seq_time_offset_get(evil_scene, strips_to_shuffle, seqbasep, 'L');
+ int offset_r = shuffle_seq_time_offset_get(evil_scene, strips_to_shuffle, seqbasep, 'R');
int offset = (-offset_l < offset_r) ? offset_l : offset_r;
if (offset) {
@@ -359,7 +317,8 @@ static SeqCollection *extract_standalone_strips(SeqCollection *transformed_strip
}
/* Query strips positioned after left edge of transformed strips bound-box. */
-static SeqCollection *query_right_side_strips(ListBase *seqbase,
+static SeqCollection *query_right_side_strips(const Scene *scene,
+ ListBase *seqbase,
SeqCollection *transformed_strips,
SeqCollection *time_dependent_strips)
{
@@ -367,7 +326,7 @@ static SeqCollection *query_right_side_strips(ListBase *seqbase,
{
Sequence *seq;
SEQ_ITERATOR_FOREACH (seq, transformed_strips) {
- minframe = min_ii(minframe, SEQ_time_left_handle_frame_get(seq));
+ minframe = min_ii(minframe, SEQ_time_left_handle_frame_get(scene, seq));
}
}
@@ -380,7 +339,7 @@ static SeqCollection *query_right_side_strips(ListBase *seqbase,
continue;
}
- if ((seq->flag & SELECT) == 0 && SEQ_time_left_handle_frame_get(seq) >= minframe) {
+ if ((seq->flag & SELECT) == 0 && SEQ_time_left_handle_frame_get(scene, seq) >= minframe) {
SEQ_collection_append_strip(seq, collection);
}
}
@@ -398,7 +357,7 @@ static void seq_transform_handle_expand_to_fit(Scene *scene,
ListBase *markers = &scene->markers;
SeqCollection *right_side_strips = query_right_side_strips(
- seqbasep, transformed_strips, time_dependent_strips);
+ scene, seqbasep, transformed_strips, time_dependent_strips);
/* Temporarily move right side strips beyond timeline boundary. */
Sequence *seq;
@@ -424,7 +383,8 @@ static void seq_transform_handle_expand_to_fit(Scene *scene,
SEQ_collection_free(right_side_strips);
}
-static SeqCollection *query_overwrite_targets(ListBase *seqbasep,
+static SeqCollection *query_overwrite_targets(const Scene *scene,
+ ListBase *seqbasep,
SeqCollection *transformed_strips)
{
SeqCollection *collection = SEQ_query_unselected_strips(seqbasep);
@@ -438,7 +398,7 @@ static SeqCollection *query_overwrite_targets(ListBase *seqbasep,
if (seq == seq_transformed) {
SEQ_collection_remove_strip(seq, collection);
}
- if (SEQ_transform_test_overlap_seq_seq(seq, seq_transformed)) {
+ if (SEQ_transform_test_overlap_seq_seq(scene, seq, seq_transformed)) {
does_overlap = true;
}
}
@@ -463,23 +423,32 @@ typedef enum eOvelapDescrition {
STRIP_OVERLAP_RIGHT_SIDE,
} eOvelapDescrition;
-static eOvelapDescrition overlap_description_get(const Sequence *transformed,
+static eOvelapDescrition overlap_description_get(const Scene *scene,
+ const Sequence *transformed,
const Sequence *target)
{
- if (SEQ_time_left_handle_frame_get(transformed) <= SEQ_time_left_handle_frame_get(target) &&
- SEQ_time_right_handle_frame_get(transformed) >= SEQ_time_right_handle_frame_get(target)) {
+ if (SEQ_time_left_handle_frame_get(scene, transformed) <=
+ SEQ_time_left_handle_frame_get(scene, target) &&
+ SEQ_time_right_handle_frame_get(scene, transformed) >=
+ SEQ_time_right_handle_frame_get(scene, target)) {
return STRIP_OVERLAP_IS_FULL;
}
- if (SEQ_time_left_handle_frame_get(transformed) > SEQ_time_left_handle_frame_get(target) &&
- SEQ_time_right_handle_frame_get(transformed) < SEQ_time_right_handle_frame_get(target)) {
+ if (SEQ_time_left_handle_frame_get(scene, transformed) >
+ SEQ_time_left_handle_frame_get(scene, target) &&
+ SEQ_time_right_handle_frame_get(scene, transformed) <
+ SEQ_time_right_handle_frame_get(scene, target)) {
return STRIP_OVERLAP_IS_INSIDE;
}
- if (SEQ_time_left_handle_frame_get(transformed) <= SEQ_time_left_handle_frame_get(target) &&
- SEQ_time_left_handle_frame_get(target) <= SEQ_time_right_handle_frame_get(transformed)) {
+ if (SEQ_time_left_handle_frame_get(scene, transformed) <=
+ SEQ_time_left_handle_frame_get(scene, target) &&
+ SEQ_time_left_handle_frame_get(scene, target) <=
+ SEQ_time_right_handle_frame_get(scene, transformed)) {
return STRIP_OVERLAP_LEFT_SIDE;
}
- if (SEQ_time_left_handle_frame_get(transformed) <= SEQ_time_right_handle_frame_get(target) &&
- SEQ_time_right_handle_frame_get(target) <= SEQ_time_right_handle_frame_get(transformed)) {
+ if (SEQ_time_left_handle_frame_get(scene, transformed) <=
+ SEQ_time_right_handle_frame_get(scene, target) &&
+ SEQ_time_right_handle_frame_get(scene, target) <=
+ SEQ_time_right_handle_frame_get(scene, transformed)) {
return STRIP_OVERLAP_RIGHT_SIDE;
}
return STRIP_OVERLAP_NONE;
@@ -499,14 +468,14 @@ static void seq_transform_handle_overwrite_split(Scene *scene,
scene,
seqbasep,
target,
- SEQ_time_left_handle_frame_get(transformed),
+ SEQ_time_left_handle_frame_get(scene, transformed),
SEQ_SPLIT_SOFT,
NULL);
SEQ_edit_strip_split(bmain,
scene,
seqbasep,
split_strip,
- SEQ_time_right_handle_frame_get(transformed),
+ SEQ_time_right_handle_frame_get(scene, transformed),
SEQ_SPLIT_SOFT,
NULL);
SEQ_edit_flag_for_removal(scene, seqbasep, split_strip);
@@ -521,11 +490,12 @@ static void seq_transform_handle_overwrite_trim(Scene *scene,
Sequence *target,
const eOvelapDescrition overlap)
{
- SeqCollection *targets = SEQ_query_by_reference(target, seqbasep, SEQ_query_strip_effect_chain);
+ SeqCollection *targets = SEQ_query_by_reference(
+ target, scene, seqbasep, SEQ_query_strip_effect_chain);
/* Expand collection by adding all target's children, effects and their children. */
if ((target->type & SEQ_TYPE_EFFECT) != 0) {
- SEQ_collection_expand(seqbasep, targets, SEQ_query_strip_effect_chain);
+ SEQ_collection_expand(scene, seqbasep, targets, SEQ_query_strip_effect_chain);
}
/* Trim all non effects, that have influence on effect length which is overlapping. */
@@ -535,11 +505,13 @@ static void seq_transform_handle_overwrite_trim(Scene *scene,
continue;
}
if (overlap == STRIP_OVERLAP_LEFT_SIDE) {
- SEQ_time_left_handle_frame_set(scene, seq, SEQ_time_right_handle_frame_get(transformed));
+ SEQ_time_left_handle_frame_set(
+ scene, seq, SEQ_time_right_handle_frame_get(scene, transformed));
}
else {
BLI_assert(overlap == STRIP_OVERLAP_RIGHT_SIDE);
- SEQ_time_right_handle_frame_set(scene, seq, SEQ_time_left_handle_frame_get(transformed));
+ SEQ_time_right_handle_frame_set(
+ scene, seq, SEQ_time_left_handle_frame_get(scene, transformed));
}
}
SEQ_collection_free(targets);
@@ -549,7 +521,7 @@ static void seq_transform_handle_overwrite(Scene *scene,
ListBase *seqbasep,
SeqCollection *transformed_strips)
{
- SeqCollection *targets = query_overwrite_targets(seqbasep, transformed_strips);
+ SeqCollection *targets = query_overwrite_targets(scene, seqbasep, transformed_strips);
SeqCollection *strips_to_delete = SEQ_collection_create(__func__);
Sequence *target;
@@ -560,7 +532,7 @@ static void seq_transform_handle_overwrite(Scene *scene,
continue;
}
- const eOvelapDescrition overlap = overlap_description_get(transformed, target);
+ const eOvelapDescrition overlap = overlap_description_get(scene, transformed, target);
if (overlap == STRIP_OVERLAP_IS_FULL) {
SEQ_collection_append_strip(target, strips_to_delete);
@@ -629,7 +601,7 @@ void SEQ_transform_handle_overlap(Scene *scene,
* In some cases other strips can be overlapping still, see T90646. */
Sequence *seq;
SEQ_ITERATOR_FOREACH (seq, transformed_strips) {
- if (SEQ_transform_test_overlap(seqbasep, seq)) {
+ if (SEQ_transform_test_overlap(scene, seqbasep, seq)) {
SEQ_transform_seqbase_shuffle(seqbasep, seq, scene);
}
seq->flag &= ~SEQ_OVERLAP;
@@ -642,7 +614,7 @@ void SEQ_transform_offset_after_frame(Scene *scene,
const int timeline_frame)
{
LISTBASE_FOREACH (Sequence *, seq, seqbase) {
- if (SEQ_time_left_handle_frame_get(seq) >= timeline_frame) {
+ if (SEQ_time_left_handle_frame_get(scene, seq) >= timeline_frame) {
SEQ_transform_translate_sequence(scene, seq, delta);
SEQ_relations_invalidate_cache_preprocessed(scene, seq);
}