From b825a95ec311a169d33fe21e28418f11a516c82f Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 6 Mar 2020 17:11:55 +0100 Subject: Cleanup: Image: Move to IDTypeInfo and remove unused BKE API. --- source/blender/blenkernel/BKE_idtype.h | 2 +- source/blender/blenkernel/BKE_image.h | 8 -- source/blender/blenkernel/intern/idtype.c | 2 +- source/blender/blenkernel/intern/image.c | 174 +++++++++++++---------- source/blender/blenkernel/intern/lib_id.c | 8 +- source/blender/blenkernel/intern/lib_id_delete.c | 3 +- source/blender/editors/gpencil/gpencil_fill.c | 3 + 7 files changed, 106 insertions(+), 94 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_idtype.h b/source/blender/blenkernel/BKE_idtype.h index 8467eedc2e0..bd38b21749b 100644 --- a/source/blender/blenkernel/BKE_idtype.h +++ b/source/blender/blenkernel/BKE_idtype.h @@ -132,7 +132,7 @@ extern IDTypeInfo IDType_ID_CU; extern IDTypeInfo IDType_ID_MB; extern IDTypeInfo IDType_ID_MA; extern IDTypeInfo IDType_ID_TE; -// extern IDTypeInfo IDType_ID_IM; +extern IDTypeInfo IDType_ID_IM; extern IDTypeInfo IDType_ID_LT; extern IDTypeInfo IDType_ID_LA; extern IDTypeInfo IDType_ID_CA; diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h index 7ae01484d6f..a082e53cfc1 100644 --- a/source/blender/blenkernel/BKE_image.h +++ b/source/blender/blenkernel/BKE_image.h @@ -56,8 +56,6 @@ void BKE_image_free_buffers_ex(struct Image *image, bool do_lock); /* call from library */ void BKE_image_free(struct Image *image); -void BKE_image_init(struct Image *image); - typedef void(StampCallback)(void *data, const char *propname, char *propvalue, int len); void BKE_render_result_stamp_info(struct Scene *scene, @@ -142,8 +140,6 @@ struct anim *openanim_noload(const char *name, int streamindex, char colorspace[IMA_MAX_SPACE]); -void BKE_image_make_local(struct Main *bmain, struct Image *ima, const int flags); - void BKE_image_tag_time(struct Image *ima); /* ********************************** NEW IMAGE API *********************** */ @@ -287,10 +283,6 @@ void BKE_image_packfiles_from_mem(struct ReportList *reports, void BKE_image_print_memlist(struct Main *bmain); /* empty image block, of similar type and filename */ -void BKE_image_copy_data(struct Main *bmain, - struct Image *ima_dst, - const struct Image *ima_src, - const int flag); struct Image *BKE_image_copy(struct Main *bmain, const struct Image *ima); /* merge source into dest, and free source */ diff --git a/source/blender/blenkernel/intern/idtype.c b/source/blender/blenkernel/intern/idtype.c index d710e33bc16..322e1f7e822 100644 --- a/source/blender/blenkernel/intern/idtype.c +++ b/source/blender/blenkernel/intern/idtype.c @@ -59,7 +59,7 @@ static void id_type_init(void) INIT_TYPE(ID_MB); INIT_TYPE(ID_MA); INIT_TYPE(ID_TE); - // INIT_TYPE(ID_IM); + INIT_TYPE(ID_IM); INIT_TYPE(ID_LT); INIT_TYPE(ID_LA); INIT_TYPE(ID_CA); diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 76596e67718..7a697f19b8b 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -67,9 +67,12 @@ #include "BLI_timecode.h" /* for stamp timecode format */ #include "BLI_utildefines.h" +#include "BLT_translation.h" + #include "BKE_colortools.h" #include "BKE_global.h" #include "BKE_icons.h" +#include "BKE_idtype.h" #include "BKE_image.h" #include "BKE_lib_id.h" #include "BKE_main.h" @@ -103,6 +106,99 @@ static CLG_LogRef LOG = {"bke.image"}; static ThreadMutex *image_mutex; +static void image_init(Image *ima, short source, short type); +static void image_free_packedfiles(Image *ima); +static void copy_image_packedfiles(ListBase *lb_dst, const ListBase *lb_src); + +static void image_init_data(ID *id) +{ + Image *image = (Image *)id; + + if (image != NULL) { + image_init(image, IMA_SRC_GENERATED, IMA_TYPE_UV_TEST); + } +} + +static void image_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, const int flag) +{ + Image *image_dst = (Image *)id_dst; + const Image *image_src = (const Image *)id_src; + + BKE_color_managed_colorspace_settings_copy(&image_dst->colorspace_settings, + &image_src->colorspace_settings); + + copy_image_packedfiles(&image_dst->packedfiles, &image_src->packedfiles); + + image_dst->stereo3d_format = MEM_dupallocN(image_src->stereo3d_format); + BLI_duplicatelist(&image_dst->views, &image_src->views); + + /* Cleanup stuff that cannot be copied. */ + image_dst->cache = NULL; + image_dst->rr = NULL; + + BLI_duplicatelist(&image_dst->renderslots, &image_src->renderslots); + LISTBASE_FOREACH (RenderSlot *, slot, &image_dst->renderslots) { + slot->render = NULL; + } + + BLI_listbase_clear(&image_dst->anims); + + BLI_duplicatelist(&image_dst->tiles, &image_src->tiles); + + for (int i = 0; i < TEXTARGET_COUNT; i++) { + image_dst->gputexture[i] = NULL; + } + + if ((flag & LIB_ID_COPY_NO_PREVIEW) == 0) { + BKE_previewimg_id_copy(&image_dst->id, &image_src->id); + } + else { + image_dst->preview = NULL; + } +} + +static void image_free_data(ID *id) +{ + Image *image = (Image *)id; + + /* Also frees animdata. */ + BKE_image_free_buffers(image); + + image_free_packedfiles(image); + + LISTBASE_FOREACH (RenderSlot *, slot, &image->renderslots) { + if (slot->render) { + RE_FreeRenderResult(slot->render); + slot->render = NULL; + } + } + BLI_freelistN(&image->renderslots); + + BKE_image_free_views(image); + MEM_SAFE_FREE(image->stereo3d_format); + + BKE_icon_id_delete(&image->id); + BKE_previewimg_free(&image->preview); + + BLI_freelistN(&image->tiles); +} + +IDTypeInfo IDType_ID_IM = { + .id_code = ID_IM, + .id_filter = FILTER_ID_IM, + .main_listbase_index = INDEX_ID_IM, + .struct_size = sizeof(Image), + .name = "Image", + .name_plural = "images", + .translation_context = BLT_I18NCONTEXT_ID_IMAGE, + .flags = 0, + + .init_data = image_init_data, + .copy_data = image_copy_data, + .free_data = image_free_data, + .make_local = NULL, +}; + /* prototypes */ static int image_num_files(struct Image *ima); static ImBuf *image_acquire_ibuf(Image *ima, ImageUser *iuser, void **r_lock); @@ -286,26 +382,7 @@ void BKE_image_free_buffers(Image *ima) /** Free (or release) any data used by this image (does not free the image itself). */ void BKE_image_free(Image *ima) { - /* Also frees animdata. */ - BKE_image_free_buffers(ima); - - image_free_packedfiles(ima); - - LISTBASE_FOREACH (RenderSlot *, slot, &ima->renderslots) { - if (slot->render) { - RE_FreeRenderResult(slot->render); - slot->render = NULL; - } - } - BLI_freelistN(&ima->renderslots); - - BKE_image_free_views(ima); - MEM_SAFE_FREE(ima->stereo3d_format); - - BKE_icon_id_delete(&ima->id); - BKE_previewimg_free(&ima->preview); - - BLI_freelistN(&ima->tiles); + image_free_data(&ima->id); } /* only image block itself */ @@ -337,13 +414,6 @@ static void image_init(Image *ima, short source, short type) ima->stereo3d_format = MEM_callocN(sizeof(Stereo3dFormat), "Image Stereo Format"); } -void BKE_image_init(struct Image *image) -{ - if (image) { - image_init(image, IMA_SRC_GENERATED, IMA_TYPE_UV_TEST); - } -} - static Image *image_alloc(Main *bmain, const char *name, short source, short type) { Image *ima; @@ -409,51 +479,6 @@ static void copy_image_packedfiles(ListBase *lb_dst, const ListBase *lb_src) } } -/** - * Only copy internal data of Image ID from source - * to already allocated/initialized destination. - * You probably never want to use that directly, - * use #BKE_id_copy or #BKE_id_copy_ex for typical needs. - * - * WARNING! This function will not handle ID user count! - * - * \param flag: Copying options (see BKE_lib_id.h's LIB_ID_COPY_... flags for more). - */ -void BKE_image_copy_data(Main *UNUSED(bmain), Image *ima_dst, const Image *ima_src, const int flag) -{ - BKE_color_managed_colorspace_settings_copy(&ima_dst->colorspace_settings, - &ima_src->colorspace_settings); - - copy_image_packedfiles(&ima_dst->packedfiles, &ima_src->packedfiles); - - ima_dst->stereo3d_format = MEM_dupallocN(ima_src->stereo3d_format); - BLI_duplicatelist(&ima_dst->views, &ima_src->views); - - /* Cleanup stuff that cannot be copied. */ - ima_dst->cache = NULL; - ima_dst->rr = NULL; - - BLI_duplicatelist(&ima_dst->renderslots, &ima_src->renderslots); - LISTBASE_FOREACH (RenderSlot *, slot, &ima_dst->renderslots) { - slot->render = NULL; - } - - BLI_listbase_clear(&ima_dst->anims); - - BLI_duplicatelist(&ima_dst->tiles, &ima_src->tiles); - - for (int i = 0; i < TEXTARGET_COUNT; i++) { - ima_dst->gputexture[i] = NULL; - } - - if ((flag & LIB_ID_COPY_NO_PREVIEW) == 0) { - BKE_previewimg_id_copy(&ima_dst->id, &ima_src->id); - } - else { - ima_dst->preview = NULL; - } -} - /* empty image block, of similar type and filename */ Image *BKE_image_copy(Main *bmain, const Image *ima) { @@ -462,11 +487,6 @@ Image *BKE_image_copy(Main *bmain, const Image *ima) return ima_copy; } -void BKE_image_make_local(Main *bmain, Image *ima, const int flags) -{ - BKE_lib_id_make_local_generic(bmain, &ima->id, flags); -} - void BKE_image_merge(Main *bmain, Image *dest, Image *source) { /* sanity check */ diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c index c54b47c8c4b..252b2499905 100644 --- a/source/blender/blenkernel/intern/lib_id.c +++ b/source/blender/blenkernel/intern/lib_id.c @@ -488,9 +488,7 @@ bool BKE_lib_id_make_local(Main *bmain, ID *id, const bool test, const int flags BLI_assert(0); return true; case ID_IM: - if (!test) { - BKE_image_make_local(bmain, (Image *)id, flags); - } + BLI_assert(0); return true; case ID_LT: BLI_assert(0); @@ -717,7 +715,7 @@ bool BKE_id_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int flag) BLI_assert(0); break; case ID_IM: - BKE_image_copy_data(bmain, (Image *)*r_newid, (Image *)id, flag); + BLI_assert(0); break; case ID_LT: BLI_assert(0); @@ -1338,7 +1336,7 @@ void BKE_libblock_init_empty(ID *id) BLI_assert(0); break; case ID_IM: - BKE_image_init((Image *)id); + BLI_assert(0); break; case ID_LT: BLI_assert(0); diff --git a/source/blender/blenkernel/intern/lib_id_delete.c b/source/blender/blenkernel/intern/lib_id_delete.c index c238a0c1cf2..492de2b14ef 100644 --- a/source/blender/blenkernel/intern/lib_id_delete.c +++ b/source/blender/blenkernel/intern/lib_id_delete.c @@ -158,10 +158,9 @@ void BKE_libblock_free_datablock(ID *id, const int UNUSED(flag)) BLI_assert(0); break; case ID_TE: - BLI_assert(0); break; case ID_IM: - BKE_image_free((Image *)id); + BLI_assert(0); break; case ID_LT: BLI_assert(0); diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c index 44ff11aa84a..cf4ca80a331 100644 --- a/source/blender/editors/gpencil/gpencil_fill.c +++ b/source/blender/editors/gpencil/gpencil_fill.c @@ -1297,6 +1297,9 @@ static void gpencil_fill_exit(bContext *C, wmOperator *op) if (tgpf->ima) { for (Image *ima = bmain->images.first; ima; ima = ima->id.next) { if (ima == tgpf->ima) { + /* XXX This is super, super suspicious! + * There should NEVER be any need to handle datablocks in Main in such custom code. + * Please change to using BKE_id_free() or similar! */ BLI_remlink(&bmain->images, ima); BKE_image_free(tgpf->ima); MEM_SAFE_FREE(tgpf->ima); -- cgit v1.2.3