Blender V4.3
writefile.cc File Reference
#include <cerrno>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <fcntl.h>
#include <unistd.h>
#include "BLI_utildefines.h"
#include "CLG_log.h"
#include "DNA_collection_types.h"
#include "DNA_fileglobal_types.h"
#include "DNA_genfile.h"
#include "DNA_key_types.h"
#include "DNA_sdna_types.h"
#include "BLI_bitmap.h"
#include "BLI_blenlib.h"
#include "BLI_endian_defines.h"
#include "BLI_endian_switch.h"
#include "BLI_implicit_sharing.hh"
#include "BLI_link_utils.h"
#include "BLI_linklist.h"
#include "BLI_math_base.h"
#include "BLI_mempool.h"
#include "BLI_set.hh"
#include "BLI_threads.h"
#include "MEM_guardedalloc.h"
#include "BKE_asset.hh"
#include "BKE_blender_version.h"
#include "BKE_bpath.hh"
#include "BKE_global.hh"
#include "BKE_idprop.hh"
#include "BKE_idtype.hh"
#include "BKE_layer.hh"
#include "BKE_lib_id.hh"
#include "BKE_lib_override.hh"
#include "BKE_lib_query.hh"
#include "BKE_main.hh"
#include "BKE_main_namemap.hh"
#include "BKE_node.hh"
#include "BKE_packedFile.hh"
#include "BKE_preferences.h"
#include "BKE_report.hh"
#include "BKE_workspace.hh"
#include "DRW_engine.hh"
#include "BLO_blend_defs.hh"
#include "BLO_blend_validate.hh"
#include "BLO_read_write.hh"
#include "BLO_readfile.hh"
#include "BLO_undofile.hh"
#include "BLO_writefile.hh"
#include "readfile.hh"
#include <zstd.h>

Go to the source code of this file.

Classes

struct  ZstdFrame
 
class  WriteWrap
 
class  RawWriteWrap
 
class  ZstdWriteWrap
 
struct  ZstdWriteWrap::ZstdWriteBlockTask
 
struct  WriteData
 
struct  BlendWriter
 
struct  RenderInfo
 
struct  BLO_Write_IDBuffer
 

Macros

#define DNA_DEPRECATED_ALLOW
 
#define U   (*((const UserDef *)&U))
 
#define MEM_BUFFER_SIZE   MEM_SIZE_OPTIMAL(1 << 17) /* 128kb */
 
#define MEM_CHUNK_SIZE   MEM_SIZE_OPTIMAL(1 << 15) /* ~32kb */
 
#define ZSTD_BUFFER_SIZE   (1 << 21) /* 2mb */
 
#define ZSTD_CHUNK_SIZE   (1 << 20) /* 1mb */
 
#define ZSTD_COMPRESSION_LEVEL   3
 

Functions

Write Data Type & Functions
static WriteDatawritedata_new (WriteWrap *ww)
 
static void writedata_do_write (WriteData *wd, const void *mem, size_t memlen)
 
static void writedata_free (WriteData *wd)
 
Local Writing API 'mywrite'
static void mywrite_flush (WriteData *wd)
 
static void mywrite (WriteData *wd, const void *adr, size_t len)
 
static WriteDatamywrite_begin (WriteWrap *ww, MemFile *compare, MemFile *current)
 
static bool mywrite_end (WriteData *wd)
 
static void mywrite_id_begin (WriteData *wd, ID *id)
 
static void mywrite_id_end (WriteData *wd, ID *)
 
Typed DNA File Writing

These functions are used by blender's .blend system for file saving/loading.

static void current_screen_compat (Main *mainvar, bool use_active_win, bScreen **r_screen, Scene **r_scene, ViewLayer **r_view_layer)
 
static void write_renderinfo (WriteData *wd, Main *mainvar)
 
static void write_keymapitem (BlendWriter *writer, const wmKeyMapItem *kmi)
 
static void write_userdef (BlendWriter *writer, const UserDef *userdef)
 
static void write_libraries (WriteData *wd, Main *main)
 
static void write_global (WriteData *wd, int fileflags, Main *mainvar)
 
static void write_thumb (WriteData *wd, const BlendThumbnail *thumb)
 
File Writing (Public)
bool BLO_write_file (Main *mainvar, const char *filepath, const int write_flags, const BlendFileWriteParams *params, ReportList *reports)
 
