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
path: root/source
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-12-28 15:37:51 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-01-23 14:06:58 +0300
commit40cb41647e6404e9c61416fdeef5f12ed9663f33 (patch)
treec0d0da53f0335dda6c9b60ebf04b12ca864c06d3 /source
parentfc673a285fd8e3c4ecb9b661e95e52bf576caa60 (diff)
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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_sequencer.h10
-rw-r--r--source/blender/blenkernel/intern/seqeffects.c32
-rw-r--r--source/blender/blenkernel/intern/sequencer.c60
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c28
4 files changed, 56 insertions, 74 deletions
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, seqclipboard_ptr_store);
+ BKE_sequencer_base_clipboard_pointers_store(bmain, &seq->seqbase);
}
}
void BKE_sequencer_base_clipboard_pointers_restore(ListBase *seqbase, Main *bmain)
{
Sequence *seq;
for (seq = seqbase->first; seq; seq = seq->next) {
- BKE_sequence_clipboard_pointers_restore(seq, bmain);
+ sequence_clipboard_pointers(bmain, seq, seqclipboard_ptr_restore);
BKE_sequencer_base_clipboard_pointers_restore(&seq->seqbase, bmain);
}
}
@@ -2078,7 +2062,7 @@ void BKE_sequencer_proxy_rebuild_finish(SeqIndexBuildContext *context, bool stop
IMB_anim_index_rebuild_finish(context->index_context, stop);
}
- seq_free_sequence_recurse(NULL, context->seq);
+ seq_free_sequence_recurse(NULL, context->seq, true);
MEM_freeN(context);
}
@@ -5505,7 +5489,7 @@ static Sequence *seq_dupli(
struct SeqEffectHandle sh;
sh = BKE_sequence_get_effect(seq);
if (sh.copy)
- sh.copy(seq, seqn);
+ sh.copy(seq, seqn, flag);
seqn->strip->stripdata = NULL;
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index 6144c5273be..612382c2f91 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -51,7 +51,7 @@
#include "BKE_sequencer.h"
#include "BKE_report.h"
#include "BKE_sound.h"
-
+#include "BKE_library.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -3228,6 +3228,7 @@ static void seq_copy_del_sound(Scene *scene, Sequence *seq)
static int sequencer_copy_exec(bContext *C, wmOperator *op)
{
+ Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
Editing *ed = BKE_sequencer_editing_get(scene, false);
@@ -3240,7 +3241,7 @@ static int sequencer_copy_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- BKE_sequence_base_dupli_recursive(scene, scene, &nseqbase, ed->seqbasep, SEQ_DUPE_UNIQUE_NAME, 0);
+ BKE_sequence_base_dupli_recursive(scene, scene, &nseqbase, ed->seqbasep, SEQ_DUPE_UNIQUE_NAME, LIB_ID_CREATE_NO_USER_REFCOUNT);
/* To make sure the copied strips have unique names between each other add
* them temporarily to the end of the original seqbase. (bug 25932)
@@ -3265,16 +3266,14 @@ static int sequencer_copy_exec(bContext *C, wmOperator *op)
seqbase_clipboard_frame = scene->r.cfra;
/* Need to remove anything that references the current scene */
- {
- Sequence *seq;
- for (seq = seqbase_clipboard.first; seq; seq = seq->next) {
- seq_copy_del_sound(scene, seq);
- }
-
- /* duplicate pointers */
- BKE_sequencer_base_clipboard_pointers_store(&seqbase_clipboard);
+ for (Sequence *seq = seqbase_clipboard.first; seq; seq = seq->next) {
+ seq_copy_del_sound(scene, seq);
}
+ /* Replace datablock pointers with copies, to keep things working in case
+ * datablocks get deleted or another .blend file is openeded. */
+ BKE_sequencer_base_clipboard_pointers_store(bmain, &seqbase_clipboard);
+
return OPERATOR_FINISHED;
}
@@ -3306,7 +3305,12 @@ static int sequencer_paste_exec(bContext *C, wmOperator *UNUSED(op))
ED_sequencer_deselect_all(scene);
ofs = scene->r.cfra - seqbase_clipboard_frame;
+ /* Copy strips, temporarily restoring pointers to actual datablocks. This
+ * must happen on the clipboard itself, so that copying does user counting
+ * on the actual datablocks. */
+ BKE_sequencer_base_clipboard_pointers_restore(&seqbase_clipboard, bmain);
BKE_sequence_base_dupli_recursive(scene, scene, &nseqbase, &seqbase_clipboard, SEQ_DUPE_UNIQUE_NAME, 0);
+ BKE_sequencer_base_clipboard_pointers_store(bmain, &seqbase_clipboard);
/* transform pasted strips before adding */
if (ofs) {
@@ -3315,8 +3319,6 @@ static int sequencer_paste_exec(bContext *C, wmOperator *UNUSED(op))
}
}
- BKE_sequencer_base_clipboard_pointers_restore(&nseqbase, bmain);
-
for (iseq = nseqbase.first; iseq; iseq = iseq->next) {
BKE_sequence_sound_init(scene, iseq);
}
@@ -3709,7 +3711,7 @@ static int sequencer_change_effect_type_exec(bContext *C, wmOperator *op)
}
else {
sh = BKE_sequence_get_effect(seq);
- sh.free(seq);
+ sh.free(seq, true);
seq->type = new_type;