void *BKE_libblock_copy_nolib(ID *id) { ID *idn; size_t idn_len; idn = alloc_libblock_notest(GS(id->name)); assert(idn != NULL); BLI_strncpy(idn->name, id->name, sizeof(idn->name)); idn_len = MEM_allocN_len(idn); if ((int)idn_len - (int)sizeof(ID) > 0) { /* signed to allow neg result */ const char *cp = (const char *)id; char *cpn = (char *)idn; memcpy(cpn + sizeof(ID), cp + sizeof(ID), idn_len - sizeof(ID)); } id->newid = idn; idn->flag |= LIB_NEW; BKE_libblock_copy_data(idn, id, false); return idn; }
/* used everywhere in blenkernel and text.c */ void *alloc_libblock(ListBase *lb, short type, const char *name) { ID *id= NULL; id= alloc_libblock_notest(type); if(id) { BLI_addtail(lb, id); id->us= 1; id->icon_id = 0; *( (short *)id->name )= type; new_id(lb, id, name); /* alphabetic insterion: is in new_id */ } return id; }
/** * Allocates and returns a block of the specified type, with the specified name * (adjusted as necessary to ensure uniqueness), and appended to the specified list. * The user count is set to 1, all other content (apart from name and links) being * initialized to zero. */ void *BKE_libblock_alloc(Main *bmain, short type, const char *name) { ID *id = NULL; ListBase *lb = which_libbase(bmain, type); id = alloc_libblock_notest(type); if (id) { BLI_addtail(lb, id); id->us = 1; id->icon_id = 0; *( (short *)id->name) = type; new_id(lb, id, name); /* alphabetic insertion: is in new_id */ } DAG_id_type_tag(bmain, type); return id; }