bool BLO_write_file_mem (Main *mainvar, MemFile *compare, MemFile *current, int write_flags)
 
BLO_Write_IDBufferBLO_write_allocate_id_buffer ()
 
void BLO_write_init_id_buffer_from_id (BLO_Write_IDBuffer *id_buffer, ID *id, const bool is_undo)
 
IDBLO_write_get_id_buffer_temp_id (BLO_Write_IDBuffer *id_buffer)
 
void BLO_write_destroy_id_buffer (BLO_Write_IDBuffer **id_buffer)
 
void BLO_write_raw (BlendWriter *writer, size_t size_in_bytes, const void *data_ptr)
 
void BLO_write_struct_by_name (BlendWriter *writer, const char *struct_name, const void *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_struct_by_id (BlendWriter *writer, int struct_id, const void *data_ptr)
 
void BLO_write_struct_at_address_by_id (BlendWriter *writer, int struct_id, const void *address, const void *data_ptr)
 
void BLO_write_struct_at_address_by_id_with_filecode (BlendWriter *writer, int filecode, int struct_id, const void *address, const void *data_ptr)
 
void BLO_write_struct_array_by_id (BlendWriter *writer, int struct_id, int array_size, const void *data_ptr)
 
void BLO_write_struct_array_at_address_by_id (BlendWriter *writer, int struct_id, int array_size, const void *address, const void *data_ptr)
 
void BLO_write_struct_list_by_id (BlendWriter *writer, int struct_id, const ListBase *list)
 
void BLO_write_struct_list_by_name (BlendWriter *writer, const char *struct_name, ListBase *list)
 
void blo_write_id_struct (BlendWriter *writer, int struct_id, const void *id_address, const ID *id)
 
int BLO_get_struct_id_by_name (const BlendWriter *writer, const char *struct_name)
 
void BLO_write_char_array (BlendWriter *writer, uint num, const char *data_ptr)
 
void BLO_write_int8_array (BlendWriter *writer, uint num, const int8_t *data_ptr)
 
void BLO_write_uint8_array (BlendWriter *writer, uint num, const uint8_t *data_ptr)
 
void BLO_write_int32_array (BlendWriter *writer, uint num, const int32_t *data_ptr)
 
void BLO_write_uint32_array (BlendWriter *writer, uint num, const uint32_t *data_ptr)
 
void BLO_write_float_array (BlendWriter *writer, uint num, const float *data_ptr)
 
void BLO_write_double_array (BlendWriter *writer, uint num, const double *data_ptr)
 
void BLO_write_pointer_array (BlendWriter *writer, uint num, const void *data_ptr)
 
void BLO_write_float3_array (BlendWriter *writer, uint num, const float *data_ptr)
 
void BLO_write_string (BlendWriter *writer, const char *data_ptr)
 
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)
 
bool BLO_write_is_undo (BlendWriter *writer)
 

Variables

static CLG_LogRef LOG = {"blo.writefile"}
 

Generic DNA File Writing

#define writestruct_at_address(wd, filecode, struct_id, nr, adr, data)    writestruct_at_address_nr(wd, filecode, SDNA_TYPE_FROM_STRUCT(struct_id), nr, adr, data)
 
#define writestruct(wd, filecode, struct_id, nr, adr)    writestruct_nr(wd, filecode, SDNA_TYPE_FROM_STRUCT(struct_id), nr, adr)
 
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 writestruct_nr (WriteData *wd, int filecode, const int struct_nr, int nr, const void *adr)
 
static void writedata (WriteData *wd, int filecode, size_t len, const void *adr)
 
static void writelist_nr (WriteData *wd, int filecode, const int struct_nr, const ListBase *lb)
 

File Writing (Private)

#define ID_BUFFER_STATIC_SIZE   8192
 
static void id_buffer_init_for_id_type (BLO_Write_IDBuffer *id_buffer, const IDTypeInfo *id_type)
 
static void id_buffer_init_from_id (BLO_Write_IDBuffer *id_buffer, ID *id, const bool is_undo)
 
static int write_id_direct_linked_data_process_cb (LibraryIDLinkCallbackData *cb_data)
 
static bool write_file_handle (Main *mainvar, WriteWrap *ww, MemFile *compare, MemFile *current, int write_flags, bool use_userdef, const BlendThumbnail *thumb)
 
