82#define DNA_DEPRECATED_ALLOW
136#define U (*((const UserDef *)&U))
141#define MEM_BUFFER_SIZE MEM_SIZE_OPTIMAL(1 << 17)
142#define MEM_CHUNK_SIZE MEM_SIZE_OPTIMAL(1 << 15)
144#define ZSTD_BUFFER_SIZE (1 << 21)
145#define ZSTD_CHUNK_SIZE (1 << 20)
147#define ZSTD_COMPRESSION_LEVEL 3
167 virtual bool open(
const char *filepath) = 0;
169 virtual bool write(
const void *buf,
size_t buf_len) = 0;
177 bool open(
const char *filepath)
override;
178 bool close()
override;
179 bool write(
const void *buf,
size_t buf_len)
override;
200 return (
::close(file_handle) != -1);
204 return ::write(file_handle, buf, buf_len) == buf_len;
219 bool write_error =
false;
224 bool open(
const char *filepath)
override;
225 bool close()
override;
226 bool write(
const void *buf,
size_t buf_len)
override;
229 struct ZstdWriteBlockTask;
230 void write_task(ZstdWriteBlockTask *task);
232 void write_seekable_frames();
245 task->ww->write_task(task);
250void ZstdWriteWrap::write_task(ZstdWriteBlockTask *task)
252 size_t out_buf_len = ZSTD_compressBound(task->size);
253 void *out_buf =
MEM_mallocN(out_buf_len,
"Zstd out buffer");
254 size_t out_size = ZSTD_compress(
261 while (next_frame != task->frame_number) {
265 if (ZSTD_isError(out_size)) {
269 if (base_wrap.
write(out_buf, out_size)) {
291 if (!base_wrap.
open(filepath)) {
304void ZstdWriteWrap::write_u32_le(
uint32_t val)
320void ZstdWriteWrap::write_seekable_frames()
323 write_u32_le(0x184D2A5E);
329 const uint32_t frame_size = num_frames * 8 + 9;
330 write_u32_le(frame_size);
334 write_u32_le(frame->compressed_size);
335 write_u32_le(frame->uncompressed_size);
339 write_u32_le(num_frames);
340 const char flags = 0;
341 base_wrap.
write(&flags, 1);
342 write_u32_le(0x8F92EAB1);
353 write_seekable_frames();
356 return base_wrap.
close() && !write_error;
368 memcpy(task->data, buf, buf_len);
369 task->size = buf_len;
370 task->frame_number = num_frames++;
417#ifdef USE_WRITE_DATA_LEN
464 WriteData *wd = MEM_new<WriteData>(__func__);
470 if ((ww ==
nullptr) || (ww->
use_buf)) {
491 if (memlen > INT_MAX) {
505 if (!wd->
ww->
write(mem, memlen)) {
553#ifdef USE_WRITE_DATA_LEN
554 wd->write_len +=
len;
572 adr = (
const char *)adr + writelen;
602 if (current !=
nullptr) {
651 const MemFileChunk *prev_memchunk = curr_memchunk !=
nullptr ?
654 if (curr_memchunk ==
nullptr || curr_memchunk->
id_session_uid != id->session_uid ||
655 (prev_memchunk !=
nullptr &&
714 "Same identifier (old address) used several times for a same ID, skipping this "
715 "block to avoid critical corruption of the Blender file.");
723 WriteData *wd,
int filecode,
const int struct_nr,
int nr,
const void *adr,
const void *data)
727 BLI_assert(struct_nr > 0 && struct_nr < SDNA_TYPE_MAX);
729 if (adr ==
nullptr || data ==
nullptr || nr == 0) {
754 WriteData *wd,
int filecode,
const int struct_nr,
int nr,
const void *adr)
766 if (adr ==
nullptr ||
len == 0) {
775 len = (
len + 3) & ~
size_t(3);
808static void writelist_id(
WriteData *wd,
int filecode,
const char *structname,
const ListBase *lb)
814 if (struct_nr == -1) {
815 printf(
"error: can't find SDNA code <%s>\n", structname);
827#define writestruct_at_address(wd, filecode, struct_id, nr, adr, data) \
828 writestruct_at_address_nr(wd, filecode, SDNA_TYPE_FROM_STRUCT(struct_id), nr, adr, data)
830#define writestruct(wd, filecode, struct_id, nr, adr) \
831 writestruct_nr(wd, filecode, SDNA_TYPE_FROM_STRUCT(struct_id), nr, adr)
859 if (use_active_win) {
868 if (window ==
nullptr) {
878 *r_scene = (window) ? window->
scene :
nullptr;
898 Scene *curscene =
nullptr;
907 data.
sfra = sce->r.sfra;
908 data.efra = sce->r.efra;
909 memset(data.scene_name, 0,
sizeof(data.scene_name));
911 STRNCPY(data.scene_name, sce->id.name + 2);
939 if (kmdi->remove_item) {
942 if (kmdi->add_item) {
1030 if (
main->curlib &&
main->curlib->packedfile) {
1040 while (!found_one && tot--) {
1041 for (
id =
static_cast<ID *
>(lbarray[tot]->first); id;
id =
static_cast<ID *
>(
id->next)) {
1060 void *runtime_name_data =
main->curlib->runtime.name_map;
1061 main->curlib->runtime.name_map =
nullptr;
1069 if (
main->curlib->packedfile) {
1078 for (
id =
static_cast<ID *
>(lbarray[a]->first); id;
id =
static_cast<ID *
>(
id->next)) {
1085 "Data-block '%s' from lib '%s' is not linkable, but is flagged as "
1088 main->curlib->runtime.filepath_abs);
1100#ifdef WITH_BUILDINFO
1120 memset(fg.
_pad, 0,
sizeof(fg.
_pad));
1133 fg.
fileflags = (fileflags & ~G_FILE_FLAG_ALL_RUNTIME);
1144 memcpy(fg.
subvstr, subvstr, 4);
1149#ifdef WITH_BUILDINFO
1178#define ID_BUFFER_STATIC_SIZE 8192
1188 if (id_type != id_buffer->
id_type) {
1189 const size_t idtype_struct_size = id_type->
struct_size;
1192 "ID maximum buffer size (%d bytes) is not big enough to fit IDs of type %s, "
1193 "which needs %lu bytes",
1196 idtype_struct_size);
1217 id->recalc_up_to_undo_push =
id->recalc_after_undo_push;
1218 id->recalc_after_undo_push = 0;
1224 memcpy(temp_id,
id, idtype_struct_size);
1238 temp_id->
prev =
nullptr;
1239 temp_id->
next =
nullptr;
1243 temp_id->
newid =
nullptr;
1261 const int cb_flag = cb_data->
cb_flag;
1343 id_iter->
tag &= ~ID_TAG_EXTERN;
1362 (
sizeof(
void *) == 8) ?
'-' :
'_',
1383 Main *bmain = mainvar;
1389 ID *
id =
static_cast<ID *
>(lbarray[a]->
first);
1391 if (
id ==
nullptr ||
GS(id->name) ==
ID_LI) {
1398 for (; id;
id =
static_cast<ID *
>(
id->next)) {
1429 Key *shape_key =
reinterpret_cast<Key *
>(id);
1433 if (shape_key->
from ==
nullptr || shape_key->
from->
us == 0) {
1445 const bool do_override = !
ELEM(override_storage,
nullptr, bmain) &&
1478 }
while ((bmain != override_storage) && (bmain = override_storage));
1482 if (override_storage) {
1484 override_storage =
nullptr;
1504 memset(&bhead, 0,
sizeof(
BHead));
1521 int version_number =
min_ii(99,
U.versions);
1523 if (version_number == 0) {
1527 if (strlen(filepath) < 2) {
1532 while (version_number > 1) {
1533 SNPRINTF(filepath_tmp1,
"%s%d", filepath, version_number - 1);
1535 SNPRINTF(filepath_tmp2,
"%s%d", filepath, version_number);
1547 SNPRINTF(filepath_tmp1,
"%s%d", filepath, version_number);
1566 reports,
RPT_DEBUG,
"Checking validity of current .blend file *BEFORE* save to disk");
1573 "Critical data corruption: Conflicts and/or otherwise invalid data-blocks names "
1574 "(see console for details)");
1590 reports,
RPT_DEBUG,
"Checking validity of current .blend file *BEFORE* save to disk");
1596 const char *filepath,
1597 const int write_flags,
1608 const bool use_save_versions =
params->use_save_versions;
1609 const bool use_save_as_copy =
params->use_save_as_copy;
1610 const bool use_userdef =
params->use_userdef;
1612 const bool relbase_valid = (mainvar->
filepath[0] !=
'\0');
1618 BKE_reportf(reports,
RPT_ERROR,
"Cannot save normal file (%s) as asset system file", tempname);
1623 void *path_list_backup =
nullptr;
1630 SNPRINTF(tempname,
"%s@", filepath);
1632 if (ww.
open(tempname) ==
false) {
1634 reports,
RPT_ERROR,
"Cannot open file %s for writing: %s", tempname, strerror(errno));
1640 if (relbase_valid ==
false) {
1649 if (relbase_valid ==
false) {
1659 if (relbase_valid) {
1671 if (relbase_valid && (
BLI_path_cmp(dir_dst, dir_src) == 0)) {
1677 if (relbase_valid ==
false) {
1688 char mainvar_filepath_orig[
FILE_MAX];
1697 switch (remap_mode) {
1723 mainvar, &ww,
nullptr,
nullptr, write_flags, use_userdef, thumb);
1741 if (use_save_versions) {
1765 const char *filepath,
1766 const int write_flags,
1782 bool use_userdef =
false;
1785 mainvar,
nullptr, compare, current, write_flags, use_userdef,
nullptr);
1796 return MEM_cnew<BLO_Write_IDBuffer>(__func__);
1813 if (
static_cast<void *
>((*id_buffer)->temp_id) != (*id_buffer)->id_buffer_static) {
1834 const char *struct_name,
1836 const void *data_ptr)
1853 const void *address,
1854 const void *data_ptr)
1861 BlendWriter *writer,
int filecode,
int struct_id,
const void *address,
const void *data_ptr)
1869 const void *data_ptr)
1875 BlendWriter *writer,
int struct_id,
int array_size,
const void *address,
const void *data_ptr)
1908 BLO_write_raw(writer,
sizeof(
char) *
size_t(num), data_ptr);
1933 BLO_write_raw(writer,
sizeof(
float) *
size_t(num), data_ptr);
1938 BLO_write_raw(writer,
sizeof(
double) *
size_t(num), data_ptr);
1943 BLO_write_raw(writer,
sizeof(
void *) *
size_t(num), data_ptr);
1948 BLO_write_raw(writer,
sizeof(
float[3]) *
size_t(num), data_ptr);
1953 if (data_ptr !=
nullptr) {
1960 const size_t approximate_size_in_bytes,
1964 if (data ==
nullptr) {
1969 if (sharing_info !=
nullptr) {
1971 memfile.
shared_storage = MEM_new<MemFileSharedStorage>(__func__);
1982 if (sharing_info !=
nullptr) {
void BKE_asset_catalog_path_list_blend_write(BlendWriter *writer, const ListBase &catalog_path_list)
#define BLENDER_FILE_SUBVERSION
#define BLENDER_FILE_MIN_VERSION
#define BLENDER_FILE_VERSION
#define BLENDER_FILE_MIN_SUBVERSION
void BKE_bpath_relative_convert(Main *bmain, const char *basedir, ReportList *reports, BPathSummary *r_summary=nullptr)
void * BKE_bpath_list_backup(Main *bmain, eBPathForeachFlag flag)
void BKE_bpath_absolute_convert(Main *bmain, const char *basedir, ReportList *reports, BPathSummary *r_summary=nullptr)
void BKE_bpath_list_restore(Main *bmain, eBPathForeachFlag flag, void *path_list_handle)
void BKE_bpath_relative_rebase(Main *bmain, const char *basedir_src, const char *basedir_dst, ReportList *reports, BPathSummary *r_summary=nullptr)
@ BKE_BPATH_FOREACH_PATH_SKIP_LINKED
@ BKE_BPATH_FOREACH_PATH_SKIP_MULTIFILE
void BKE_bpath_list_free(void *path_list_handle)
void IDP_BlendWrite(BlendWriter *writer, const IDProperty *prop)
@ IDTYPE_FLAGS_NEVER_UNUSED
const IDTypeInfo * BKE_idtype_get_info_from_id(const ID *id)
bool BKE_idtype_idcode_is_linkable(short idcode)
ViewLayer * BKE_view_layer_find(const Scene *scene, const char *layer_name)
void id_lib_extern(ID *id)
#define MAIN_ID_SESSION_UID_UNSET
void id_lib_indirect_weak_link(ID *id)
void BKE_id_blend_write(BlendWriter *writer, ID *id)
void BKE_main_id_refcount_recompute(Main *bmain, bool do_linked_only)
OverrideLibraryStorage * BKE_lib_override_library_operations_store_init()
ID * BKE_lib_override_library_operations_store_start(Main *bmain, OverrideLibraryStorage *liboverride_storage, ID *local)
void BKE_lib_override_library_operations_store_finalize(OverrideLibraryStorage *liboverride_storage)
void BKE_lib_override_library_operations_store_end(OverrideLibraryStorage *liboverride_storage, ID *local)
@ IDWALK_CB_DIRECT_WEAK_LINK
@ IDWALK_CB_INDIRECT_USAGE
void BKE_library_foreach_ID_link(Main *bmain, ID *id, blender::FunctionRef< LibraryIDLinkCallback > callback, void *user_data, int flag)
#define FOREACH_MAIN_ID_END
int set_listbasepointers(Main *bmain, ListBase *lb[])
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
bool BKE_main_namemap_validate_and_fix(Main *bmain) ATTR_NONNULL()
void BKE_packedfile_blend_write(BlendWriter *writer, const PackedFile *pf)
void BKE_preferences_extension_repo_write_data(struct BlendWriter *writer, const bUserExtensionRepo *repo)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
bScreen * BKE_workspace_active_screen_get(const WorkSpaceInstanceHook *hook) GETTER_ATTRS
#define BLI_assert_unreachable()
#define BLI_STATIC_ASSERT(a, msg)
#define BLI_assert_msg(a, msg)
BLI_INLINE void BLI_endian_switch_uint32(unsigned int *val) ATTR_NONNULL(1)
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
int BLI_rename_overwrite(const char *from, const char *to) ATTR_NONNULL()
int BLI_open(const char *filepath, int oflag, int pmode) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Single link-list utility macros. (header only api).
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
int BLI_path_normalize(char *path) ATTR_NONNULL(1)
bool BLI_path_is_abs_from_cwd(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool BLI_path_is_rel(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
void void BLI_path_split_dir_part(const char *filepath, char *dir, size_t dir_maxncpy) ATTR_NONNULL(1
#define STRNCPY(dst, src)
#define SNPRINTF(dst, format,...)
void BLI_condition_notify_all(ThreadCondition *cond)
void BLI_mutex_end(ThreadMutex *mutex)
void BLI_threadpool_remove(struct ListBase *threadbase, void *callerdata)
void BLI_condition_wait(ThreadCondition *cond, ThreadMutex *mutex)
void BLI_threadpool_init(struct ListBase *threadbase, void *(*do_thread)(void *), int tot)
void BLI_mutex_init(ThreadMutex *mutex)
pthread_cond_t ThreadCondition
void BLI_condition_end(ThreadCondition *cond)
int BLI_system_thread_count(void)
void BLI_threadpool_end(struct ListBase *threadbase)
void BLI_condition_init(ThreadCondition *cond)
void BLI_mutex_lock(ThreadMutex *mutex)
void BLI_mutex_unlock(ThreadMutex *mutex)
int BLI_available_threads(struct ListBase *threadbase)
void BLI_threadpool_insert(struct ListBase *threadbase, void *callerdata)
pthread_mutex_t ThreadMutex
Compatibility-like things for windows.
defines for blend-file codes.
#define BLEN_THUMB_MEMSIZE_FILE(_x, _y)
Utilities ensuring .blend file (i.e. Main) is in valid state during write and/or read process.
bool BLO_main_validate_libraries(Main *bmain, ReportList *reports)
bool BLO_main_validate_shapekeys(Main *bmain, ReportList *reports)
#define BLO_write_struct(writer, struct_name, data_ptr)
external readfile function prototypes.
void BLO_memfile_chunk_add(MemFileWriteData *mem_data, const char *buf, size_t size)
void BLO_memfile_write_init(MemFileWriteData *mem_data, MemFile *written_memfile, MemFile *reference_memfile)
void BLO_memfile_write_finalize(MemFileWriteData *mem_data)
external writefile.cc function prototypes.
@ BLO_WRITE_PATH_REMAP_NONE
@ BLO_WRITE_PATH_REMAP_RELATIVE_ALL
@ BLO_WRITE_PATH_REMAP_ABSOLUTE
@ BLO_WRITE_PATH_REMAP_RELATIVE
#define CLOG_ERROR(clg_ref,...)
#define CLOG_INFO(clg_ref, level,...)
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
#define ID_IS_LINKED(_id)
@ ID_FLAG_INDIRECT_WEAK_LINK
@ ID_TAG_NO_USER_REFCOUNT
#define ID_TAG_KEEP_ON_UNDO
#define ID_LINK_PLACEHOLDER
Object groups, one object can be in many groups at once.
blenloader genfile private function prototypes
const struct SDNA * DNA_sdna_current_get(void)
int DNA_struct_find_with_alias(const struct SDNA *sdna, const char *str)
int DNA_struct_size(const struct SDNA *sdna, int struct_index)
#define SDNA_RAW_DATA_STRUCT_INDEX
@ USER_MENU_TYPE_OPERATOR
#define USER_EXPERIMENTAL_TEST(userdef, member)
DrawDataList * DRW_drawdatalist_from_id(ID *id)
Read Guarded memory(de)allocation.
ulong build_commit_timestamp
bool write(const void *buf, size_t buf_len) override
bool open(const char *filepath) override
virtual bool open(const char *filepath)=0
virtual bool write(const void *buf, size_t buf_len)=0
ZstdWriteWrap(WriteWrap &base_wrap)
bool open(const char *filepath) override
bool write(const void *buf, size_t buf_len) override
bool add(const Key &key, const Value &value)
Value lookup_default(const Key &key, const Value &default_value) const
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
struct blender::compositor::@172::@174 task
void blo_split_main(ListBase *mainlist, Main *main)
void blo_join_main(ListBase *mainlist)
const IDTypeInfo * id_type
char id_buffer_static[ID_BUFFER_STATIC_SIZE]
struct ViewLayer * cur_view_layer
uint64_t build_commit_timestamp
struct bScreen * curscreen
IDTypeBlendWriteFunction blend_write
blender::Map< const void *, const blender::ImplicitSharingInfo * > map
blender::Map< uint, MemFileChunk * > id_session_uid_mapping
MemFile * written_memfile
uint current_id_session_uid
MemFileChunk * reference_current_chunk
MemFileSharedStorage * shared_storage
char scene_name[MAX_ID_NAME - 2]
ListBase script_directories
struct ListBase asset_shelves_settings
struct ListBase user_keymaps
struct ListBase autoexec_paths
struct ListBase user_keyconfig_prefs
struct ListBase extension_repos
struct ListBase user_menus
struct ListBase asset_libraries
blender::Set< const void * > per_id_addresses_set
blender::Set< const void * > per_id_written_shared_addresses
struct WriteData::@131 validation_data
struct WriteData::@130 buffer
uint32_t uncompressed_size
ZstdWriteBlockTask * prev
static void * write_task(void *userdata)
ZstdWriteBlockTask * next
struct WorkSpaceInstanceHook * workspace_hook
void BLO_write_double_array(BlendWriter *writer, uint num, const double *data_ptr)
void BLO_write_uint32_array(BlendWriter *writer, uint num, const uint32_t *data_ptr)
void BLO_write_struct_list_by_id(BlendWriter *writer, int struct_id, const ListBase *list)
int BLO_get_struct_id_by_name(const BlendWriter *writer, const char *struct_name)
static void mywrite_id_begin(WriteData *wd, ID *id)
#define ZSTD_COMPRESSION_LEVEL
static void write_thumb(WriteData *wd, const BlendThumbnail *thumb)
#define writestruct(wd, filecode, struct_id, nr, adr)
void BLO_write_float3_array(BlendWriter *writer, uint num, const float *data_ptr)
static void writelist_nr(WriteData *wd, int filecode, const int struct_nr, const ListBase *lb)
void BLO_write_struct_at_address_by_id_with_filecode(BlendWriter *writer, int filecode, int struct_id, const void *address, const void *data_ptr)
static bool write_at_address_validate(WriteData *wd, int filecode, const void *address)
static void writestruct_at_address_nr(WriteData *wd, int filecode, const int struct_nr, int nr, const void *adr, const void *data)
static void id_buffer_init_from_id(BLO_Write_IDBuffer *id_buffer, ID *id, const bool is_undo)
void BLO_write_struct_by_name(BlendWriter *writer, const char *struct_name, const void *data_ptr)
BLO_Write_IDBuffer * BLO_write_allocate_id_buffer()
static void id_buffer_init_for_id_type(BLO_Write_IDBuffer *id_buffer, const IDTypeInfo *id_type)
static void writedata_free(WriteData *wd)
void BLO_write_int32_array(BlendWriter *writer, uint num, const int32_t *data_ptr)
static void write_keymapitem(BlendWriter *writer, const wmKeyMapItem *kmi)
void blo_write_id_struct(BlendWriter *writer, int struct_id, const void *id_address, const ID *id)
void BLO_write_uint8_array(BlendWriter *writer, uint num, const uint8_t *data_ptr)
static bool do_history(const char *filepath, ReportList *reports)
static void write_renderinfo(WriteData *wd, Main *mainvar)
static void write_userdef(BlendWriter *writer, const UserDef *userdef)
static void write_libraries(WriteData *wd, Main *main)
static void write_file_main_validate_pre(Main *bmain, ReportList *reports)
#define ID_BUFFER_STATIC_SIZE
void BLO_write_init_id_buffer_from_id(BLO_Write_IDBuffer *id_buffer, ID *id, const bool is_undo)
void BLO_write_struct_array_by_id(BlendWriter *writer, int struct_id, int array_size, const void *data_ptr)
static void write_file_main_validate_post(Main *bmain, ReportList *reports)
static void write_global(WriteData *wd, int fileflags, Main *mainvar)
static void writestruct_nr(WriteData *wd, int filecode, const int struct_nr, int nr, const void *adr)
void BLO_write_float_array(BlendWriter *writer, uint num, const float *data_ptr)
void BLO_write_string(BlendWriter *writer, const char *data_ptr)
static WriteData * writedata_new(WriteWrap *ww)
void BLO_write_destroy_id_buffer(BLO_Write_IDBuffer **id_buffer)
ID * BLO_write_get_id_buffer_temp_id(BLO_Write_IDBuffer *id_buffer)
void BLO_write_int8_array(BlendWriter *writer, uint num, const int8_t *data_ptr)
void BLO_write_struct_array_by_name(BlendWriter *writer, const char *struct_name, int array_size, const void *data_ptr)
void BLO_write_char_array(BlendWriter *writer, uint num, const char *data_ptr)
static bool mywrite_end(WriteData *wd)
static void mywrite_flush(WriteData *wd)
static void mywrite_id_end(WriteData *wd, ID *)
static void writedata(WriteData *wd, int filecode, size_t len, const void *adr)
void BLO_write_raw(BlendWriter *writer, size_t size_in_bytes, const void *data_ptr)
void BLO_write_struct_at_address_by_id(BlendWriter *writer, int struct_id, const void *address, const void *data_ptr)
static void current_screen_compat(Main *mainvar, bool use_active_win, bScreen **r_screen, Scene **r_scene, ViewLayer **r_view_layer)
void BLO_write_struct_array_at_address_by_id(BlendWriter *writer, int struct_id, int array_size, const void *address, const void *data_ptr)
bool BLO_write_file(Main *mainvar, const char *filepath, const int write_flags, const BlendFileWriteParams *params, ReportList *reports)
static void writedata_do_write(WriteData *wd, const void *mem, size_t memlen)
bool BLO_write_is_undo(BlendWriter *writer)
static int write_id_direct_linked_data_process_cb(LibraryIDLinkCallbackData *cb_data)
static void mywrite(WriteData *wd, const void *adr, size_t len)
bool BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int write_flags)
static WriteData * mywrite_begin(WriteWrap *ww, MemFile *compare, MemFile *current)
static bool write_file_handle(Main *mainvar, WriteWrap *ww, MemFile *compare, MemFile *current, int write_flags, bool use_userdef, const BlendThumbnail *thumb)
void BLO_write_struct_by_id(BlendWriter *writer, int struct_id, const void *data_ptr)
void BLO_write_struct_list_by_name(BlendWriter *writer, const char *struct_name, ListBase *list)
static bool BLO_write_file_impl(Main *mainvar, const char *filepath, const int write_flags, const BlendFileWriteParams *params, ReportList *reports, WriteWrap &ww)
void BLO_write_shared(BlendWriter *writer, const void *data, const size_t approximate_size_in_bytes, const blender::ImplicitSharingInfo *sharing_info, const blender::FunctionRef< void()> write_fn)
void BLO_write_pointer_array(BlendWriter *writer, uint num, const void *data_ptr)