Blender  V2.93
Classes | Macros | Typedefs | Enumerations | Functions
lib_query.c File Reference
#include <stdlib.h>
#include "DNA_anim_types.h"
#include "BLI_ghash.h"
#include "BLI_linklist_stack.h"
#include "BLI_listbase.h"
#include "BLI_utildefines.h"
#include "BKE_anim_data.h"
#include "BKE_idprop.h"
#include "BKE_idtype.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_main.h"
#include "BKE_node.h"

Go to the source code of this file.

Classes

struct  LibraryForeachIDData
 
struct  IDUsersIter
 

Macros

#define CALLBACK_INVOKE_ID(check_id, cb_flag)    BKE_LIB_FOREACHID_PROCESS_ID(&data, check_id, cb_flag)
 
#define CALLBACK_INVOKE(check_id_super, cb_flag)    BKE_LIB_FOREACHID_PROCESS(&data, check_id_super, cb_flag)
 

Typedefs

typedef struct LibraryForeachIDData LibraryForeachIDData
 
typedef struct IDUsersIter IDUsersIter
 

Enumerations

enum  { IDWALK_STOP = 1 << 0 }
 

Functions

bool BKE_lib_query_foreachid_process (LibraryForeachIDData *data, ID **id_pp, int cb_flag)
 
int BKE_lib_query_foreachid_process_flags_get (LibraryForeachIDData *data)
 
int BKE_lib_query_foreachid_process_callback_flag_override (LibraryForeachIDData *data, const int cb_flag, const bool do_replace)
 
static void library_foreach_ID_link (Main *bmain, ID *id_owner, ID *id, LibraryIDLinkCallback callback, void *user_data, int flag, LibraryForeachIDData *inherit_data)
 
void BKE_lib_query_idpropertiesForeachIDLink_callback (IDProperty *id_prop, void *user_data)
 
bool BKE_library_foreach_ID_embedded (LibraryForeachIDData *data, ID **id_pp)
 
void BKE_library_foreach_ID_link (Main *bmain, ID *id, LibraryIDLinkCallback callback, void *user_data, int flag)
 
void BKE_library_update_ID_link_user (ID *id_dst, ID *id_src, const int cb_flag)
 
bool BKE_library_id_can_use_idtype (ID *id_owner, const short id_type_used)
 
static int foreach_libblock_id_users_callback (LibraryIDLinkCallbackData *cb_data)
 
int BKE_library_ID_use_ID (ID *id_user, ID *id_used)
 
static bool library_ID_is_used (Main *bmain, void *idv, const bool check_linked)
 
bool BKE_library_ID_is_locally_used (Main *bmain, void *idv)
 
bool BKE_library_ID_is_indirectly_used (Main *bmain, void *idv)
 
void BKE_library_ID_test_usages (Main *bmain, void *idv, bool *is_used_local, bool *is_used_linked)
 
static void lib_query_unused_ids_tag_recurse (Main *bmain, const int tag, const bool do_local_ids, const bool do_linked_ids, ID *id, int *r_num_tagged)
 
void BKE_lib_query_unused_ids_tag (Main *bmain, const int tag, const bool do_local_ids, const bool do_linked_ids, const bool do_tag_recursive, int *r_num_tagged)
 
static int foreach_libblock_used_linked_data_tag_clear_cb (LibraryIDLinkCallbackData *cb_data)
 
void BKE_library_unused_linked_data_set_tag (Main *bmain, const bool do_init_tag)
 
void BKE_library_indirectly_used_data_tag_clear (Main *bmain)
 

Macro Definition Documentation

◆ CALLBACK_INVOKE

#define CALLBACK_INVOKE (   check_id_super,
  cb_flag 
)     BKE_LIB_FOREACHID_PROCESS(&data, check_id_super, cb_flag)

◆ CALLBACK_INVOKE_ID

#define CALLBACK_INVOKE_ID (   check_id,
  cb_flag 
)     BKE_LIB_FOREACHID_PROCESS_ID(&data, check_id, cb_flag)

Typedef Documentation

◆ IDUsersIter

typedef struct IDUsersIter IDUsersIter

◆ LibraryForeachIDData

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
IDWALK_STOP 

Definition at line 42 of file lib_query.c.

