[Bf-blender-cvs] [5b02b24] free-refcount-ids: Free IDs: images & lamps.
Bastien Montagne
noreply at git.blender.org
Wed Sep 30 20:27:08 CEST 2015
Commit: 5b02b2429aee6cc9a3bb773f4d0e8c0b35340230
Author: Bastien Montagne
Date: Sun Sep 27 15:28:57 2015 +0200
Branches: free-refcount-ids
https://developer.blender.org/rB5b02b2429aee6cc9a3bb773f4d0e8c0b35340230
Free IDs: images & lamps.
===================================================================
M source/blender/blenkernel/BKE_image.h
M source/blender/blenkernel/BKE_lamp.h
M source/blender/blenkernel/intern/image.c
M source/blender/blenkernel/intern/lamp.c
M source/blender/blenkernel/intern/library.c
M source/blender/blenkernel/intern/material.c
M source/blender/editors/render/render_preview.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 94afc8a..baea56a 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -59,7 +59,7 @@ void BKE_image_free_packedfiles(struct Image *image);
void BKE_image_free_views(struct Image *image);
void BKE_image_free_buffers(struct Image *image);
/* call from library */
-void BKE_image_free(struct Image *image);
+void BKE_image_free(struct Image *image, const bool do_id_user);
typedef void (StampCallback)(void *data, const char *propname, char *propvalue, int len);
diff --git a/source/blender/blenkernel/BKE_lamp.h b/source/blender/blenkernel/BKE_lamp.h
index fb2c4da..5e20303 100644
--- a/source/blender/blenkernel/BKE_lamp.h
+++ b/source/blender/blenkernel/BKE_lamp.h
@@ -46,7 +46,8 @@ struct Lamp *BKE_lamp_add(struct Main *bmain, const char *name) ATTR_WARN_UNUSED
struct Lamp *BKE_lamp_copy(struct Lamp *la) ATTR_WARN_UNUSED_RESULT;
struct Lamp *localize_lamp(struct Lamp *la) ATTR_WARN_UNUSED_RESULT;
void BKE_lamp_make_local(struct Lamp *la);
-void BKE_lamp_free(struct Lamp *la);
+void BKE_lamp_release_datablocks(struct Lamp *la);
+void BKE_lamp_free(struct Lamp *la, const bool do_id_user);
void lamp_drivers_update(struct Scene *scene, struct Lamp *la, float ctime);
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 4a76c70..1c3c594 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -329,17 +329,39 @@ void BKE_image_free_buffers(Image *ima)
ima->ok = IMA_OK;
}
-/* called by library too, do not free ima itself */
-void BKE_image_free(Image *ima)
+#if 0 /* Not needed currently. */
+/**
+ * Release all datablocks (ID) used by this image (datablocks are never freed, they are just unreferenced).
+ *
+ * \param ima The image which has to release its data.
+ */
+void BKE_image_release_datablocks(Image *ima)
+{
+}
+#endif
+
+/**
+ * Free (or release) any data used by this image (does not free the image itself).
+ *
+ * \param ima The image to free.
+ * \param do_id_user When \a true, ID datablocks used (referenced) by this image are 'released'
+ * (their user count is decreased).
+ */
+void BKE_image_free(Image *ima, const bool UNUSED(do_id_user))
{
int a;
+#if 0
+ if (do_id_user) {
+ BKE_image_release_datablocks(ima);
+ }
+#endif
+
BKE_image_free_buffers(ima);
image_free_packedfiles(ima);
BKE_icon_id_delete(&ima->id);
- ima->id.icon_id = 0;
BKE_previewimg_free(&ima->preview);
@@ -351,7 +373,10 @@ void BKE_image_free(Image *ima)
}
image_free_views(ima);
- MEM_freeN(ima->stereo3d_format);
+ if (ima->stereo3d_format) {
+ MEM_freeN(ima->stereo3d_format);
+ ima->stereo3d_format = NULL;
+ }
}
/* only image block itself */
diff --git a/source/blender/blenkernel/intern/lamp.c b/source/blender/blenkernel/intern/lamp.c
index 44e35c6..f413879 100644
--- a/source/blender/blenkernel/intern/lamp.c
+++ b/source/blender/blenkernel/intern/lamp.c
@@ -210,30 +210,66 @@ void BKE_lamp_make_local(Lamp *la)
}
}
-void BKE_lamp_free(Lamp *la)
+/**
+ * Release all datablocks (ID) used by this lamp (datablocks are never freed, they are just unreferenced).
+ *
+ * \param la The lamp which has to release its data.
+ */
+void BKE_lamp_release_datablocks(Lamp *la)
{
MTex *mtex;
int a;
+ if (la == NULL)
+ return;
+
for (a = 0; a < MAX_MTEX; a++) {
mtex = la->mtex[a];
- if (mtex && mtex->tex) mtex->tex->id.us--;
- if (mtex) MEM_freeN(mtex);
+ if (mtex && mtex->tex) {
+ mtex->tex->id.us--;
+ mtex->tex = 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_lamp_free(Lamp *la, const bool do_id_user)
+{
+ MTex *mtex;
+ int a;
+
+ if (do_id_user) {
+ BKE_lamp_release_datablocks(la);
+ }
+
+ for (a = 0; a < MAX_MTEX; a++) {
+ mtex = la->mtex[a];
+ if (mtex) {
+ MEM_freeN(mtex);
+ la->mtex[a] = NULL;
+ }
}
BKE_animdata_free((ID *)la);
curvemapping_free(la->curfalloff);
+ la->curfalloff = NULL;
/* is no lib link block, but lamp extension */
if (la->nodetree) {
- ntreeFreeTree(la->nodetree);
+ ntreeFreeTree_ex(la->nodetree, do_id_user);
MEM_freeN(la->nodetree);
+ la->nodetree = NULL;
}
BKE_previewimg_free(&la->preview);
BKE_icon_id_delete(&la->id);
- la->id.icon_id = 0;
}
/* Calculate all drivers for lamps, see material_drivers_update for why this is a bad hack */
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index a83b1e0..06aebae 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -967,13 +967,13 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, bool do_id_user)
BKE_texture_free((Tex *)id, do_id_user);
break;
case ID_IM:
- BKE_image_free((Image *)id);
+ BKE_image_free((Image *)id, do_id_user);
break;
case ID_LT:
BKE_lattice_free((Lattice *)id);
break;
case ID_LA:
- BKE_lamp_free((Lamp *)id);
+ BKE_lamp_free((Lamp *)id, do_id_user);
break;
case ID_CA:
BKE_camera_free((Camera *) id);
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index d6654fb..b189dbd 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -146,6 +146,7 @@ void BKE_material_free(Material *ma, const bool do_id_user)
if (ma->nodetree) {
ntreeFreeTree_ex(ma->nodetree, do_id_user);
MEM_freeN(ma->nodetree);
+ ma->nodetree = NULL;
}
if (ma->texpaintslot) {
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 8a31bc0..e0394ab 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -876,7 +876,7 @@ static void shader_preview_free(void *customdata)
/* get rid of copied lamp */
BLI_remlink(&pr_main->lamp, sp->lampcopy);
- BKE_lamp_free(sp->lampcopy);
+ BKE_lamp_free(sp->lampcopy, false);
properties = IDP_GetProperties((ID *)sp->lampcopy, false);
if (properties) {
More information about the Bf-blender-cvs
mailing list