Blender  V2.93
main.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19 
26 #include <string.h>
27 
28 #include "MEM_guardedalloc.h"
29 
30 #include "BLI_blenlib.h"
31 #include "BLI_ghash.h"
32 #include "BLI_mempool.h"
33 #include "BLI_threads.h"
34 
35 #include "DNA_ID.h"
36 
37 #include "BKE_global.h"
38 #include "BKE_lib_id.h"
39 #include "BKE_lib_query.h"
40 #include "BKE_main.h"
41 
42 #include "IMB_imbuf.h"
43 #include "IMB_imbuf_types.h"
44 
46 {
47  Main *bmain = MEM_callocN(sizeof(Main), "new main");
48  bmain->lock = MEM_mallocN(sizeof(SpinLock), "main lock");
49  BLI_spin_init((SpinLock *)bmain->lock);
50  return bmain;
51 }
52 
53 void BKE_main_free(Main *mainvar)
54 {
55  /* also call when reading a file, erase all, etc */
56  ListBase *lbarray[INDEX_ID_MAX];
57  int a;
58 
59  /* Since we are removing whole main, no need to bother 'properly'
60  * (and slowly) removing each ID from it. */
61  const int free_flag = (LIB_ID_FREE_NO_MAIN | LIB_ID_FREE_NO_UI_USER |
63 
64  MEM_SAFE_FREE(mainvar->blen_thumb);
65 
66  a = set_listbasepointers(mainvar, lbarray);
67  while (a--) {
68  ListBase *lb = lbarray[a];
69  ID *id, *id_next;
70 
71  for (id = lb->first; id != NULL; id = id_next) {
72  id_next = id->next;
73 #if 1
74  BKE_id_free_ex(mainvar, id, free_flag, false);
75 #else
76  /* errors freeing ID's can be hard to track down,
77  * enable this so valgrind will give the line number in its error log */
78  switch (a) {
79  case 0:
80  BKE_id_free_ex(mainvar, id, free_flag, false);
81  break;
82  case 1:
83  BKE_id_free_ex(mainvar, id, free_flag, false);
84  break;
85  case 2:
86  BKE_id_free_ex(mainvar, id, free_flag, false);
87  break;
88  case 3:
89  BKE_id_free_ex(mainvar, id, free_flag, false);
90  break;
91  case 4:
92  BKE_id_free_ex(mainvar, id, free_flag, false);
93  break;
94  case 5:
95  BKE_id_free_ex(mainvar, id, free_flag, false);
96  break;
97  case 6:
98  BKE_id_free_ex(mainvar, id, free_flag, false);
99  break;
100  case 7:
101  BKE_id_free_ex(mainvar, id, free_flag, false);
102  break;
103  case 8:
104  BKE_id_free_ex(mainvar, id, free_flag, false);
105  break;
106  case 9:
107  BKE_id_free_ex(mainvar, id, free_flag, false);
108  break;
109  case 10:
110  BKE_id_free_ex(mainvar, id, free_flag, false);
111  break;
112  case 11:
113  BKE_id_free_ex(mainvar, id, free_flag, false);
114  break;
115  case 12:
116  BKE_id_free_ex(mainvar, id, free_flag, false);
117  break;
118  case 13:
119  BKE_id_free_ex(mainvar, id, free_flag, false);
120  break;
121  case 14:
122  BKE_id_free_ex(mainvar, id, free_flag, false);
123  break;
124  case 15:
125  BKE_id_free_ex(mainvar, id, free_flag, false);
126  break;
127  case 16:
128  BKE_id_free_ex(mainvar, id, free_flag, false);
129  break;
130  case 17:
131  BKE_id_free_ex(mainvar, id, free_flag, false);
132  break;
133  case 18:
134  BKE_id_free_ex(mainvar, id, free_flag, false);
135  break;
136  case 19:
137  BKE_id_free_ex(mainvar, id, free_flag, false);
138  break;
139  case 20:
140  BKE_id_free_ex(mainvar, id, free_flag, false);
141  break;
142  case 21:
143  BKE_id_free_ex(mainvar, id, free_flag, false);
144  break;
145  case 22:
146  BKE_id_free_ex(mainvar, id, free_flag, false);
147  break;
148  case 23:
149  BKE_id_free_ex(mainvar, id, free_flag, false);
150  break;
151  case 24:
152  BKE_id_free_ex(mainvar, id, free_flag, false);
153  break;
154  case 25:
155  BKE_id_free_ex(mainvar, id, free_flag, false);
156  break;
157  case 26:
158  BKE_id_free_ex(mainvar, id, free_flag, false);
159  break;
160  case 27:
161  BKE_id_free_ex(mainvar, id, free_flag, false);
162  break;
163  case 28:
164  BKE_id_free_ex(mainvar, id, free_flag, false);
165  break;
166  case 29:
167  BKE_id_free_ex(mainvar, id, free_flag, false);
168  break;
169  case 30:
170  BKE_id_free_ex(mainvar, id, free_flag, false);
171  break;
172  case 31:
173  BKE_id_free_ex(mainvar, id, free_flag, false);
174  break;
175  case 32:
176  BKE_id_free_ex(mainvar, id, free_flag, false);
177  break;
178  case 33:
179  BKE_id_free_ex(mainvar, id, free_flag, false);
180  break;
181  case 34:
182  BKE_id_free_ex(mainvar, id, free_flag, false);
183  break;
184  default:
186  break;
187  }
188 #endif
189  }
190  BLI_listbase_clear(lb);
191  }
192 
193  if (mainvar->relations) {
194  BKE_main_relations_free(mainvar);
195  }
196 
197  BLI_spin_end((SpinLock *)mainvar->lock);
198  MEM_freeN(mainvar->lock);
199  MEM_freeN(mainvar);
200 }
201 
202 void BKE_main_lock(struct Main *bmain)
203 {
204  BLI_spin_lock((SpinLock *)bmain->lock);
205 }
206 
207 void BKE_main_unlock(struct Main *bmain)
208 {
209  BLI_spin_unlock((SpinLock *)bmain->lock);
210 }
211 
213 {
214  MainIDRelations *bmain_relations = cb_data->user_data;
215  ID *id_self = cb_data->id_self;
216  ID **id_pointer = cb_data->id_pointer;
217  const int cb_flag = cb_data->cb_flag;
218 
219  if (*id_pointer) {
220  MainIDRelationsEntry **entry_p;
221 
222  /* Add `id_pointer` as child of `id_self`. */
223  {
224  if (!BLI_ghash_ensure_p(
225  bmain_relations->relations_from_pointers, id_self, (void ***)&entry_p)) {
226  *entry_p = MEM_callocN(sizeof(**entry_p), __func__);
227  (*entry_p)->session_uuid = id_self->session_uuid;
228  }
229  else {
230  BLI_assert((*entry_p)->session_uuid == id_self->session_uuid);
231  }
232  MainIDRelationsEntryItem *to_id_entry = BLI_mempool_alloc(bmain_relations->entry_items_pool);
233  to_id_entry->next = (*entry_p)->to_ids;
234  to_id_entry->id_pointer.to = id_pointer;
235  to_id_entry->session_uuid = (*id_pointer != NULL) ? (*id_pointer)->session_uuid :
237  to_id_entry->usage_flag = cb_flag;
238  (*entry_p)->to_ids = to_id_entry;
239  }
240 
241  /* Add `id_self` as parent of `id_pointer`. */
242  if (*id_pointer != NULL) {
243  if (!BLI_ghash_ensure_p(
244  bmain_relations->relations_from_pointers, *id_pointer, (void ***)&entry_p)) {
245  *entry_p = MEM_callocN(sizeof(**entry_p), __func__);
246  (*entry_p)->session_uuid = (*id_pointer)->session_uuid;
247  }
248  else {
249  BLI_assert((*entry_p)->session_uuid == (*id_pointer)->session_uuid);
250  }
252  bmain_relations->entry_items_pool);
253  from_id_entry->next = (*entry_p)->from_ids;
254  from_id_entry->id_pointer.from = id_self;
255  from_id_entry->session_uuid = id_self->session_uuid;
256  from_id_entry->usage_flag = cb_flag;
257  (*entry_p)->from_ids = from_id_entry;
258  }
259  }
260 
261  return IDWALK_RET_NOP;
262 }
263 
265 void BKE_main_relations_create(Main *bmain, const short flag)
266 {
267  if (bmain->relations != NULL) {
269  }
270 
271  bmain->relations = MEM_mallocN(sizeof(*bmain->relations), __func__);
275  sizeof(MainIDRelationsEntryItem), 128, 128, BLI_MEMPOOL_NOP);
276 
277  bmain->relations->flag = flag;
278 
279  ID *id;
280  FOREACH_MAIN_ID_BEGIN (bmain, id) {
281  const int idwalk_flag = IDWALK_READONLY |
282  ((flag & MAINIDRELATIONS_INCLUDE_UI) != 0 ? IDWALK_INCLUDE_UI : 0);
283 
284  /* Ensure all IDs do have an entry, even if they are not connected to any other. */
285  MainIDRelationsEntry **entry_p;
286  if (!BLI_ghash_ensure_p(bmain->relations->relations_from_pointers, id, (void ***)&entry_p)) {
287  *entry_p = MEM_callocN(sizeof(**entry_p), __func__);
288  (*entry_p)->session_uuid = id->session_uuid;
289  }
290  else {
291  BLI_assert((*entry_p)->session_uuid == id->session_uuid);
292  }
293 
295  NULL, id, main_relations_create_idlink_cb, bmain->relations, idwalk_flag);
296  }
298 }
299 
301 {
302  if (bmain->relations != NULL) {
303  if (bmain->relations->relations_from_pointers != NULL) {
305  }
307  MEM_freeN(bmain->relations);
308  bmain->relations = NULL;
309  }
310 }
311 
313 void BKE_main_relations_tag_set(struct Main *bmain,
314  const MainIDRelationsEntryTags tag,
315  const bool value)
316 {
317  if (bmain->relations == NULL) {
318  return;
319  }
320 
321  GHashIterator *gh_iter;
323  !BLI_ghashIterator_done(gh_iter);
324  BLI_ghashIterator_step(gh_iter)) {
326  if (value) {
327  entry->tags |= tag;
328  }
329  else {
330  entry->tags &= ~tag;
331  }
332  }
333  BLI_ghashIterator_free(gh_iter);
334 }
335 
343 {
344  if (gset == NULL) {
346  }
347 
348  ID *id;
349  FOREACH_MAIN_ID_BEGIN (bmain, id) {
350  BLI_gset_add(gset, id);
351  }
353  return gset;
354 }
355 
364 {
366 
367  if (bmain) {
368  MEM_SAFE_FREE(bmain->blen_thumb);
369  }
370 
371  if (img) {
372  const size_t sz = BLEN_THUMB_MEMSIZE(img->x, img->y);
373  data = MEM_mallocN(sz, __func__);
374 
375  IMB_rect_from_float(img); /* Just in case... */
376  data->width = img->x;
377  data->height = img->y;
378  memcpy(data->rect, img->rect, sz - sizeof(*data));
379  }
380 
381  if (bmain) {
382  bmain->blen_thumb = data;
383  }
384  return data;
385 }
386 
395 {
396  ImBuf *img = NULL;
397 
398  if (!data && bmain) {
399  data = bmain->blen_thumb;
400  }
401 
402  if (data) {
403  /* Note: we cannot use IMB_allocFromBuffer(), since it tries to dupalloc passed buffer,
404  * which will fail here (we do not want to pass the first two ints!). */
405  img = IMB_allocImBuf(
406  (unsigned int)data->width, (unsigned int)data->height, 32, IB_rect | IB_metadata);
407  memcpy(img->rect, data->rect, BLEN_THUMB_MEMSIZE(data->width, data->height) - sizeof(*data));
408  }
409 
410  return img;
411 }
412 
416 void BKE_main_thumbnail_create(struct Main *bmain)
417 {
418  MEM_SAFE_FREE(bmain->blen_thumb);
419 
421  bmain->blen_thumb->width = BLEN_THUMB_SIZE;
423 }
424 
428 const char *BKE_main_blendfile_path(const Main *bmain)
429 {
430  return bmain->name;
431 }
432 
440 {
442 }
443 
448 {
449  switch ((ID_Type)type) {
450  case ID_SCE:
451  return &(bmain->scenes);
452  case ID_LI:
453  return &(bmain->libraries);
454  case ID_OB:
455  return &(bmain->objects);
456  case ID_ME:
457  return &(bmain->meshes);
458  case ID_CU:
459  return &(bmain->curves);
460  case ID_MB:
461  return &(bmain->metaballs);
462  case ID_MA:
463  return &(bmain->materials);
464  case ID_TE:
465  return &(bmain->textures);
466  case ID_IM:
467  return &(bmain->images);
468  case ID_LT:
469  return &(bmain->lattices);
470  case ID_LA:
471  return &(bmain->lights);
472  case ID_CA:
473  return &(bmain->cameras);
474  case ID_IP:
475  return &(bmain->ipo);
476  case ID_KE:
477  return &(bmain->shapekeys);
478  case ID_WO:
479  return &(bmain->worlds);
480  case ID_SCR:
481  return &(bmain->screens);
482  case ID_VF:
483  return &(bmain->fonts);
484  case ID_TXT:
485  return &(bmain->texts);
486  case ID_SPK:
487  return &(bmain->speakers);
488  case ID_LP:
489  return &(bmain->lightprobes);
490  case ID_SO:
491  return &(bmain->sounds);
492  case ID_GR:
493  return &(bmain->collections);
494  case ID_AR:
495  return &(bmain->armatures);
496  case ID_AC:
497  return &(bmain->actions);
498  case ID_NT:
499  return &(bmain->nodetrees);
500  case ID_BR:
501  return &(bmain->brushes);
502  case ID_PA:
503  return &(bmain->particles);
504  case ID_WM:
505  return &(bmain->wm);
506  case ID_GD:
507  return &(bmain->gpencils);
508  case ID_MC:
509  return &(bmain->movieclips);
510  case ID_MSK:
511  return &(bmain->masks);
512  case ID_LS:
513  return &(bmain->linestyles);
514  case ID_PAL:
515  return &(bmain->palettes);
516  case ID_PC:
517  return &(bmain->paintcurves);
518  case ID_CF:
519  return &(bmain->cachefiles);
520  case ID_WS:
521  return &(bmain->workspaces);
522  case ID_HA:
523  return &(bmain->hairs);
524  case ID_PT:
525  return &(bmain->pointclouds);
526  case ID_VO:
527  return &(bmain->volumes);
528  case ID_SIM:
529  return &(bmain->simulations);
530  }
531  return NULL;
532 }
533 
545 {
546  /* Libraries may be accessed from pretty much any other ID. */
547  lb[INDEX_ID_LI] = &(bmain->libraries);
548 
549  lb[INDEX_ID_IP] = &(bmain->ipo);
550 
551  /* Moved here to avoid problems when freeing with animato (aligorith). */
552  lb[INDEX_ID_AC] = &(bmain->actions);
553 
554  lb[INDEX_ID_KE] = &(bmain->shapekeys);
555 
556  /* Referenced by gpencil, so needs to be before that to avoid crashes. */
557  lb[INDEX_ID_PAL] = &(bmain->palettes);
558 
559  /* Referenced by nodes, objects, view, scene etc, before to free after. */
560  lb[INDEX_ID_GD] = &(bmain->gpencils);
561 
562  lb[INDEX_ID_NT] = &(bmain->nodetrees);
563  lb[INDEX_ID_IM] = &(bmain->images);
564  lb[INDEX_ID_TE] = &(bmain->textures);
565  lb[INDEX_ID_MA] = &(bmain->materials);
566  lb[INDEX_ID_VF] = &(bmain->fonts);
567 
568  /* Important!: When adding a new object type,
569  * the specific data should be inserted here. */
570 
571  lb[INDEX_ID_AR] = &(bmain->armatures);
572 
573  lb[INDEX_ID_CF] = &(bmain->cachefiles);
574  lb[INDEX_ID_ME] = &(bmain->meshes);
575  lb[INDEX_ID_CU] = &(bmain->curves);
576  lb[INDEX_ID_MB] = &(bmain->metaballs);
577  lb[INDEX_ID_HA] = &(bmain->hairs);
578  lb[INDEX_ID_PT] = &(bmain->pointclouds);
579  lb[INDEX_ID_VO] = &(bmain->volumes);
580 
581  lb[INDEX_ID_LT] = &(bmain->lattices);
582  lb[INDEX_ID_LA] = &(bmain->lights);
583  lb[INDEX_ID_CA] = &(bmain->cameras);
584 
585  lb[INDEX_ID_TXT] = &(bmain->texts);
586  lb[INDEX_ID_SO] = &(bmain->sounds);
587  lb[INDEX_ID_GR] = &(bmain->collections);
588  lb[INDEX_ID_PAL] = &(bmain->palettes);
589  lb[INDEX_ID_PC] = &(bmain->paintcurves);
590  lb[INDEX_ID_BR] = &(bmain->brushes);
591  lb[INDEX_ID_PA] = &(bmain->particles);
592  lb[INDEX_ID_SPK] = &(bmain->speakers);
593  lb[INDEX_ID_LP] = &(bmain->lightprobes);
594 
595  lb[INDEX_ID_WO] = &(bmain->worlds);
596  lb[INDEX_ID_MC] = &(bmain->movieclips);
597  lb[INDEX_ID_SCR] = &(bmain->screens);
598  lb[INDEX_ID_OB] = &(bmain->objects);
599  lb[INDEX_ID_LS] = &(bmain->linestyles); /* referenced by scenes */
600  lb[INDEX_ID_SCE] = &(bmain->scenes);
601  lb[INDEX_ID_WS] = &(bmain->workspaces); /* before wm, so it's freed after it! */
602  lb[INDEX_ID_WM] = &(bmain->wm);
603  lb[INDEX_ID_MSK] = &(bmain->masks);
604  lb[INDEX_ID_SIM] = &(bmain->simulations);
605 
606  lb[INDEX_ID_NULL] = NULL;
607 
608  return (INDEX_ID_MAX - 1);
609 }
#define G_MAIN
Definition: BKE_global.h:232
@ LIB_ID_FREE_NO_UI_USER
Definition: BKE_lib_id.h:204
@ LIB_ID_FREE_NO_DEG_TAG
Definition: BKE_lib_id.h:202
@ LIB_ID_FREE_NO_USER_REFCOUNT
Definition: BKE_lib_id.h:193
@ LIB_ID_FREE_NO_MAIN
Definition: BKE_lib_id.h:188
#define MAIN_ID_SESSION_UUID_UNSET
Definition: BKE_lib_id.h:73
void BKE_id_free_ex(struct Main *bmain, void *idv, int flag, const bool use_flag_from_idtag)
@ IDWALK_INCLUDE_UI
@ IDWALK_READONLY
void BKE_library_foreach_ID_link(struct Main *bmain, struct ID *id, LibraryIDLinkCallback callback, void *user_data, int flag)
Definition: lib_query.c:322
@ IDWALK_RET_NOP
Definition: BKE_lib_query.h:97
#define FOREACH_MAIN_ID_END
Definition: BKE_main.h:250
@ MAINIDRELATIONS_INCLUDE_UI
Definition: BKE_main.h:113
MainIDRelationsEntryTags
Definition: BKE_main.h:92
#define BLEN_THUMB_SIZE
Definition: BKE_main.h:277
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
Definition: BKE_main.h:244
#define BLEN_THUMB_MEMSIZE(_x, _y)
Definition: BKE_main.h:279
#define BLI_assert_unreachable()
Definition: BLI_assert.h:96
#define BLI_assert(a)
Definition: BLI_assert.h:58
struct GSet GSet
Definition: BLI_ghash.h:189
void BLI_ghashIterator_step(GHashIterator *ghi)
Definition: BLI_ghash.c:1086
unsigned int BLI_ghashutil_ptrhash(const void *key)
BLI_INLINE bool BLI_ghashIterator_done(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.h:158
void BLI_ghashIterator_free(GHashIterator *ghi)
Definition: BLI_ghash.c:1105
BLI_INLINE void * BLI_ghashIterator_getValue(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.h:150
GHash * BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:718
GSet * BLI_gset_new(GSetHashFP hashfp, GSetCmpFP cmpfp, const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:1125
bool BLI_ghashutil_ptrcmp(const void *a, const void *b)
GHashIterator * BLI_ghashIterator_new(GHash *gh) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:1050
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
Definition: BLI_ghash.c:1008
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:851
bool BLI_gset_add(GSet *gs, void *key)
Definition: BLI_ghash.c:1160
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
Definition: BLI_listbase.h:128
@ BLI_MEMPOOL_NOP
Definition: BLI_mempool.h:77
BLI_mempool * BLI_mempool_create(unsigned int esize, unsigned int totelem, unsigned int pchunk, unsigned int flag) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
Definition: BLI_mempool.c:268
void * BLI_mempool_alloc(BLI_mempool *pool) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition: BLI_mempool.c:334
void BLI_mempool_destroy(BLI_mempool *pool) ATTR_NONNULL(1)
Definition: BLI_mempool.c:757
pthread_spinlock_t SpinLock
Definition: BLI_threads.h:111
void BLI_spin_init(SpinLock *spin)
Definition: threads.cc:447
void BLI_spin_unlock(SpinLock *spin)
Definition: threads.cc:480
void BLI_spin_lock(SpinLock *spin)
Definition: threads.cc:461
void BLI_spin_end(SpinLock *spin)
Definition: threads.cc:495
ID and Library types, which are fundamental for sdna.
@ INDEX_ID_TXT
Definition: DNA_ID.h:802
@ INDEX_ID_WM
Definition: DNA_ID.h:855
@ INDEX_ID_VO
Definition: DNA_ID.h:832
@ INDEX_ID_NULL
Definition: DNA_ID.h:858
@ INDEX_ID_GD
Definition: DNA_ID.h:791
@ INDEX_ID_CF
Definition: DNA_ID.h:818
@ INDEX_ID_PT
Definition: DNA_ID.h:831
@ INDEX_ID_GR
Definition: DNA_ID.h:841
@ INDEX_ID_LA
Definition: DNA_ID.h:834
@ INDEX_ID_LT
Definition: DNA_ID.h:833
@ INDEX_ID_PC
Definition: DNA_ID.h:846
@ INDEX_ID_MA
Definition: DNA_ID.h:813
@ INDEX_ID_IM
Definition: DNA_ID.h:808
@ INDEX_ID_OB
Definition: DNA_ID.h:840
@ INDEX_ID_ME
Definition: DNA_ID.h:827
@ INDEX_ID_SO
Definition: DNA_ID.h:803
@ INDEX_ID_VF
Definition: DNA_ID.h:801
@ INDEX_ID_MC
Definition: DNA_ID.h:809
@ INDEX_ID_MSK
Definition: DNA_ID.h:807
@ INDEX_ID_BR
Definition: DNA_ID.h:847
@ INDEX_ID_WS
Definition: DNA_ID.h:854
@ INDEX_ID_SIM
Definition: DNA_ID.h:819
@ INDEX_ID_SCR
Definition: DNA_ID.h:853
@ INDEX_ID_SPK
Definition: DNA_ID.h:836
@ INDEX_ID_MB
Definition: DNA_ID.h:829
@ INDEX_ID_CU
Definition: DNA_ID.h:828
@ INDEX_ID_LI
Definition: DNA_ID.h:781
@ INDEX_ID_IP
Definition: DNA_ID.h:784
@ INDEX_ID_NT
Definition: DNA_ID.h:797
@ INDEX_ID_WO
Definition: DNA_ID.h:815
@ INDEX_ID_MAX
Definition: DNA_ID.h:859
@ INDEX_ID_TE
Definition: DNA_ID.h:812
@ INDEX_ID_PAL
Definition: DNA_ID.h:845
@ INDEX_ID_LS
Definition: DNA_ID.h:814
@ INDEX_ID_SCE
Definition: DNA_ID.h:850
@ INDEX_ID_LP
Definition: DNA_ID.h:837
@ INDEX_ID_AC
Definition: DNA_ID.h:785
@ INDEX_ID_CA
Definition: DNA_ID.h:835
@ INDEX_ID_AR
Definition: DNA_ID.h:826
@ INDEX_ID_PA
Definition: DNA_ID.h:820
@ INDEX_ID_KE
Definition: DNA_ID.h:823
@ INDEX_ID_HA
Definition: DNA_ID.h:830
ID_Type
Definition: DNA_ID_enums.h:56
@ ID_WM
Definition: DNA_ID_enums.h:84
@ ID_CA
Definition: DNA_ID_enums.h:68
@ ID_AR
Definition: DNA_ID_enums.h:78
@ ID_MC
Definition: DNA_ID_enums.h:85
@ ID_CF
Definition: DNA_ID_enums.h:90
@ ID_LI
Definition: DNA_ID_enums.h:58
@ ID_TE
Definition: DNA_ID_enums.h:64
@ ID_IM
Definition: DNA_ID_enums.h:65
@ ID_VO
Definition: DNA_ID_enums.h:95
@ ID_WS
Definition: DNA_ID_enums.h:91
@ ID_NT
Definition: DNA_ID_enums.h:80
@ ID_LA
Definition: DNA_ID_enums.h:67
@ ID_KE
Definition: DNA_ID_enums.h:70
@ ID_TXT
Definition: DNA_ID_enums.h:74
@ ID_SO
Definition: DNA_ID_enums.h:76
@ ID_SCE
Definition: DNA_ID_enums.h:57
@ ID_LS
Definition: DNA_ID_enums.h:87
@ ID_MSK
Definition: DNA_ID_enums.h:86
@ ID_GD
Definition: DNA_ID_enums.h:83
@ ID_PAL
Definition: DNA_ID_enums.h:88
@ ID_BR
Definition: DNA_ID_enums.h:81
@ ID_LP
Definition: DNA_ID_enums.h:92
@ ID_HA
Definition: DNA_ID_enums.h:93
@ ID_WO
Definition: DNA_ID_enums.h:71
@ ID_SIM
Definition: DNA_ID_enums.h:96
@ ID_MA
Definition: DNA_ID_enums.h:63
@ ID_AC
Definition: DNA_ID_enums.h:79
@ ID_SCR
Definition: DNA_ID_enums.h:72
@ ID_VF
Definition: DNA_ID_enums.h:73
@ ID_ME
Definition: DNA_ID_enums.h:60
@ ID_IP
Definition: DNA_ID_enums.h:69
@ ID_GR
Definition: DNA_ID_enums.h:77
@ ID_SPK
Definition: DNA_ID_enums.h:75
@ ID_MB
Definition: DNA_ID_enums.h:62
@ ID_LT
Definition: DNA_ID_enums.h:66
@ ID_OB
Definition: DNA_ID_enums.h:59
@ ID_PA
Definition: DNA_ID_enums.h:82
@ ID_PT
Definition: DNA_ID_enums.h:94
@ ID_CU
Definition: DNA_ID_enums.h:61
@ ID_PC
Definition: DNA_ID_enums.h:89
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
struct ImBuf * IMB_allocImBuf(unsigned int x, unsigned int y, unsigned char planes, unsigned int flags)
Definition: allocimbuf.c:478
void IMB_rect_from_float(struct ImBuf *ibuf)
Definition: divers.c:720
Contains defines and structs used throughout the imbuf module.
@ IB_metadata
@ IB_rect
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
int set_listbasepointers(Main *bmain, ListBase *lb[INDEX_ID_MAX])
Definition: main.c:544
BlendThumbnail * BKE_main_thumbnail_from_imbuf(Main *bmain, ImBuf *img)
Definition: main.c:363
void BKE_main_relations_tag_set(struct Main *bmain, const MainIDRelationsEntryTags tag, const bool value)
Definition: main.c:313
void BKE_main_thumbnail_create(struct Main *bmain)
Definition: main.c:416
void BKE_main_unlock(struct Main *bmain)
Definition: main.c:207
const char * BKE_main_blendfile_path(const Main *bmain)
Definition: main.c:428
ImBuf * BKE_main_thumbnail_to_imbuf(Main *bmain, BlendThumbnail *data)
Definition: main.c:394
void BKE_main_lock(struct Main *bmain)
Definition: main.c:202
void BKE_main_relations_create(Main *bmain, const short flag)
Definition: main.c:265
GSet * BKE_main_gset_create(Main *bmain, GSet *gset)
Definition: main.c:342
ListBase * which_libbase(Main *bmain, short type)
Definition: main.c:447
static int main_relations_create_idlink_cb(LibraryIDLinkCallbackData *cb_data)
Definition: main.c:212
Main * BKE_main_new(void)
Definition: main.c:45
void BKE_main_free(Main *mainvar)
Definition: main.c:53
void BKE_main_relations_free(Main *bmain)
Definition: main.c:300
const char * BKE_main_blendfile_path_from_global(void)
Definition: main.c:439
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:45
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:47
static unsigned a[3]
Definition: RandGen.cpp:92
Definition: DNA_ID.h:273
unsigned int session_uuid
Definition: DNA_ID.h:312
void * next
Definition: DNA_ID.h:274
unsigned int * rect
void * first
Definition: DNA_listBase.h:47
struct MainIDRelationsEntryItem * next
Definition: BKE_main.h:64
union MainIDRelationsEntryItem::@40 id_pointer
struct BLI_mempool * entry_items_pool
Definition: BKE_main.h:108
struct GHash * relations_from_pointers
Definition: BKE_main.h:102
Definition: BKE_main.h:116
ListBase volumes
Definition: BKE_main.h:184
ListBase lightprobes
Definition: BKE_main.h:165
ListBase brushes
Definition: BKE_main.h:171
ListBase masks
Definition: BKE_main.h:178
ListBase scenes
Definition: BKE_main.h:146
ListBase wm
Definition: BKE_main.h:175
ListBase textures
Definition: BKE_main.h:153
ListBase actions
Definition: BKE_main.h:169
ListBase texts
Definition: BKE_main.h:163
ListBase meshes
Definition: BKE_main.h:149
ListBase movieclips
Definition: BKE_main.h:177
ListBase ipo
Definition: BKE_main.h:158
struct MainLock * lock
Definition: BKE_main.h:194
ListBase lights
Definition: BKE_main.h:156
ListBase paintcurves
Definition: BKE_main.h:174
ListBase fonts
Definition: BKE_main.h:162
ListBase nodetrees
Definition: BKE_main.h:170
BlendThumbnail * blen_thumb
Definition: BKE_main.h:143
ListBase particles
Definition: BKE_main.h:172
ListBase materials
Definition: BKE_main.h:152
ListBase linestyles
Definition: BKE_main.h:179
ListBase pointclouds
Definition: BKE_main.h:183
ListBase lattices
Definition: BKE_main.h:155
ListBase sounds
Definition: BKE_main.h:166
ListBase shapekeys
Definition: BKE_main.h:159
ListBase libraries
Definition: BKE_main.h:147
ListBase cameras
Definition: BKE_main.h:157
char name[1024]
Definition: BKE_main.h:118
ListBase armatures
Definition: BKE_main.h:168
ListBase speakers
Definition: BKE_main.h:164
ListBase curves
Definition: BKE_main.h:150
ListBase worlds
Definition: BKE_main.h:160
ListBase screens
Definition: BKE_main.h:161
ListBase workspaces
Definition: BKE_main.h:181
struct MainIDRelations * relations
Definition: BKE_main.h:192
ListBase palettes
Definition: BKE_main.h:173
ListBase hairs
Definition: BKE_main.h:182
ListBase metaballs
Definition: BKE_main.h:151
ListBase collections
Definition: BKE_main.h:167
ListBase simulations
Definition: BKE_main.h:185
ListBase images
Definition: BKE_main.h:154
ListBase gpencils
Definition: BKE_main.h:176
ListBase objects
Definition: BKE_main.h:148
ListBase cachefiles
Definition: BKE_main.h:180