Function Documentation

◆ BKE_lib_query_foreachid_process()

bool BKE_lib_query_foreachid_process ( LibraryForeachIDData data,
ID **  id_pp,
int  cb_flag 
)

◆ BKE_lib_query_foreachid_process_callback_flag_override()

int BKE_lib_query_foreachid_process_callback_flag_override ( LibraryForeachIDData data,
const int  cb_flag,
const bool  do_replace 
)

Definition at line 128 of file lib_query.c.

References data.

Referenced by object_foreach_id().

◆ BKE_lib_query_foreachid_process_flags_get()

int BKE_lib_query_foreachid_process_flags_get ( LibraryForeachIDData data)

Definition at line 123 of file lib_query.c.

References data.

Referenced by object_foreach_id(), screen_foreach_id(), and window_manager_foreach_id().

◆ BKE_lib_query_idpropertiesForeachIDLink_callback()

void BKE_lib_query_idpropertiesForeachIDLink_callback ( IDProperty id_prop,
void *  user_data 
)

◆ BKE_lib_query_unused_ids_tag()

void BKE_lib_query_unused_ids_tag ( Main bmain,
const int  tag,
const bool  do_local_ids,
const bool  do_linked_ids,
const bool  do_tag_recursive,
int *  r_num_tagged 
)

Tag all unused IDs (a.k.a 'orphaned').

By default only tag IDs with 0 user count. If do_tag_recursive is set, it will check dependencies to detect all IDs that are not actually used in current file, including 'archipelagos‘ (i.e. set of IDs referencing each other in loops, but without any 'external’ valid usages.

Valid usages here are defined as ref-counting usages, which are not towards embedded or loop-back data.

Parameters
r_num_taggedIf non-NULL, must be a zero-initialized array of INDEX_ID_MAX integers. Number of tagged-as-unused IDs is then set for each type, and as total in INDEX_ID_NULL item.

Definition at line 726 of file lib_query.c.

References BKE_idtype_idcode_to_index(), BKE_main_relations_create(), BKE_main_relations_free(), FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, GS, id, ID_IS_LINKED, INDEX_ID_NULL, lib_query_unused_ids_tag_recurse(), ID::name, NULL, and ID::us.

Referenced by bpy_orphans_purge(), outliner_orphans_purge_exec(), and outliner_orphans_purge_invoke().

◆ BKE_library_foreach_ID_embedded()

bool BKE_library_foreach_ID_embedded ( LibraryForeachIDData data,
ID **  id_pp 
)

◆ BKE_library_foreach_ID_link()

void BKE_library_foreach_ID_link ( Main bmain,
ID id,
LibraryIDLinkCallback  callback,
void *  user_data,
int  flag 
)

◆ BKE_library_id_can_use_idtype()

bool BKE_library_id_can_use_idtype ( ID id_owner,
const short  id_type_used 
)

Say whether given id_owner may use (in any way) a data-block of id_type_used.

This is a 'simplified' abstract version of BKE_library_foreach_ID_link() above, quite useful to reduce useless iterations in some cases.

Definition at line 348 of file lib_query.c.

References BKE_animdata_from_id(), ELEM, GS, ID_AC, ID_AR, ID_BR, ID_CA, ID_CF, ID_CU, ID_GD, ID_GR, ID_HA, ID_IM, ID_IP, ID_KE, ID_LA, ID_LI, ID_LP, ID_LS, ID_LT, ID_MA, ID_MB, ID_MC, ID_ME, ID_MSK, ID_NT, ID_OB, ID_PA, ID_PAL, ID_PC, ID_PT, ID_SCE, ID_SCR, ID_SIM, ID_SO, ID_SPK, ID_TE, ID_TXT, ID_VF, ID_VO, ID_WM, ID_WO, ID_WS, ID::name, ntreeFromID(), and ID::properties.

Referenced by BKE_library_ID_test_usages(), libblock_remap_data(), and library_ID_is_used().

◆ BKE_library_ID_is_indirectly_used()

bool BKE_library_ID_is_indirectly_used ( Main bmain,
void *  idv 
)

◆ BKE_library_ID_is_locally_used()

bool BKE_library_ID_is_locally_used ( Main bmain,
void *  idv 
)