static bool do_history (const char *filepath, ReportList *reports)
 
static void write_file_main_validate_pre (Main *bmain, ReportList *reports)
 
static void write_file_main_validate_post (Main *bmain, ReportList *reports)
 
static bool BLO_write_file_impl (Main *mainvar, const char *filepath, const int write_flags, const BlendFileWriteParams *params, ReportList *reports, WriteWrap &ww)
 

Macro Definition Documentation

◆ DNA_DEPRECATED_ALLOW

#define DNA_DEPRECATED_ALLOW

FILE FORMAT

IFF-style structure (but not IFF compatible!)

Start file:

`BLENDER_V100`  `12` bytes  (version 1.00 is just an example).
                `V` = big endian, `v` = little endian.
                `_` = 4 byte pointer, `-` = 8 byte pointer.

data-blocks: (also see struct BHead).

`bh.code`       `char[4]` see `BLO_blend_defs.hh` for a list of known types.
`bh.len`        `int32` length data after BHead in bytes.
`bh.old`        `void *` old pointer (the address at the time of writing the file).
`bh.SDNAnr`     `int32` struct index of structs stored in #DNA1 data.
`bh.nr`         `int32` in case of array: number of structs.
data
...
...

Almost all data in Blender are structures. Each struct saved gets a BHead header. With BHead the struct can be linked again and compared with #StructDNA.

WRITE

Preferred writing order: (not really a must, but why would you do it random?) Any case: direct data is ALWAYS after the lib block.

(Local file data)

Definition at line 82 of file writefile.cc.

◆ ID_BUFFER_STATIC_SIZE

#define ID_BUFFER_STATIC_SIZE   8192

Definition at line 1178 of file writefile.cc.

Referenced by id_buffer_init_for_id_type().

◆ MEM_BUFFER_SIZE

#define MEM_BUFFER_SIZE   MEM_SIZE_OPTIMAL(1 << 17) /* 128kb */

Definition at line 141 of file writefile.cc.

Referenced by writedata_new().

◆ MEM_CHUNK_SIZE

#define MEM_CHUNK_SIZE   MEM_SIZE_OPTIMAL(1 << 15) /* ~32kb */

Definition at line 142 of file writefile.cc.

Referenced by writedata_new().

◆ U

#define U   (*((const UserDef *)&U))

Definition at line 136 of file writefile.cc.

◆ writestruct

#define writestruct ( wd,
filecode,
struct_id,
nr,
adr )    writestruct_nr(wd, filecode, SDNA_TYPE_FROM_STRUCT(struct_id), nr, adr)

◆ writestruct_at_address

#define writestruct_at_address ( wd,
filecode,
struct_id,
nr,
adr,
data )    writestruct_at_address_nr(wd, filecode, SDNA_TYPE_FROM_STRUCT(struct_id), nr, adr, data)

Definition at line 827 of file writefile.cc.

◆ ZSTD_BUFFER_SIZE

#define ZSTD_BUFFER_SIZE   (1 << 21) /* 2mb */

Definition at line 144 of file writefile.cc.

Referenced by writedata_new().

◆ ZSTD_CHUNK_SIZE

#define ZSTD_CHUNK_SIZE   (1 << 20) /* 1mb */

Definition at line 145 of file writefile.cc.

Referenced by writedata_new().

◆ ZSTD_COMPRESSION_LEVEL

#define ZSTD_COMPRESSION_LEVEL   3

Definition at line 147 of file writefile.cc.

Function Documentation

◆ BLO_get_struct_id_by_name()

int BLO_get_struct_id_by_name ( const BlendWriter * writer,
const char * struct_name )

Mapping between names and ids.

Definition at line 1900 of file writefile.cc.

References DNA_struct_find_with_alias(), WriteData::sdna, and BlendWriter::wd.

Referenced by BLO_write_struct_array_by_name(), and BLO_write_struct_list_by_name().

◆ BLO_write_allocate_id_buffer()

◆ BLO_write_char_array()

void BLO_write_char_array ( BlendWriter * writer,
uint num,
const char * data_ptr )

Slightly 'safer' code to write arrays of basic types data.

Definition at line 1906 of file writefile.cc.

References BLO_write_raw().

Referenced by console_space_blend_write(), IDP_WriteString(), and object_blend_write().

◆ BLO_write_destroy_id_buffer()

