[Bf-blender-cvs] [40cb41647e6] blender2.7: Sequencer: refactor clipboard copy to no longer increase user count.

Brecht Van Lommel noreply at git.blender.org
Wed Jan 23 12:10:11 CET 2019


Commit: 40cb41647e6404e9c61416fdeef5f12ed9663f33
Author: Brecht Van Lommel
Date:   Fri Dec 28 13:37:51 2018 +0100
Branches: blender2.7
https://developer.blender.org/rB40cb41647e6404e9c61416fdeef5f12ed9663f33

Sequencer: refactor clipboard copy to no longer increase user count.

The clipboard is not a real user and should not be counted. Only on paste
should the user count increase.

This is part of D3621, and was implemented by Richard Antalik and me.

===================================================================

M	source/blender/blenkernel/BKE_sequencer.h
M	source/blender/blenkernel/intern/seqeffects.c
M	source/blender/blenkernel/intern/sequencer.c
M	source/blender/editors/space_sequencer/sequencer_edit.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index d395fca0bbd..2f78b363333 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -145,10 +145,10 @@ struct SeqEffectHandle {
 	void (*load)(struct Sequence *seq);
 
 	/* duplicate */
-	void (*copy)(struct Sequence *dst, struct Sequence *src);
+	void (*copy)(struct Sequence *dst, struct Sequence *src, const int flag);
 
 	/* destruct */
-	void (*free)(struct Sequence *seq);
+	void (*free)(struct Sequence *seq, const bool do_id_user);
 
 	/* returns: -1: no input needed,
 	 * 0: no early out,
@@ -226,12 +226,8 @@ int BKE_sequencer_recursive_apply(struct Sequence *seq, int (*apply_func)(struct
 
 void BKE_sequencer_free_clipboard(void);
 
-void BKE_sequence_clipboard_pointers_free(struct Sequence *seq);
-void BKE_sequence_clipboard_pointers_store(struct Sequence *seq);
-void BKE_sequence_clipboard_pointers_restore(struct Sequence *seq, struct Main *bmain);
-
 void BKE_sequencer_base_clipboard_pointers_free(struct ListBase *seqbase);
-void BKE_sequencer_base_clipboard_pointers_store(struct ListBase *seqbase);
+void BKE_sequencer_base_clipboard_pointers_store(struct Main *bmain, struct ListBase *seqbase);
 void BKE_sequencer_base_clipboard_pointers_restore(struct ListBase *seqbase, struct Main *bmain);
 
 void BKE_sequence_free(struct Scene *scene, struct Sequence *seq);
diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c
index c69f8ff074f..5ac83a65bb6 100644
--- a/source/blender/blenkernel/intern/seqeffects.c
+++ b/source/blender/blenkernel/intern/seqeffects.c
@@ -751,7 +751,7 @@ static void load_gammacross(Sequence *UNUSED(seq))
 {
 }
 
-static void free_gammacross(Sequence *UNUSED(seq))
+static void free_gammacross(Sequence *UNUSED(seq), const bool UNUSED(do_id_user))
 {
 }
 
@@ -1875,7 +1875,7 @@ static int num_inputs_wipe(void)
 	return 2;
 }
 
-static void free_wipe_effect(Sequence *seq)
+static void free_wipe_effect(Sequence *seq, const bool UNUSED(do_id_user))
 {
 	if (seq->effectdata)
 		MEM_freeN(seq->effectdata);
@@ -1883,7 +1883,7 @@ static void free_wipe_effect(Sequence *seq)
 	seq->effectdata = NULL;
 }
 
-static void copy_wipe_effect(Sequence *dst, Sequence *src)
+static void copy_wipe_effect(Sequence *dst, Sequence *src, const int UNUSED(flag))
 {
 	dst->effectdata = MEM_dupallocN(src->effectdata);
 }
@@ -2066,13 +2066,13 @@ static int num_inputs_transform(void)
 	return 1;
 }
 
-static void free_transform_effect(Sequence *seq)
+static void free_transform_effect(Sequence *seq, const bool UNUSED(do_id_user))
 {
 	if (seq->effectdata) MEM_freeN(seq->effectdata);
 	seq->effectdata = NULL;
 }
 
-static void copy_transform_effect(Sequence *dst, Sequence *src)
+static void copy_transform_effect(Sequence *dst, Sequence *src, const int UNUSED(flag))
 {
 	dst->effectdata = MEM_dupallocN(src->effectdata);
 }
@@ -2384,7 +2384,7 @@ static int num_inputs_glow(void)
 	return 1;
 }
 
-static void free_glow_effect(Sequence *seq)
+static void free_glow_effect(Sequence *seq, const bool UNUSED(do_id_user))
 {
 	if (seq->effectdata)
 		MEM_freeN(seq->effectdata);
@@ -2392,7 +2392,7 @@ static void free_glow_effect(Sequence *seq)
 	seq->effectdata = NULL;
 }
 
-static void copy_glow_effect(Sequence *dst, Sequence *src)
+static void copy_glow_effect(Sequence *dst, Sequence *src, const int UNUSED(flag))
 {
 	dst->effectdata = MEM_dupallocN(src->effectdata);
 }
@@ -2478,7 +2478,7 @@ static int num_inputs_color(void)
 	return 0;
 }
 
-static void free_solid_color(Sequence *seq)
+static void free_solid_color(Sequence *seq, const bool UNUSED(do_id_user))
 {
 	if (seq->effectdata)
 		MEM_freeN(seq->effectdata);
@@ -2486,7 +2486,7 @@ static void free_solid_color(Sequence *seq)
 	seq->effectdata = NULL;
 }
 
-static void copy_solid_color(Sequence *dst, Sequence *src)
+static void copy_solid_color(Sequence *dst, Sequence *src, const int UNUSED(flag))
 {
 	dst->effectdata = MEM_dupallocN(src->effectdata);
 }
@@ -2734,7 +2734,7 @@ static int num_inputs_speed(void)
 	return 1;
 }
 
-static void free_speed_effect(Sequence *seq)
+static void free_speed_effect(Sequence *seq, const bool UNUSED(do_id_user))
 {
 	SpeedControlVars *v = (SpeedControlVars *)seq->effectdata;
 	if (v->frameMap)
@@ -2744,7 +2744,7 @@ static void free_speed_effect(Sequence *seq)
 	seq->effectdata = NULL;
 }
 
-static void copy_speed_effect(Sequence *dst, Sequence *src)
+static void copy_speed_effect(Sequence *dst, Sequence *src, const int UNUSED(flag))
 {
 	SpeedControlVars *v;
 	dst->effectdata = MEM_dupallocN(src->effectdata);
@@ -2959,7 +2959,7 @@ static int num_inputs_gaussian_blur(void)
 	return 1;
 }
 
-static void free_gaussian_blur_effect(Sequence *seq)
+static void free_gaussian_blur_effect(Sequence *seq, const bool UNUSED(do_id_user))
 {
 	if (seq->effectdata)
 		MEM_freeN(seq->effectdata);
@@ -2967,7 +2967,7 @@ static void free_gaussian_blur_effect(Sequence *seq)
 	seq->effectdata = NULL;
 }
 
-static void copy_gaussian_blur_effect(Sequence *dst, Sequence *src)
+static void copy_gaussian_blur_effect(Sequence *dst, Sequence *src, const int UNUSED(flag))
 {
 	dst->effectdata = MEM_dupallocN(src->effectdata);
 }
@@ -3573,7 +3573,7 @@ static void load_noop(Sequence *UNUSED(seq))
 
 }
 
-static void free_noop(Sequence *UNUSED(seq))
+static void free_noop(Sequence *UNUSED(seq), const bool UNUSED(do_id_user))
 {
 
 }
@@ -3583,12 +3583,12 @@ static int num_inputs_default(void)
 	return 2;
 }
 
-static void copy_effect_default(Sequence *dst, Sequence *src)
+static void copy_effect_default(Sequence *dst, Sequence *src, const int UNUSED(flag))
 {
 	dst->effectdata = MEM_dupallocN(src->effectdata);
 }
 
-static void free_effect_default(Sequence *seq)
+static void free_effect_default(Sequence *seq, const bool UNUSED(do_id_user))
 {
 	if (seq->effectdata)
 		MEM_freeN(seq->effectdata);
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index 21d092e5fa3..92e974bd7f0 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -209,8 +209,7 @@ static void BKE_sequence_free_ex(Scene *scene, Sequence *seq, const bool do_cach
 
 	if (seq->type & SEQ_TYPE_EFFECT) {
 		struct SeqEffectHandle sh = BKE_sequence_get_effect(seq);
-
-		sh.free(seq);
+		sh.free(seq, do_id_user);
 	}
 
 	if (seq->sound && do_id_user) {
@@ -283,16 +282,16 @@ void BKE_sequence_free_anim(Sequence *seq)
 
 /* cache must be freed before calling this function
  * since it leaves the seqbase in an invalid state */
-static void seq_free_sequence_recurse(Scene *scene, Sequence *seq)
+static void seq_free_sequence_recurse(Scene *scene, Sequence *seq, const bool do_id_user)
 {
 	Sequence *iseq, *iseq_next;
 
 	for (iseq = seq->seqbase.first; iseq; iseq = iseq_next) {
 		iseq_next = iseq->next;
-		seq_free_sequence_recurse(scene, iseq);
+		seq_free_sequence_recurse(scene, iseq, do_id_user);
 	}
 
-	BKE_sequence_free_ex(scene, seq, false, true);
+	BKE_sequence_free_ex(scene, seq, false, do_id_user);
 }
 
 
@@ -312,7 +311,7 @@ void BKE_sequencer_free_clipboard(void)
 
 	for (seq = seqbase_clipboard.first; seq; seq = nseq) {
 		nseq = seq->next;
-		seq_free_sequence_recurse(NULL, seq);
+		seq_free_sequence_recurse(NULL, seq, false);
 	}
 	BLI_listbase_clear(&seqbase_clipboard);
 }