Check whether given ID is used locally (i.e. by another non-linked ID).

Definition at line 580 of file lib_query.c.

References library_ID_is_used().

◆ BKE_library_ID_test_usages()

void BKE_library_ID_test_usages ( Main bmain,
void *  idv,
bool *  is_used_local,
bool *  is_used_linked 
)

◆ BKE_library_ID_use_ID()

int BKE_library_ID_use_ID ( ID id_user,
ID id_used 
)

Return the number of times given id_user uses/references id_used.

Note
This only checks for pointer references of an ID, shallow usages (like e.g. by RNA paths, as done for FCurves) are not detected at all.
Parameters
id_userthe ID which is supposed to use (reference) id_used.
id_usedthe ID which is supposed to be used (referenced) by id_user.
Returns
the number of direct usages/references of id_used by id_user.

Definition at line 529 of file lib_query.c.

References BKE_library_foreach_ID_link(), IDUsersIter::count_direct, IDUsersIter::count_indirect, IDUsersIter::curr_id, foreach_libblock_id_users_callback(), IDUsersIter::id, IDWALK_READONLY, and NULL.

◆ BKE_library_indirectly_used_data_tag_clear()

void BKE_library_indirectly_used_data_tag_clear ( Main bmain)

Untag linked data blocks used by other untagged linked data-blocks. Used to detect data-blocks that we can forcefully make local (instead of copying them to later get rid of original): All data-blocks we want to make local are tagged by caller, after this function has ran caller knows data-blocks still tagged can directly be made local, since they are only used by other data-blocks that will also be made fully local.

Definition at line 836 of file lib_query.c.

References BKE_library_foreach_ID_link(), foreach_libblock_used_linked_data_tag_clear_cb(), id, IDWALK_READONLY, INDEX_ID_MAX, ID::lib, LIB_TAG_DOIT, LISTBASE_FOREACH, NULL, set_listbasepointers(), and ID::tag.

◆ BKE_library_unused_linked_data_set_tag()

void BKE_library_unused_linked_data_set_tag ( Main bmain,
const bool  do_init_tag 
)

Detect orphaned linked data blocks (i.e. linked data not used (directly or indirectly) in any way by any local data), including complex cases like 'linked archipelagoes', i.e. linked data-blocks that use each other in loops, which prevents their deletion by 'basic' usage checks.

Parameters
do_init_tagif true, all linked data are checked, if false, only linked data-blocks already tagged with LIB_TAG_DOIT are checked.

Definition at line 799 of file lib_query.c.

References BKE_library_foreach_ID_link(), foreach_libblock_used_linked_data_tag_clear_cb(), FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, id, IDWALK_READONLY, ID::lib, LIB_TAG_DOIT, LIB_TAG_INDIRECT, and ID::tag.

◆ BKE_library_update_ID_link_user()

void BKE_library_update_ID_link_user ( ID id_dst,
ID id_src,
const int  cb_flag 
)

re-usable function, use when replacing ID's

Definition at line 331 of file lib_query.c.

References id_us_ensure_real(), id_us_min(), id_us_plus(), IDWALK_CB_USER, and IDWALK_CB_USER_ONE.

Referenced by id_relink_to_newid_looper().

◆ foreach_libblock_id_users_callback()

static int foreach_libblock_id_users_callback ( LibraryIDLinkCallbackData cb_data)
static

◆ foreach_libblock_used_linked_data_tag_clear_cb()

static int foreach_libblock_used_linked_data_tag_clear_cb ( LibraryIDLinkCallbackData cb_data)
static

◆ lib_query_unused_ids_tag_recurse()

static void lib_query_unused_ids_tag_recurse ( Main bmain,
const int  tag,
const bool  do_local_ids,
const bool  do_linked_ids,
ID id,
int *  r_num_tagged 
)
static

◆ library_foreach_ID_link()

static void library_foreach_ID_link ( Main bmain,
ID id_owner,
ID id,
LibraryIDLinkCallback  callback,
void *  user_data,
int  flag,
LibraryForeachIDData inherit_data 
)
static

◆ library_ID_is_used()

static bool library_ID_is_used ( Main bmain,
void *  idv,
const bool  check_linked 
)
static