void BLO_write_destroy_id_buffer ( BLO_Write_IDBuffer ** id_buffer)

◆ BLO_write_double_array()

void BLO_write_double_array ( BlendWriter * writer,
uint num,
const double * data_ptr )

Definition at line 1936 of file writefile.cc.

References BLO_write_raw().

Referenced by IDP_WriteArray(), and write_ui_data().

◆ BLO_write_file()

◆ BLO_write_file_impl()

◆ BLO_write_file_mem()

bool BLO_write_file_mem ( Main * mainvar,
MemFile * compare,
MemFile * current,
int write_flags )
Returns
Success.

Definition at line 1780 of file writefile.cc.

References write_file_handle().

Referenced by BKE_memfile_undo_encode().

◆ BLO_write_float3_array()

void BLO_write_float3_array ( BlendWriter * writer,
uint num,
const float * data_ptr )

◆ BLO_write_float_array()

◆ BLO_write_get_id_buffer_temp_id()

ID * BLO_write_get_id_buffer_temp_id ( BLO_Write_IDBuffer * id_buffer)

◆ blo_write_id_struct()

void blo_write_id_struct ( BlendWriter * writer,
int struct_id,
const void * id_address,
const ID * id )

Write id struct.

Definition at line 1895 of file writefile.cc.

References GS, BlendWriter::wd, and writestruct_at_address_nr().

◆ BLO_write_init_id_buffer_from_id()

void BLO_write_init_id_buffer_from_id ( BLO_Write_IDBuffer * id_buffer,
ID * id,
const bool is_undo )

◆ BLO_write_int32_array()

void BLO_write_int32_array ( BlendWriter * writer,
uint num,
const int32_t * data_ptr )

Definition at line 1921 of file writefile.cc.

References BLO_write_raw().

Referenced by blend_write(), blend_write(), IDP_WriteArray(), write_layer(), and write_ui_data().

◆ BLO_write_int8_array()

void BLO_write_int8_array ( BlendWriter * writer,
uint num,
const int8_t * data_ptr )

◆ BLO_write_is_undo()

◆ BLO_write_pointer_array()

◆ BLO_write_raw()

void BLO_write_raw ( BlendWriter * writer,
size_t size_in_bytes,
const void * data_ptr )

Write raw data.

