[Bf-blender-cvs] [b63872c] free-refcount-ids: Free IDs: MovieClip & Mask.
Bastien Montagne
noreply at git.blender.org
Thu Oct 1 17:44:27 CEST 2015
Commit: b63872cd5e199614b65aed3df2168e4c41cb0f3b
Author: Bastien Montagne
Date: Thu Oct 1 17:38:04 2015 +0200
Branches: free-refcount-ids
https://developer.blender.org/rBb63872cd5e199614b65aed3df2168e4c41cb0f3b
Free IDs: MovieClip & Mask.
Mask freeing was doing really bad (as in, not consistent with other ID freeing code) things (unlinking, and even not freeing animdata!).
===================================================================
M source/blender/blenkernel/BKE_mask.h
M source/blender/blenkernel/BKE_movieclip.h
M source/blender/blenkernel/intern/library.c
M source/blender/blenkernel/intern/mask.c
M source/blender/blenkernel/intern/movieclip.c
M source/blender/blenkernel/intern/sequencer.c
M source/blender/compositor/operations/COM_MaskOperation.cpp
M source/blender/makesrna/intern/rna_main_api.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_mask.h b/source/blender/blenkernel/BKE_mask.h
index 2f85db4..cc74869 100644
--- a/source/blender/blenkernel/BKE_mask.h
+++ b/source/blender/blenkernel/BKE_mask.h
@@ -123,8 +123,8 @@ struct Mask *BKE_mask_new(struct Main *bmain, const char *name);
struct Mask *BKE_mask_copy_nolib(struct Mask *mask);
struct Mask *BKE_mask_copy(struct Mask *mask);
-void BKE_mask_free_nolib(struct Mask *mask);
-void BKE_mask_free(struct Main *bmain, struct Mask *mask);
+void BKE_mask_free(struct Mask *mask, const bool do_id_user);
+void BKE_mask_unlink(struct Main *bmain, struct Mask *mask);
void BKE_mask_coord_from_frame(float r_co[2], const float co[2], const float frame_size[2]);
void BKE_mask_coord_from_movieclip(struct MovieClip *clip, struct MovieClipUser *user, float r_co[2], const float co[2]);
diff --git a/source/blender/blenkernel/BKE_movieclip.h b/source/blender/blenkernel/BKE_movieclip.h
index 7d76752..35d1e7e 100644
--- a/source/blender/blenkernel/BKE_movieclip.h
+++ b/source/blender/blenkernel/BKE_movieclip.h
@@ -39,7 +39,8 @@ struct MovieClipScopes;
struct MovieClipUser;
struct MovieDistortion;
-void BKE_movieclip_free(struct MovieClip *clip);
+void BKE_movieclip_release_datablocks(struct MovieClip *clip);
+void BKE_movieclip_free(struct MovieClip *clip, const bool do_id_user);
void BKE_movieclip_unlink(struct Main *bmain, struct MovieClip *clip);
struct MovieClip *BKE_movieclip_file_add(struct Main *bmain, const char *name);
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 43fe5f4..2f640e1 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -1031,10 +1031,10 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, bool do_id_user)
BKE_gpencil_free((bGPdata *)id, do_id_user);
break;
case ID_MC:
- BKE_movieclip_free((MovieClip *)id);
+ BKE_movieclip_free((MovieClip *)id, do_id_user);
break;
case ID_MSK:
- BKE_mask_free(bmain, (Mask *)id);
+ BKE_mask_free((Mask *)id, do_id_user);
break;
case ID_LS:
BKE_linestyle_free((FreestyleLineStyle *)id, do_id_user);
diff --git a/source/blender/blenkernel/intern/mask.c b/source/blender/blenkernel/intern/mask.c
index 141597e..accacb8 100644
--- a/source/blender/blenkernel/intern/mask.c
+++ b/source/blender/blenkernel/intern/mask.c
@@ -1016,13 +1016,15 @@ void BKE_mask_layer_free_list(ListBase *masklayers)
}
}
-/** free for temp copy, but don't manage unlinking from other pointers */
-void BKE_mask_free_nolib(Mask *mask)
+void BKE_mask_free(Mask *mask, const bool UNUSED(do_id_user))
{
+ BKE_animdata_free((ID *)mask);
+
+ /* free mask data */
BKE_mask_layer_free_list(&mask->masklayers);
}
-void BKE_mask_free(Main *bmain, Mask *mask)
+void BKE_mask_unlink(Main *bmain, Mask *mask)
{
bScreen *scr;
ScrArea *area;
@@ -1073,9 +1075,6 @@ void BKE_mask_free(Main *bmain, Mask *mask)
FOREACH_NODETREE(bmain, ntree, id) {
BKE_node_tree_unlink_id((ID *)mask, ntree);
} FOREACH_NODETREE_END
-
- /* free mask data */
- BKE_mask_layer_free_list(&mask->masklayers);
}
void BKE_mask_coord_from_frame(float r_co[2], const float co[2], const float frame_size[2])
diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c
index 7a8c4ad..06e1036 100644
--- a/source/blender/blenkernel/intern/movieclip.c
+++ b/source/blender/blenkernel/intern/movieclip.c
@@ -44,6 +44,7 @@
#include "MEM_guardedalloc.h"
#include "DNA_constraint_types.h"
+#include "DNA_gpencil_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_movieclip_types.h"
@@ -1402,8 +1403,32 @@ void BKE_movieclip_build_proxy_frame_for_ibuf(MovieClip *clip, ImBuf *ibuf, stru
}
}
-void BKE_movieclip_free(MovieClip *clip)
+/**
+ * Release all datablocks (ID) used by this clip (datablocks are never freed, they are just unreferenced).
+ *
+ * \param clip The clip which has to release its data.
+ */
+void BKE_movieclip_release_datablocks(MovieClip *clip)
+{
+ if (clip->gpd) {
+ id_us_min(&clip->gpd->id);
+ clip->gpd = NULL;
+ }
+}
+
+/**
+ * Free (or release) any data used by this lamp (does not free the lamp itself).
+ *
+ * \param la The lamp to free.
+ * \param do_id_user When \a true, ID datablocks used (referenced) by this lamp are 'released'
+ * (their user count is decreased).
+ */
+void BKE_movieclip_free(MovieClip *clip, const bool do_id_user)
{
+ if (do_id_user) {
+ BKE_movieclip_release_datablocks(clip);
+ }
+
free_buffers(clip);
BKE_tracking_free(&clip->tracking);
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index daabacb..f7ec7d4 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -3022,7 +3022,7 @@ static ImBuf *seq_render_mask(const SeqRenderData *context, Mask *mask, float nr
BKE_maskrasterize_handle_init(mr_handle, mask_temp, context->rectx, context->recty, true, true, true);
- BKE_mask_free_nolib(mask_temp);
+ BKE_mask_free(mask_temp, false);
MEM_freeN(mask_temp);
BKE_maskrasterize_buffer(mr_handle, context->rectx, context->recty, maskbuf);
diff --git a/source/blender/compositor/operations/COM_MaskOperation.cpp b/source/blender/compositor/operations/COM_MaskOperation.cpp
index 220b4e9..5202134 100644
--- a/source/blender/compositor/operations/COM_MaskOperation.cpp
+++ b/source/blender/compositor/operations/COM_MaskOperation.cpp
@@ -94,7 +94,7 @@ void MaskOperation::initExecution()
frame_iter += frame_step;
}
- BKE_mask_free_nolib(mask_temp);
+ BKE_mask_free(mask_temp, false);
MEM_freeN(mask_temp);
}
}
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index 6e9f61a..fcac879 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -709,7 +709,7 @@ static Mask *rna_Main_mask_new(Main *bmain, const char *name)
static void rna_Main_masks_remove(Main *bmain, PointerRNA *mask_ptr)
{
Mask *mask = mask_ptr->data;
- BKE_mask_free(bmain, mask);
+ BKE_mask_unlink(bmain, mask);
BKE_libblock_free(bmain, mask);
RNA_POINTER_INVALIDATE(mask_ptr);
}
More information about the Bf-blender-cvs
mailing list