@@ -325,7 +324,7 @@ void BKE_sequencer_free_clipboard(void)
  * since those datablocks are fully out of Main lists).
  */
 #define ID_PT (*id_pt)
-static void seqclipboard_ptr_free(ID **id_pt)
+static void seqclipboard_ptr_free(Main *UNUSED(bmain), ID **id_pt)
 {
 	if (ID_PT) {
 		BLI_assert(ID_PT->newid != NULL);
@@ -333,7 +332,7 @@ static void seqclipboard_ptr_free(ID **id_pt)
 		ID_PT = NULL;
 	}
 }
-static void seqclipboard_ptr_store(ID **id_pt)
+static void seqclipboard_ptr_store(Main *UNUSED(bmain), ID **id_pt)
 {
 	if (ID_PT) {
 		ID *id_prev = ID_PT;
@@ -383,58 +382,43 @@ static void seqclipboard_ptr_restore(Main *bmain, ID **id_pt)
 			}
 		}
 
+		/* Replace with pointer to actual datablock. */
+		seqclipboard_ptr_free(bmain, id_pt);
 		ID_PT = id_restore;
 	}
 }
 #undef ID_PT
 
-void BKE_sequence_clipboard_pointers_free(Sequence *seq)
-{
-	seqclipboard_ptr_free((ID **)&seq->scene);
-	seqclipboard_ptr_free((ID **)&seq->scene_camera);
-	seqclipboard_ptr_free((ID **)&seq->clip);
-	seqclipboard_ptr_free((ID **)&seq->mask);
-	seqclipboard_ptr_free((ID **)&seq->sound);
-}
-void BKE_sequence_clipboard_pointers_store(Sequence *seq)
+static void sequence_clipboard_pointers(Main *bmain, Sequence *seq, void (*callback)(Main *, ID **))
 {
-	seqclipboard_ptr_store((ID **)&seq->scene);
-	seqclipboard_ptr_store((ID **)&seq->scene_camera);
-	seqclipboard_ptr_store((ID **)&seq->clip);
-	seqclipboard_ptr_store((ID **)&seq->mask);
-	seqclipboard_ptr_store((ID **)&seq->sound);
+	callback(bmain, (ID **)&seq->scene);
+	callback(bmain, (ID **)&seq->scene_camera);
+	callback(bmain, (ID **)&seq->clip);
+	callback(bmain, (ID **)&seq->mask);
+	callback(bmain, (ID **)&seq->sound);
 }