Warning
Avoid using this function if possible. There are only a very few cases in current code where it is actually needed (e.g. the ShapeKey's data, since its items size varies depending on the type of geometry owning it, see shapekey_blend_write).
Data written with this call have no type information attached to them in the blend-file. The main consequence is that there will be no handling of endianness conversion for them in readfile code. Basic types array functions (like BLO_write_int8_array etc.) also use BLO_write_raw internally, but if their matching read function is used to load the data (like BLO_read_int8_array), the read function will take care of endianness conversion.

Definition at line 1823 of file writefile.cc.

References BLO_CODE_DATA, BlendWriter::wd, and writedata().

Referenced by BLO_write_char_array(), BLO_write_double_array(), BLO_write_float3_array(), BLO_write_float_array(), BLO_write_int32_array(), BLO_write_int8_array(), BLO_write_pointer_array(), BLO_write_string(), BLO_write_uint32_array(), BLO_write_uint8_array(), and shapekey_blend_write().

◆ BLO_write_shared()

void BLO_write_shared ( BlendWriter * writer,
const void * data,
size_t approximate_size_in_bytes,
const blender::ImplicitSharingInfo * sharing_info,
blender::FunctionRef< void()> write_fn )

Check if the data can be written more efficiently by making use of implicit-sharing. If yes, the user count of the sharing-info is increased making the data immutable. The provided callback should serialize the potentially shared data. It is only called when necessary.

Parameters
approximate_size_in_bytesUsed to be able to approximate how large the undo step is in total.
write_fnUse the #BlendWrite to serialize the potentially shared data.

Definition at line 1958 of file writefile.cc.

References blender::Map< Key, Value, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::add(), blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::add(), blender::ImplicitSharingInfo::add_user(), BLO_write_is_undo(), MemFileSharedStorage::map, WriteData::mem, WriteData::per_id_written_shared_addresses, MemFile::shared_storage, MemFile::size, blender::ImplicitSharingInfo::strong_users(), BlendWriter::wd, and MemFileWriteData::written_memfile.

Referenced by BKE_packedfile_blend_write(), blender::bke::CurvesGeometry::blend_write(), CustomData_blend_write(), and mesh_blend_write().

◆ BLO_write_string()

◆ BLO_write_struct_array_at_address_by_id()

void BLO_write_struct_array_at_address_by_id ( BlendWriter * writer,
int struct_id,
int array_size,
const void * address,
const void * data_ptr )

Write struct array at address.

Definition at line 1874 of file writefile.cc.

References BLO_CODE_DATA, BlendWriter::wd, and writestruct_at_address_nr().

◆ BLO_write_struct_array_by_id()

void BLO_write_struct_array_by_id ( BlendWriter * writer,
int struct_id,
int array_size,
const void * data_ptr )

Definition at line 1866 of file writefile.cc.

References BLO_CODE_DATA, BlendWriter::wd, and writestruct_nr().

Referenced by BLO_write_struct_array_by_name().

◆ BLO_write_struct_array_by_name()

void BLO_write_struct_array_by_name ( BlendWriter * writer,
const char * struct_name,
int array_size,
const void * data_ptr )

Write struct array.

Definition at line 1833 of file writefile.cc.

References BLO_get_struct_id_by_name(), BLO_write_struct_array_by_id(), CLOG_ERROR, LOG, and UNLIKELY.

Referenced by blend_write_layer_data(), and BLO_write_struct_by_name().

◆ BLO_write_struct_at_address_by_id()

void BLO_write_struct_at_address_by_id ( BlendWriter * writer,
int struct_id,
const void * address,
const void * data_ptr )

Write single struct at address.

Definition at line 1851 of file writefile.cc.

References BLO_CODE_DATA, and BLO_write_struct_at_address_by_id_with_filecode().

◆ BLO_write_struct_at_address_by_id_with_filecode()

void BLO_write_struct_at_address_by_id_with_filecode ( BlendWriter * writer,
int filecode,
int struct_id,
const void * address,
const void * data_ptr )

Write single struct at address and specify a file-code.

Definition at line 1860 of file writefile.cc.

References BlendWriter::wd, and writestruct_at_address_nr().

Referenced by BLO_write_struct_at_address_by_id().

◆ BLO_write_struct_by_id()

void BLO_write_struct_by_id ( BlendWriter * writer,
int struct_id,
const void * data_ptr )

◆ BLO_write_struct_by_name()

void BLO_write_struct_by_name ( BlendWriter * writer,
const char * struct_name,
const void * data_ptr )

◆ BLO_write_struct_list_by_id()

void BLO_write_struct_list_by_id ( BlendWriter * writer,
int struct_id,
const ListBase * list )

Definition at line 1880 of file writefile.cc.

References BLO_CODE_DATA, BlendWriter::wd, and writelist_nr().

Referenced by BLO_write_struct_list_by_name().

◆ BLO_write_struct_list_by_name()

void BLO_write_struct_list_by_name ( BlendWriter * writer,
const char * struct_name,
ListBase * list )

Write struct list.

Definition at line 1885 of file writefile.cc.

References BLO_get_struct_id_by_name(), BLO_write_struct_list_by_id(), CLOG_ERROR, LOG, and UNLIKELY.

◆ BLO_write_uint32_array()

void BLO_write_uint32_array ( BlendWriter * writer,
uint num,
const uint32_t * data_ptr )

Definition at line 1926 of file writefile.cc.

References BLO_write_raw().

Referenced by BKE_previewimg_blend_write(), BKE_ptcache_blend_write(), and blend_write().

◆ BLO_write_uint8_array()

void BLO_write_uint8_array ( BlendWriter * writer,
uint num,
const uint8_t * data_ptr )

Definition at line 1916 of file writefile.cc.

References BLO_write_raw().

Referenced by blend_write_layer_data().

◆ current_screen_compat()

static void current_screen_compat ( Main * mainvar,
bool use_active_win,
bScreen ** r_screen,
Scene ** r_scene,
ViewLayer ** r_view_layer )
static

Take care using 'use_active_win', since we won't want the currently active window to change which scene renders (currently only used for undo).

Definition at line 845 of file writefile.cc.

References wmWindow::active, BKE_view_layer_find(), BKE_workspace_active_screen_get(), ListBase::first, wmWindow::next, wmWindow::scene, wmWindow::view_layer_name, wmWindowManager::windows, Main::wm, and wmWindow::workspace_hook.

Referenced by write_global(), and write_renderinfo().

◆ do_history()

◆ id_buffer_init_for_id_type()

◆ id_buffer_init_from_id()

◆ mywrite()

static void mywrite ( WriteData * wd,
const void * adr,
size_t len )
static

Low level WRITE(2) wrapper that buffers data

Parameters
adrPointer to new chunk of data
lenLength of new chunk of data

Definition at line 542 of file writefile.cc.

References BLI_assert, WriteData::buf, WriteData::buffer, WriteData::chunk_size, WriteData::critical_error, len, WriteData::max_size, UNLIKELY, WriteData::used_len, WriteData::validation_data, and writedata_do_write().

Referenced by write_file_handle(), writedata(), and writestruct_at_address_nr().

◆ mywrite_begin()

static WriteData * mywrite_begin ( WriteWrap * ww,
MemFile * compare,
MemFile * current )
static

BeGiN initializer for mywrite

Parameters
wwFile write wrapper.
comparePrevious memory file (can be nullptr).
currentThe current memory file (can be nullptr).
Warning
Talks to other functions with global parameters

Definition at line 598 of file writefile.cc.

References BLO_memfile_write_init(), WriteData::mem, WriteData::use_memfile, and writedata_new().

Referenced by write_file_handle().

◆ mywrite_end()

static bool mywrite_end ( WriteData * wd)
static

END the mywrite wrapper

Returns
True if write failed
unknown global variable otherwise
Warning
Talks to other functions with global parameters

Definition at line 616 of file writefile.cc.

References BLO_memfile_write_finalize(), WriteData::buf, WriteData::buffer, WriteData::critical_error, WriteData::mem, WriteData::use_memfile, WriteData::used_len, WriteData::validation_data, writedata_do_write(), and writedata_free().

Referenced by write_file_handle().

◆ mywrite_flush()

static void mywrite_flush ( WriteData * wd)
static

Flush helps the de-duplicating memory for undo-save by logically segmenting data, so differences in one part of memory won't cause unrelated data to be duplicated.

Definition at line 529 of file writefile.cc.

References WriteData::buf, WriteData::buffer, WriteData::used_len, and writedata_do_write().

Referenced by mywrite_id_end(), write_file_handle(), and write_libraries().

◆ mywrite_id_begin()

◆ mywrite_id_end()

◆ write_at_address_validate()

static bool write_at_address_validate ( WriteData * wd,
int filecode,
const void * address )
static

Return false if the given 'old' address is not valid in current context. The block should not be written in that case.

Note
Currently only checks that BLO_CODE_DATA blocks written as part of an ID data never match an already written one for the same ID.

Definition at line 704 of file writefile.cc.

References blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::add(), BLO_CODE_DATA, CLOG_ERROR, WriteData::is_writing_id, LOG, WriteData::per_id_addresses_set, WriteData::use_memfile, and WriteData::validation_data.

Referenced by writedata(), and writestruct_at_address_nr().

◆ write_file_handle()

static bool write_file_handle ( Main * mainvar,
WriteWrap * ww,
MemFile * compare,
MemFile * current,
int write_flags,
bool use_userdef,
const BlendThumbnail * thumb )
static

When MemFile arguments are non-null, this is a file-safe to memory.

Parameters
comparePrevious memory file (can be nullptr).
currentThe current memory file (can be nullptr).

Definition at line 1297 of file writefile.cc.

References B_ENDIAN, BKE_idtype_get_info_from_id(), BKE_idtype_idcode_is_linkable(), BKE_lib_override_library_operations_store_end(), BKE_lib_override_library_operations_store_finalize(), BKE_lib_override_library_operations_store_init(), BKE_lib_override_library_operations_store_start(), BKE_library_foreach_ID_link(), BKE_main_id_refcount_recompute(), IDTypeInfo::blend_write, BLENDER_FILE_VERSION, BLI_assert, BLO_CODE_DNA1, BLO_CODE_ENDB, blo_join_main(), blo_split_main(), BLO_write_allocate_id_buffer(), BLO_write_destroy_id_buffer(), BHead::code, SDNA::data, SDNA::data_size, ELEM, ENDIAN_ORDER, ListBase::first, IDTypeInfo::flags, FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, Key::from, GS, id_buffer_init_for_id_type(), id_buffer_init_from_id(), ID_IS_LINKED, ID_IS_OVERRIDE_LIBRARY_REAL, ID_KE, ID_LI, id_lib_extern(), ID_SCE, ID_TAG_INDIRECT, ID_TAG_NO_MAIN, ID_TAG_NO_USER_REFCOUNT, ID_TAG_NOT_ALLOCATED, ID_TAG_RUNTIME, IDTYPE_FLAGS_NEVER_UNUSED, IDWALK_INCLUDE_UI, IDWALK_READONLY, INDEX_ID_MAX, mywrite(), mywrite_begin(), mywrite_end(), mywrite_flush(), mywrite_id_begin(), mywrite_id_end(), ID::name, Main::next, WriteData::sdna, set_listbasepointers(), SNPRINTF, ID::tag, BLO_Write_IDBuffer::temp_id, ID::us, WriteData::use_memfile, USER_EXPERIMENTAL_TEST, write_global(), write_id_direct_linked_data_process_cb(), write_libraries(), write_renderinfo(), write_thumb(), write_userdef(), and writedata().

Referenced by BLO_write_file_impl(), and BLO_write_file_mem().

◆ write_file_main_validate_post()

static void write_file_main_validate_post ( Main * bmain,
ReportList * reports )
static

Definition at line 1582 of file writefile.cc.

References BKE_report(), BLO_main_validate_libraries(), G, G_DEBUG_IO, Main::lock, and RPT_DEBUG.

Referenced by BLO_write_file_impl().

◆ write_file_main_validate_pre()

static void write_file_main_validate_pre ( Main * bmain,
ReportList * reports )
static

◆ write_global()

◆ write_id_direct_linked_data_process_cb()

◆ write_keymapitem()

static void write_keymapitem ( BlendWriter * writer,
const wmKeyMapItem * kmi )
static

Definition at line 918 of file writefile.cc.

References BLO_write_struct, IDP_BlendWrite(), and wmKeyMapItem::properties.

Referenced by write_userdef().

◆ write_libraries()

◆ write_renderinfo()

static void write_renderinfo ( WriteData * wd,
Main * mainvar )
static

This was originally added for the historic render-daemon feature, now write because it can be easily extracted without reading the whole blend file.

See: scripts/modules/blend_render_info.py

Definition at line 895 of file writefile.cc.

References BLO_CODE_REND, current_screen_compat(), data, ID_IS_LINKED, LISTBASE_FOREACH, R_BG_RENDER, Main::scenes, RenderInfo::sfra, STRNCPY, and writedata().

Referenced by write_file_handle().

◆ write_thumb()

static void write_thumb ( WriteData * wd,
const BlendThumbnail * thumb )
static

Preview image, first 2 values are width and height second are an RGBA image (uchar).

Note
this uses 'TEST' since new types will segfault on file load for older blender versions.

Definition at line 1165 of file writefile.cc.

References BLEN_THUMB_MEMSIZE_FILE, BLO_CODE_TEST, BlendThumbnail::height, BlendThumbnail::width, and writedata().

Referenced by write_file_handle().

◆ write_userdef()

◆ writedata()

static void writedata ( WriteData * wd,
int filecode,
size_t len,
const void * adr )
static

◆ writedata_do_write()

static void writedata_do_write ( WriteData * wd,
const void * mem,
size_t memlen )
static

◆ writedata_free()

static void writedata_free ( WriteData * wd)
static

Definition at line 511 of file writefile.cc.

References WriteData::buf, WriteData::buffer, and MEM_freeN().

Referenced by mywrite_end().

◆ writedata_new()

◆ writelist_nr()

static void writelist_nr ( WriteData * wd,
int filecode,
const int struct_nr,
const ListBase * lb )
static

Use this to force writing of lists in same order as reading (using link_list).

Definition at line 797 of file writefile.cc.

References ListBase::first, Link::next, and writestruct_nr().

Referenced by BLO_write_struct_list_by_id().

◆ writestruct_at_address_nr()

static void writestruct_at_address_nr ( WriteData * wd,
int filecode,
const int struct_nr,
int nr,
const void * adr,
const void * data )
static

◆ writestruct_nr()

static void writestruct_nr ( WriteData * wd,
int filecode,
const int struct_nr,
int nr,
const void * adr )
static

Variable Documentation

◆ LOG