-void BKE_sequence_clipboard_pointers_restore(Sequence *seq, Main *bmain)
-{
-	seqclipboard_ptr_restore(bmain, (ID **)&seq->scene);
-	seqclipboard_ptr_restore(bmain, (ID **)&seq->scene_camera);
-	seqclipboard_ptr_restore(bmain, (ID **)&seq->clip);
-	seqclipboard_ptr_restore(bmain, (ID **)&seq->mask);
-	seqclipboard_ptr_restore(bmain, (ID **)&seq->sound);
-}
-
 /* recursive versions of functions above */
 void BKE_sequencer_base_clipboard_pointers_free(ListBase *seqbase)
 {
 	Sequence *seq;
 	for (seq = seqbase->first; seq; seq = seq->next) {
-		BKE_sequence_clipboard_pointers_free(seq);
+		sequence_clipboard_pointers(NULL, seq, seqclipboard_ptr_free);
 		BKE_sequencer_base_clipboard_pointers_free(&seq->seqbase);
 	}
 }
-void BKE_sequencer_base_clipboard_pointers_store(ListBase *seqbase)
+void BKE_sequencer_base_clipboard_pointers_store(Main *bmain, ListBase *seqbase)
 {
 	Sequence *seq;
 	for (seq = seqbase->first; seq; seq = seq->next) {
-		BKE_sequence_clipboard_pointers_store(seq);
-		BKE_sequencer_base_clipboard_pointers_store(&seq->seqbase);
+		sequence_clipboard_pointers(bmain, seq, seqclipb

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list