~siretart/ubuntu/utopic/blender/libav10

1.3.7 by Kevin Roy
Import upstream version 2.61
1
/*
1.2.8 by Cyril Brulebois
Import upstream version 2.46+dfsg
2
 * ***** BEGIN GPL LICENSE BLOCK *****
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
3
 *
4
 * This program is free software; you can redistribute it and/or
5
 * modify it under the terms of the GNU General Public License
6
 * as published by the Free Software Foundation; either version 2
1.2.8 by Cyril Brulebois
Import upstream version 2.46+dfsg
7
 * of the License, or (at your option) any later version.
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
8
 *
9
 * This program is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * GNU General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program; if not, write to the Free Software Foundation,
1.4.2 by Kevin Roy
Import upstream version 2.53-beta-svn30596
16
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
17
 *
18
 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19
 * All rights reserved.
20
 *
21
 * The Original Code is: all of this file.
22
 *
23
 * Contributor(s): none yet.
24
 *
1.2.8 by Cyril Brulebois
Import upstream version 2.46+dfsg
25
 * ***** END GPL LICENSE BLOCK *****
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
26
 */
27
1.3.3 by Kevin Roy
Import upstream version 2.57-svn36147
28
/** \file blender/blenkernel/intern/blender.c
29
 *  \ingroup bke
30
 */
31
32
1.2.10 by Chris Coulson
Import upstream version 2.49a+dfsg
33
#ifndef _WIN32 
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
34
#  include <unistd.h> // for read close
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
35
#else
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
36
#  include <io.h> // for open close read
37
#  define open _open
38
#  define read _read
39
#  define close _close
40
#  define write _write
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
41
#endif
42
43
#include <stdlib.h>
44
#include <stdio.h>
1.3.2 by Kevin Roy
Import upstream version 2.56.1-beta-svn34076
45
#include <stddef.h>
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
46
#include <string.h>
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
47
#include <fcntl.h>  /* for open */
48
#include <errno.h>
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
49
50
#include "MEM_guardedalloc.h"
1.2.4 by Lukas Fittl
Import upstream version 2.42a
51
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
52
#include "DNA_userdef_types.h"
1.2.4 by Lukas Fittl
Import upstream version 2.42a
53
#include "DNA_scene_types.h"
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
54
#include "DNA_screen_types.h"
55
#include "DNA_sequence_types.h"
1.3.2 by Kevin Roy
Import upstream version 2.56.1-beta-svn34076
56
#include "DNA_sound_types.h"
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
57
#include "DNA_windowmanager_types.h"
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
58
59
#include "BLI_blenlib.h"
1.1.2 by Martin Pitt
Import upstream version 2.37a
60
#include "BLI_dynstr.h"
1.3.3 by Kevin Roy
Import upstream version 2.57-svn36147
61
#include "BLI_utildefines.h"
1.3.6 by Kevin Roy
Import upstream version 2.59
62
#include "BLI_callbacks.h"
1.1.2 by Martin Pitt
Import upstream version 2.37a
63
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
64
#include "IMB_imbuf.h"
1.3.7 by Kevin Roy
Import upstream version 2.61
65
#include "IMB_moviecache.h"
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
66
67
#include "BKE_blender.h"
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
68
#include "BKE_bpath.h"
1.5.2 by Matteo F. Vescovi
Import upstream version 2.67b
69
#include "BKE_brush.h"
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
70
#include "BKE_context.h"
1.2.4 by Lukas Fittl
Import upstream version 2.42a
71
#include "BKE_depsgraph.h"
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
72
#include "BKE_displist.h"
73
#include "BKE_global.h"
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
74
#include "BKE_idprop.h"
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
75
#include "BKE_image.h"
1.4.2 by Kevin Roy
Import upstream version 2.53-beta-svn30596
76
#include "BKE_ipo.h"
1.2.4 by Lukas Fittl
Import upstream version 2.42a
77
#include "BKE_library.h"
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
78
#include "BKE_main.h"
1.2.6 by Florian Ernst
Import upstream version 2.44
79
#include "BKE_node.h"
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
80
#include "BKE_report.h"
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
81
#include "BKE_scene.h"
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
82
#include "BKE_screen.h"
1.4.2 by Kevin Roy
Import upstream version 2.53-beta-svn30596
83
#include "BKE_sequencer.h"
1.3.7 by Kevin Roy
Import upstream version 2.61
84
#include "BKE_sound.h"
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
85
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
86
#include "RE_pipeline.h"
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
87
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
88
#include "BLF_api.h"
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
89
1.1.2 by Martin Pitt
Import upstream version 2.37a
90
#include "BLO_undofile.h"
91
#include "BLO_readfile.h" 
92
#include "BLO_writefile.h" 
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
93
1.3.7 by Kevin Roy
Import upstream version 2.61
94
#include "RNA_access.h"
95
1.4.2 by Kevin Roy
Import upstream version 2.53-beta-svn30596
96
#include "WM_api.h" // XXXXX BAD, very BAD dependency (bad level call) - remove asap, elubie
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
97
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
98
#include "IMB_colormanagement.h"
99
100
#ifdef WITH_PYTHON
101
#  include "BPY_extern.h"
102
#endif
103
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
104
Global G;
105
UserDef U;
1.3.3 by Kevin Roy
Import upstream version 2.57-svn36147
106
/* ListBase = {NULL, NULL}; */
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
107
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
108
char versionstr[48] = "";
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
109
110
/* ********** free ********** */
111
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
112
/* only to be called on exit blender */
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
113
void free_blender(void)
114
{
1.2.5 by Lukas Fittl
Import upstream version 2.43
115
	/* samples are in a global list..., also sets G.main->sound->sample NULL */
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
116
	free_main(G.main);
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
117
	G.main = NULL;
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
118
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
119
	BKE_spacetypes_free();      /* after free main, it uses space callbacks */
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
120
	
1.4.2 by Kevin Roy
Import upstream version 2.53-beta-svn30596
121
	IMB_exit();
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
122
	BKE_images_exit();
123
1.5.2 by Matteo F. Vescovi
Import upstream version 2.67b
124
	BKE_brush_system_exit();
125
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
126
	BLI_callback_global_finalize();
127
128
	BKE_sequencer_cache_destruct();
1.3.7 by Kevin Roy
Import upstream version 2.61
129
	IMB_moviecache_destruct();
1.2.5 by Lukas Fittl
Import upstream version 2.43
130
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
131
	free_nodesystem();
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
132
}
133
134
void initglobals(void)
135
{
136
	memset(&G, 0, sizeof(Global));
137
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
138
	U.savetime = 1;
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
139
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
140
	G.main = MEM_callocN(sizeof(Main), "initglobals");
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
141
142
	strcpy(G.ima, "//");
143
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
144
	if (BLENDER_SUBVERSION)
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
145
		BLI_snprintf(versionstr, sizeof(versionstr), "v%d.%02d.%d", BLENDER_VERSION / 100, BLENDER_VERSION % 100, BLENDER_SUBVERSION);
1.2.5 by Lukas Fittl
Import upstream version 2.43
146
	else
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
147
		BLI_snprintf(versionstr, sizeof(versionstr), "v%d.%02d", BLENDER_VERSION / 100, BLENDER_VERSION % 100);
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
148
1.5.3 by Matteo F. Vescovi
Import upstream version 2.68a
149
#ifdef _WIN32
150
	G.windowstate = 0;
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
151
#endif
152
1.3.5 by Kevin Roy
Import upstream version 2.58-svn37702
153
#ifndef WITH_PYTHON_SECURITY /* default */
1.4.2 by Kevin Roy
Import upstream version 2.53-beta-svn30596
154
	G.f |= G_SCRIPT_AUTOEXEC;
1.3.5 by Kevin Roy
Import upstream version 2.58-svn37702
155
#else
156
	G.f &= ~G_SCRIPT_AUTOEXEC;
157
#endif
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
158
}
159
160
/***/
161
1.1.2 by Martin Pitt
Import upstream version 2.37a
162
static void clear_global(void) 
163
{
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
164
//	extern short winqueue_break;	/* screen.c */
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
165
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
166
	free_main(G.main);          /* free all lib data */
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
167
	
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
168
//	free_vertexpaint();
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
169
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
170
	G.main = NULL;
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
171
}
172
1.5.3 by Matteo F. Vescovi
Import upstream version 2.68a
173
static bool clean_paths_visit_cb(void *UNUSED(userdata), char *path_dst, const char *path_src)
1.3.7 by Kevin Roy
Import upstream version 2.61
174
{
175
	strcpy(path_dst, path_src);
176
	BLI_clean(path_dst);
1.5.3 by Matteo F. Vescovi
Import upstream version 2.68a
177
	return !STREQ(path_dst, path_src);
1.3.7 by Kevin Roy
Import upstream version 2.61
178
}
179
1.1.2 by Martin Pitt
Import upstream version 2.37a
180
/* make sure path names are correct for OS */
181
static void clean_paths(Main *main)
182
{
1.3.2 by Kevin Roy
Import upstream version 2.56.1-beta-svn34076
183
	Scene *scene;
184
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
185
	BKE_bpath_traverse_main(main, clean_paths_visit_cb, BKE_BPATH_TRAVERSE_SKIP_MULTIFILE, NULL);
1.3.2 by Kevin Roy
Import upstream version 2.56.1-beta-svn34076
186
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
187
	for (scene = main->scene.first; scene; scene = scene->id.next) {
1.1.2 by Martin Pitt
Import upstream version 2.37a
188
		BLI_clean(scene->r.pic);
189
	}
190
}
191
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
192
/* context matching */
193
/* handle no-ui case */
194
1.3.2 by Kevin Roy
Import upstream version 2.56.1-beta-svn34076
195
/* note, this is called on Undo so any slow conversion functions here
196
 * should be avoided or check (mode!='u') */
197
1.3.5 by Kevin Roy
Import upstream version 2.58-svn37702
198
static void setup_app_data(bContext *C, BlendFileData *bfd, const char *filepath)
1.1.2 by Martin Pitt
Import upstream version 2.37a
199
{
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
200
	bScreen *curscreen = NULL;
201
	Scene *curscene = NULL;
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
202
	int recover;
1.1.2 by Martin Pitt
Import upstream version 2.37a
203
	char mode;
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
204
1.1.2 by Martin Pitt
Import upstream version 2.37a
205
	/* 'u' = undo save, 'n' = no UI load */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
206
	if (bfd->main->screen.first == NULL) mode = 'u';
207
	else if (G.fileflags & G_FILE_NO_UI) mode = 'n';
208
	else mode = 0;
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
209
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
210
	recover = (G.fileflags & G_FILE_RECOVER);
1.3.2 by Kevin Roy
Import upstream version 2.56.1-beta-svn34076
211
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
212
	/* Free all render results, without this stale data gets displayed after loading files */
213
	if (mode != 'u') {
214
		RE_FreeAllRenderResults();
215
	}
216
1.3.2 by Kevin Roy
Import upstream version 2.56.1-beta-svn34076
217
	/* Only make filepaths compatible when loading for real (not undo) */
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
218
	if (mode != 'u') {
1.3.2 by Kevin Roy
Import upstream version 2.56.1-beta-svn34076
219
		clean_paths(bfd->main);
220
	}
221
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
222
	/* XXX here the complex windowmanager matching */
1.1.2 by Martin Pitt
Import upstream version 2.37a
223
	
224
	/* no load screens? */
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
225
	if (mode) {
1.1.2 by Martin Pitt
Import upstream version 2.37a
226
		/* comes from readfile.c */
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
227
		SWAP(ListBase, G.main->wm, bfd->main->wm);
1.1.2 by Martin Pitt
Import upstream version 2.37a
228
		SWAP(ListBase, G.main->screen, bfd->main->screen);
1.2.8 by Cyril Brulebois
Import upstream version 2.46+dfsg
229
		SWAP(ListBase, G.main->script, bfd->main->script);
1.1.2 by Martin Pitt
Import upstream version 2.37a
230
		
231
		/* we re-use current screen */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
232
		curscreen = CTX_wm_screen(C);
1.1.2 by Martin Pitt
Import upstream version 2.37a
233
		/* but use new Scene pointer */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
234
		curscene = bfd->curscene;
235
		if (curscene == NULL) curscene = bfd->main->scene.first;
236
		/* empty file, we add a scene to make Blender work */
237
		if (curscene == NULL) curscene = BKE_scene_add(bfd->main, "Empty");
238
		
1.1.2 by Martin Pitt
Import upstream version 2.37a
239
		/* and we enforce curscene to be in current screen */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
240
		if (curscreen) curscreen->scene = curscene;  /* can run in bgmode */
1.1.2 by Martin Pitt
Import upstream version 2.37a
241
242
		/* clear_global will free G.main, here we can still restore pointers */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
243
		blo_lib_link_screen_restore(bfd->main, curscreen, curscene);
1.1.2 by Martin Pitt
Import upstream version 2.37a
244
	}
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
245
	
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
246
	/* free G.main Main database */
1.3.2 by Kevin Roy
Import upstream version 2.56.1-beta-svn34076
247
//	CTX_wm_manager_set(C, NULL);
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
248
	clear_global();
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
249
	
1.3.7 by Kevin Roy
Import upstream version 2.61
250
	/* clear old property update cache, in case some old references are left dangling */
251
	RNA_property_update_cache_free();
252
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
253
	G.main = bfd->main;
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
254
255
	CTX_data_main_set(C, G.main);
1.3.7 by Kevin Roy
Import upstream version 2.61
256
257
	sound_init_main(G.main);
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
258
	
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
259
	if (bfd->user) {
1.1.2 by Martin Pitt
Import upstream version 2.37a
260
		
261
		/* only here free userdef themes... */
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
262
		BKE_userdef_free();
263
		
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
264
		U = *bfd->user;
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
265
		MEM_freeN(bfd->user);
266
	}
267
	
1.1.2 by Martin Pitt
Import upstream version 2.37a
268
	/* case G_FILE_NO_UI or no screens in file */
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
269
	if (mode) {
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
270
		/* leave entire context further unaltered? */
271
		CTX_data_scene_set(C, curscene);
1.1.2 by Martin Pitt
Import upstream version 2.37a
272
	}
273
	else {
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
274
		G.winpos = bfd->winpos;
275
		G.displaymode = bfd->displaymode;
276
		G.fileflags = bfd->fileflags;
277
		CTX_wm_manager_set(C, G.main->wm.first);
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
278
		CTX_wm_screen_set(C, bfd->curscreen);
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
279
		CTX_data_scene_set(C, bfd->curscene);
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
280
		CTX_wm_area_set(C, NULL);
281
		CTX_wm_region_set(C, NULL);
282
		CTX_wm_menu_set(C, NULL);
1.1.2 by Martin Pitt
Import upstream version 2.37a
283
	}
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
284
	
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
285
	/* this can happen when active scene was lib-linked, and doesn't exist anymore */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
286
	if (CTX_data_scene(C) == NULL) {
287
		/* in case we don't even have a local scene, add one */
288
		if (!G.main->scene.first)
289
			BKE_scene_add(G.main, "Scene");
290
291
		CTX_data_scene_set(C, G.main->scene.first);
292
		CTX_wm_screen(C)->scene = CTX_data_scene(C);
293
		curscene = CTX_data_scene(C);
1.1.2 by Martin Pitt
Import upstream version 2.37a
294
	}
295
296
	/* special cases, override loaded flags: */
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
297
	if (G.f != bfd->globalf) {
298
		const int flags_keep = (G_SWAP_EXCHANGE | G_SCRIPT_AUTOEXEC | G_SCRIPT_OVERRIDE_PREF);
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
299
		bfd->globalf = (bfd->globalf & ~flags_keep) | (G.f & flags_keep);
1.3.3 by Kevin Roy
Import upstream version 2.57-svn36147
300
	}
301
1.1.2 by Martin Pitt
Import upstream version 2.37a
302
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
303
	G.f = bfd->globalf;
304
305
#ifdef WITH_PYTHON
306
	/* let python know about new main */
307
	BPY_context_update(C);
308
#endif
1.1.2 by Martin Pitt
Import upstream version 2.37a
309
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
310
	if (!G.background) {
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
311
		//setscreen(G.curscreen);
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
312
	}
1.2.4 by Lukas Fittl
Import upstream version 2.42a
313
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
314
	/* FIXME: this version patching should really be part of the file-reading code,
315
	 * but we still get too many unrelated data-corruption crashes otherwise... */
1.4.2 by Kevin Roy
Import upstream version 2.53-beta-svn30596
316
	if (G.main->versionfile < 250)
317
		do_versions_ipos_to_animato(G.main);
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
318
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
319
	G.main->recovered = 0;
320
	
321
	/* startup.blend or recovered startup */
322
	if (bfd->filename[0] == 0) {
323
		G.main->name[0] = 0;
324
	}
325
	else if (recover && G.relbase_valid) {
1.4.2 by Kevin Roy
Import upstream version 2.53-beta-svn30596
326
		/* in case of autosave or quit.blend, use original filename instead
327
		 * use relbase_valid to make sure the file is saved, else we get <memory2> in the filename */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
328
		filepath = bfd->filename;
329
		G.main->recovered = 1;
330
	
331
		/* these are the same at times, should never copy to the same location */
332
		if (G.main->name != filepath)
333
			BLI_strncpy(G.main->name, filepath, FILE_MAX);
334
	}
335
	
1.2.4 by Lukas Fittl
Import upstream version 2.42a
336
	/* baseflags, groups, make depsgraph, etc */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
337
	/* first handle case if other windows have different scenes visible */
338
	if (mode == 0) {
339
		wmWindowManager *wm = G.main->wm.first;
340
		
341
		if (wm) {
342
			wmWindow *win;
343
			
344
			for (win = wm->windows.first; win; win = win->next) {
345
				if (win->screen && win->screen->scene) /* zealous check... */
346
					if (win->screen->scene != CTX_data_scene(C))
347
						BKE_scene_set_background(G.main, win->screen->scene);
348
			}
349
		}
350
	}
351
	BKE_scene_set_background(G.main, CTX_data_scene(C));
352
353
	if (mode != 'u') {
354
		IMB_colormanagement_check_file_config(G.main);
355
	}
356
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
357
	MEM_freeN(bfd);
1.3.7 by Kevin Roy
Import upstream version 2.61
358
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
359
}
360
1.3.7 by Kevin Roy
Import upstream version 2.61
361
static int handle_subversion_warning(Main *main, ReportList *reports)
1.2.5 by Lukas Fittl
Import upstream version 2.43
362
{
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
363
	if (main->minversionfile > BLENDER_VERSION ||
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
364
	    (main->minversionfile == BLENDER_VERSION &&
365
	     main->minsubversionfile > BLENDER_SUBVERSION))
366
	{
367
		BKE_reportf(reports, RPT_ERROR, "File written by newer Blender binary (%d.%d), expect loss of data!",
368
		            main->minversionfile, main->minsubversionfile);
1.2.5 by Lukas Fittl
Import upstream version 2.43
369
	}
1.3.7 by Kevin Roy
Import upstream version 2.61
370
1.2.10 by Chris Coulson
Import upstream version 2.49a+dfsg
371
	return 1;
1.2.5 by Lukas Fittl
Import upstream version 2.43
372
}
373
1.3.6 by Kevin Roy
Import upstream version 2.59
374
static void keymap_item_free(wmKeyMapItem *kmi)
375
{
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
376
	if (kmi->properties) {
1.3.6 by Kevin Roy
Import upstream version 2.59
377
		IDP_FreeProperty(kmi->properties);
378
		MEM_freeN(kmi->properties);
379
	}
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
380
	if (kmi->ptr)
1.3.6 by Kevin Roy
Import upstream version 2.59
381
		MEM_freeN(kmi->ptr);
382
}
383
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
384
void BKE_userdef_free(void)
385
{
386
	wmKeyMap *km;
387
	wmKeyMapItem *kmi;
1.3.6 by Kevin Roy
Import upstream version 2.59
388
	wmKeyMapDiffItem *kmdi;
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
389
	bAddon *addon, *addon_next;
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
390
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
391
	for (km = U.user_keymaps.first; km; km = km->next) {
392
		for (kmdi = km->diff_items.first; kmdi; kmdi = kmdi->next) {
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
393
			if (kmdi->add_item) {
1.3.6 by Kevin Roy
Import upstream version 2.59
394
				keymap_item_free(kmdi->add_item);
395
				MEM_freeN(kmdi->add_item);
396
			}
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
397
			if (kmdi->remove_item) {
1.3.6 by Kevin Roy
Import upstream version 2.59
398
				keymap_item_free(kmdi->remove_item);
399
				MEM_freeN(kmdi->remove_item);
400
			}
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
401
		}
402
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
403
		for (kmi = km->items.first; kmi; kmi = kmi->next)
1.3.6 by Kevin Roy
Import upstream version 2.59
404
			keymap_item_free(kmi);
405
406
		BLI_freelistN(&km->diff_items);
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
407
		BLI_freelistN(&km->items);
408
	}
409
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
410
	for (addon = U.addons.first; addon; addon = addon_next) {
411
		addon_next = addon->next;
412
		if (addon->prop) {
413
			IDP_FreeProperty(addon->prop);
414
			MEM_freeN(addon->prop);
415
		}
416
		MEM_freeN(addon);
417
	}
418
1.5.3 by Matteo F. Vescovi
Import upstream version 2.68a
419
	BLI_freelistN(&U.autoexec_paths);
420
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
421
	BLI_freelistN(&U.uistyles);
422
	BLI_freelistN(&U.uifonts);
423
	BLI_freelistN(&U.themes);
1.3.6 by Kevin Roy
Import upstream version 2.59
424
	BLI_freelistN(&U.user_keymaps);
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
425
}
426
427
/* handle changes in settings that need recalc */
428
void BKE_userdef_state(void)
429
{
1.3.12 by Matteo F. Vescovi
Import upstream version 2.66
430
	/* prevent accidents */
431
	if (U.pixelsize == 0) U.pixelsize = 1;
432
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
433
	BLF_default_dpi(U.pixelsize * U.dpi);
434
	U.widget_unit = (U.pixelsize * U.dpi * 20 + 36) / 72;
435
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
436
}
437
1.3.5 by Kevin Roy
Import upstream version 2.58-svn37702
438
int BKE_read_file(bContext *C, const char *filepath, ReportList *reports)
1.1.2 by Martin Pitt
Import upstream version 2.37a
439
{
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
440
	BlendFileData *bfd;
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
441
	int retval = BKE_READ_FILE_OK;
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
442
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
443
	if (strstr(filepath, BLENDER_STARTUP_FILE) == NULL) /* don't print user-pref loading */
1.3.5 by Kevin Roy
Import upstream version 2.58-svn37702
444
		printf("read blend: %s\n", filepath);
1.4.2 by Kevin Roy
Import upstream version 2.53-beta-svn30596
445
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
446
	bfd = BLO_read_from_file(filepath, reports);
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
447
	if (bfd) {
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
448
		if (bfd->user) retval = BKE_READ_FILE_OK_USERPREFS;
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
449
		
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
450
		if (0 == handle_subversion_warning(bfd->main, reports)) {
1.2.10 by Chris Coulson
Import upstream version 2.49a+dfsg
451
			free_main(bfd->main);
452
			MEM_freeN(bfd);
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
453
			bfd = NULL;
454
			retval = BKE_READ_FILE_FAIL;
1.2.10 by Chris Coulson
Import upstream version 2.49a+dfsg
455
		}
456
		else
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
457
			setup_app_data(C, bfd, filepath);  // frees BFD
458
	}
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
459
	else
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
460
		BKE_reports_prependf(reports, "Loading '%s' failed: ", filepath);
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
461
		
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
462
	return (bfd ? retval : BKE_READ_FILE_FAIL);
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
463
}
464
1.5.4 by Matteo F. Vescovi
Import upstream version 2.69
465
int BKE_read_file_from_memory(bContext *C, const void *filebuf, int filelength, ReportList *reports, int update_defaults)
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
466
{
467
	BlendFileData *bfd;
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
468
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
469
	bfd = BLO_read_from_memory(filebuf, filelength, reports);
1.5.4 by Matteo F. Vescovi
Import upstream version 2.69
470
	if (bfd) {
471
		if (update_defaults)
472
			BLO_update_defaults_startup_blend(bfd->main);
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
473
		setup_app_data(C, bfd, "<memory2>");
1.5.4 by Matteo F. Vescovi
Import upstream version 2.69
474
	}
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
475
	else
476
		BKE_reports_prepend(reports, "Loading failed: ");
477
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
478
	return (bfd ? 1 : 0);
1.1.1 by Masayuki Hatta (mhatta)
Import upstream version 2.33a
479
}
1.1.2 by Martin Pitt
Import upstream version 2.37a
480
1.2.5 by Lukas Fittl
Import upstream version 2.43
481
/* memfile is the undo buffer */
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
482
int BKE_read_file_from_memfile(bContext *C, MemFile *memfile, ReportList *reports)
1.1.2 by Martin Pitt
Import upstream version 2.37a
483
{
484
	BlendFileData *bfd;
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
485
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
486
	bfd = BLO_read_from_memfile(CTX_data_main(C), G.main->name, memfile, reports);
487
	if (bfd) {
488
		/* remove the unused screens and wm */
489
		while (bfd->main->wm.first)
490
			BKE_libblock_free(&bfd->main->wm, bfd->main->wm.first);
491
		while (bfd->main->screen.first)
492
			BKE_libblock_free(&bfd->main->screen, bfd->main->screen.first);
493
		
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
494
		setup_app_data(C, bfd, "<memory1>");
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
495
	}
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
496
	else
497
		BKE_reports_prepend(reports, "Loading failed: ");
498
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
499
	return (bfd ? 1 : 0);
500
}
501
502
/* only read the userdef from a .blend */
503
int BKE_read_file_userdef(const char *filepath, ReportList *reports)
504
{
505
	BlendFileData *bfd;
506
	int retval = 0;
507
	
508
	bfd = BLO_read_from_file(filepath, reports);
509
	if (bfd->user) {
510
		retval = BKE_READ_FILE_OK_USERPREFS;
511
		
512
		/* only here free userdef themes... */
513
		BKE_userdef_free();
514
		
515
		U = *bfd->user;
516
		MEM_freeN(bfd->user);
517
	}
518
	free_main(bfd->main);
519
	MEM_freeN(bfd);
520
	
521
	return retval;
522
}
523
524
/* only write the userdef in a .blend */
525
int BKE_write_file_userdef(const char *filepath, ReportList *reports)
526
{
527
	Main *mainb = MEM_callocN(sizeof(Main), "empty main");
528
	int retval = 0;
529
	
530
	if (BLO_write_file(mainb, filepath, G_FILE_USERPREFS, reports, NULL)) {
531
		retval = 1;
532
	}
533
	
534
	MEM_freeN(mainb);
535
	
536
	return retval;
537
}
1.4.2 by Kevin Roy
Import upstream version 2.53-beta-svn30596
538
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
539
/* *****************  testing for break ************* */
540
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
541
static void (*blender_test_break_cb)(void) = NULL;
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
542
543
void set_blender_test_break_cb(void (*func)(void) )
544
{
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
545
	blender_test_break_cb = func;
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
546
}
547
548
549
int blender_test_break(void)
550
{
551
	if (!G.background) {
552
		if (blender_test_break_cb)
553
			blender_test_break_cb();
1.1.2 by Martin Pitt
Import upstream version 2.37a
554
	}
555
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
556
	return (G.is_break == TRUE);
1.1.2 by Martin Pitt
Import upstream version 2.37a
557
}
558
559
560
/* ***************** GLOBAL UNDO *************** */
561
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
562
#define UNDO_DISK   0
1.1.2 by Martin Pitt
Import upstream version 2.37a
563
564
typedef struct UndoElem {
565
	struct UndoElem *next, *prev;
1.3.7 by Kevin Roy
Import upstream version 2.61
566
	char str[FILE_MAX];
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
567
	char name[BKE_UNDO_STR_MAX];
1.1.2 by Martin Pitt
Import upstream version 2.37a
568
	MemFile memfile;
1.2.9 by Cyril Brulebois
Import upstream version 2.48a+dfsg
569
	uintptr_t undosize;
1.1.2 by Martin Pitt
Import upstream version 2.37a
570
} UndoElem;
571
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
572
static ListBase undobase = {NULL, NULL};
573
static UndoElem *curundo = NULL;
1.1.2 by Martin Pitt
Import upstream version 2.37a
574
575
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
576
static int read_undosave(bContext *C, UndoElem *uel)
1.1.2 by Martin Pitt
Import upstream version 2.37a
577
{
1.3.2 by Kevin Roy
Import upstream version 2.56.1-beta-svn34076
578
	char mainstr[sizeof(G.main->name)];
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
579
	int success = 0, fileflags;
1.1.2 by Martin Pitt
Import upstream version 2.37a
580
	
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
581
	/* This is needed so undoing/redoing doesn't crash with threaded previews going */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
582
	WM_jobs_kill_all_except(CTX_wm_manager(C), CTX_wm_screen(C));
583
584
	BLI_strncpy(mainstr, G.main->name, sizeof(mainstr));    /* temporal store */
585
586
	fileflags = G.fileflags;
1.1.2 by Martin Pitt
Import upstream version 2.37a
587
	G.fileflags |= G_FILE_NO_UI;
588
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
589
	if (UNDO_DISK) 
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
590
		success = (BKE_read_file(C, uel->str, NULL) != BKE_READ_FILE_FAIL);
1.1.2 by Martin Pitt
Import upstream version 2.37a
591
	else
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
592
		success = BKE_read_file_from_memfile(C, &uel->memfile, NULL);
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
593
1.1.2 by Martin Pitt
Import upstream version 2.37a
594
	/* restore */
1.3.3 by Kevin Roy
Import upstream version 2.57-svn36147
595
	BLI_strncpy(G.main->name, mainstr, sizeof(G.main->name)); /* restore */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
596
	G.fileflags = fileflags;
1.1.2 by Martin Pitt
Import upstream version 2.37a
597
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
598
	if (success) {
1.3.2 by Kevin Roy
Import upstream version 2.56.1-beta-svn34076
599
		/* important not to update time here, else non keyed tranforms are lost */
1.3.3 by Kevin Roy
Import upstream version 2.57-svn36147
600
		DAG_on_visible_update(G.main, FALSE);
1.3.2 by Kevin Roy
Import upstream version 2.56.1-beta-svn34076
601
	}
1.4.2 by Kevin Roy
Import upstream version 2.53-beta-svn30596
602
1.1.2 by Martin Pitt
Import upstream version 2.37a
603
	return success;
604
}
605
606
/* name can be a dynamic string */
1.3.2 by Kevin Roy
Import upstream version 2.56.1-beta-svn34076
607
void BKE_write_undo(bContext *C, const char *name)
1.1.2 by Martin Pitt
Import upstream version 2.37a
608
{
1.2.9 by Cyril Brulebois
Import upstream version 2.48a+dfsg
609
	uintptr_t maxmem, totmem, memused;
1.3.7 by Kevin Roy
Import upstream version 2.61
610
	int nr /*, success */ /* UNUSED */;
1.1.2 by Martin Pitt
Import upstream version 2.37a
611
	UndoElem *uel;
612
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
613
	if ((U.uiflag & USER_GLOBALUNDO) == 0) {
614
		return;
615
	}
616
617
	if (U.undosteps == 0) {
618
		return;
619
	}
1.2.2 by Daniel Holbach
Import upstream version 2.40
620
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
621
	/* remove all undos after (also when curundo == NULL) */
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
622
	while (undobase.last != curundo) {
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
623
		uel = undobase.last;
1.1.2 by Martin Pitt
Import upstream version 2.37a
624
		BLI_remlink(&undobase, uel);
625
		BLO_free_memfile(&uel->memfile);
626
		MEM_freeN(uel);
627
	}
628
	
629
	/* make new */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
630
	curundo = uel = MEM_callocN(sizeof(UndoElem), "undo file");
1.3.7 by Kevin Roy
Import upstream version 2.61
631
	BLI_strncpy(uel->name, name, sizeof(uel->name));
1.1.2 by Martin Pitt
Import upstream version 2.37a
632
	BLI_addtail(&undobase, uel);
633
	
634
	/* and limit amount to the maximum */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
635
	nr = 0;
636
	uel = undobase.last;
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
637
	while (uel) {
1.1.2 by Martin Pitt
Import upstream version 2.37a
638
		nr++;
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
639
		if (nr == U.undosteps) break;
640
		uel = uel->prev;
1.1.2 by Martin Pitt
Import upstream version 2.37a
641
	}
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
642
	if (uel) {
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
643
		while (undobase.first != uel) {
644
			UndoElem *first = undobase.first;
1.1.2 by Martin Pitt
Import upstream version 2.37a
645
			BLI_remlink(&undobase, first);
646
			/* the merge is because of compression */
647
			BLO_merge_memfile(&first->memfile, &first->next->memfile);
648
			MEM_freeN(first);
649
		}
650
	}
651
652
653
	/* disk save version */
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
654
	if (UNDO_DISK) {
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
655
		static int counter = 0;
1.3.7 by Kevin Roy
Import upstream version 2.61
656
		char filepath[FILE_MAX];
1.1.2 by Martin Pitt
Import upstream version 2.37a
657
		char numstr[32];
1.3.5 by Kevin Roy
Import upstream version 2.58-svn37702
658
		int fileflags = G.fileflags & ~(G_FILE_HISTORY); /* don't do file history on undo */
659
660
		/* calculate current filepath */
1.1.2 by Martin Pitt
Import upstream version 2.37a
661
		counter++;
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
662
		counter = counter % U.undosteps;
1.1.2 by Martin Pitt
Import upstream version 2.37a
663
	
1.3.3 by Kevin Roy
Import upstream version 2.57-svn36147
664
		BLI_snprintf(numstr, sizeof(numstr), "%d.blend", counter);
1.3.7 by Kevin Roy
Import upstream version 2.61
665
		BLI_make_file_string("/", filepath, BLI_temporary_dir(), numstr);
1.1.2 by Martin Pitt
Import upstream version 2.37a
666
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
667
		/* success = */ /* UNUSED */ BLO_write_file(CTX_data_main(C), filepath, fileflags, NULL, NULL);
1.1.2 by Martin Pitt
Import upstream version 2.37a
668
		
1.3.5 by Kevin Roy
Import upstream version 2.58-svn37702
669
		BLI_strncpy(curundo->str, filepath, sizeof(curundo->str));
1.1.2 by Martin Pitt
Import upstream version 2.37a
670
	}
671
	else {
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
672
		MemFile *prevfile = NULL;
673
		
674
		if (curundo->prev) prevfile = &(curundo->prev->memfile);
675
		
676
		memused = MEM_get_memory_in_use();
677
		/* success = */ /* UNUSED */ BLO_write_file_mem(CTX_data_main(C), prevfile, &curundo->memfile, G.fileflags);
678
		curundo->undosize = MEM_get_memory_in_use() - memused;
1.2.9 by Cyril Brulebois
Import upstream version 2.48a+dfsg
679
	}
680
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
681
	if (U.undomemory != 0) {
1.2.9 by Cyril Brulebois
Import upstream version 2.48a+dfsg
682
		/* limit to maximum memory (afterwards, we can't know in advance) */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
683
		totmem = 0;
684
		maxmem = ((uintptr_t)U.undomemory) * 1024 * 1024;
1.2.9 by Cyril Brulebois
Import upstream version 2.48a+dfsg
685
686
		/* keep at least two (original + other) */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
687
		uel = undobase.last;
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
688
		while (uel && uel->prev) {
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
689
			totmem += uel->undosize;
690
			if (totmem > maxmem) break;
691
			uel = uel->prev;
1.2.9 by Cyril Brulebois
Import upstream version 2.48a+dfsg
692
		}
693
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
694
		if (uel) {
695
			if (uel->prev && uel->prev->prev)
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
696
				uel = uel->prev;
1.2.9 by Cyril Brulebois
Import upstream version 2.48a+dfsg
697
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
698
			while (undobase.first != uel) {
699
				UndoElem *first = undobase.first;
1.2.9 by Cyril Brulebois
Import upstream version 2.48a+dfsg
700
				BLI_remlink(&undobase, first);
701
				/* the merge is because of compression */
702
				BLO_merge_memfile(&first->memfile, &first->next->memfile);
703
				MEM_freeN(first);
704
			}
705
		}
1.1.2 by Martin Pitt
Import upstream version 2.37a
706
	}
707
}
708
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
709
/* 1 = an undo, -1 is a redo. we have to make sure 'curundo' remains at current situation */
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
710
void BKE_undo_step(bContext *C, int step)
1.1.2 by Martin Pitt
Import upstream version 2.37a
711
{
712
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
713
	if (step == 0) {
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
714
		read_undosave(C, curundo);
1.1.2 by Martin Pitt
Import upstream version 2.37a
715
	}
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
716
	else if (step == 1) {
1.1.2 by Martin Pitt
Import upstream version 2.37a
717
		/* curundo should never be NULL, after restart or load file it should call undo_save */
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
718
		if (curundo == NULL || curundo->prev == NULL) {
719
			// XXX error("No undo available");
720
		}
1.1.2 by Martin Pitt
Import upstream version 2.37a
721
		else {
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
722
			if (G.debug & G_DEBUG) printf("undo %s\n", curundo->name);
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
723
			curundo = curundo->prev;
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
724
			read_undosave(C, curundo);
1.1.2 by Martin Pitt
Import upstream version 2.37a
725
		}
726
	}
727
	else {
728
		/* curundo has to remain current situation! */
729
		
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
730
		if (curundo == NULL || curundo->next == NULL) {
731
			// XXX error("No redo available");
732
		}
1.1.2 by Martin Pitt
Import upstream version 2.37a
733
		else {
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
734
			read_undosave(C, curundo->next);
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
735
			curundo = curundo->next;
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
736
			if (G.debug & G_DEBUG) printf("redo %s\n", curundo->name);
1.1.2 by Martin Pitt
Import upstream version 2.37a
737
		}
738
	}
739
}
740
741
void BKE_reset_undo(void)
742
{
743
	UndoElem *uel;
744
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
745
	uel = undobase.first;
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
746
	while (uel) {
1.1.2 by Martin Pitt
Import upstream version 2.37a
747
		BLO_free_memfile(&uel->memfile);
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
748
		uel = uel->next;
1.1.2 by Martin Pitt
Import upstream version 2.37a
749
	}
750
	
751
	BLI_freelistN(&undobase);
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
752
	curundo = NULL;
1.1.2 by Martin Pitt
Import upstream version 2.37a
753
}
754
755
/* based on index nr it does a restore */
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
756
void BKE_undo_number(bContext *C, int nr)
1.1.2 by Martin Pitt
Import upstream version 2.37a
757
{
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
758
	curundo = BLI_findlink(&undobase, nr);
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
759
	BKE_undo_step(C, 0);
760
}
761
762
/* go back to the last occurance of name in stack */
763
void BKE_undo_name(bContext *C, const char *name)
764
{
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
765
	UndoElem *uel = BLI_rfindstring(&undobase, name, offsetof(UndoElem, name));
1.3.2 by Kevin Roy
Import upstream version 2.56.1-beta-svn34076
766
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
767
	if (uel && uel->prev) {
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
768
		curundo = uel->prev;
1.4.1 by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834
769
		BKE_undo_step(C, 0);
770
	}
771
}
772
1.3.3 by Kevin Roy
Import upstream version 2.57-svn36147
773
/* name optional */
774
int BKE_undo_valid(const char *name)
775
{
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
776
	if (name) {
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
777
		UndoElem *uel = BLI_rfindstring(&undobase, name, offsetof(UndoElem, name));
1.3.3 by Kevin Roy
Import upstream version 2.57-svn36147
778
		return uel && uel->prev;
779
	}
780
	
781
	return undobase.last != undobase.first;
782
}
783
1.3.5 by Kevin Roy
Import upstream version 2.58-svn37702
784
/* get name of undo item, return null if no item with this index */
785
/* if active pointer, set it to 1 if true */
1.3.7 by Kevin Roy
Import upstream version 2.61
786
const char *BKE_undo_get_name(int nr, int *active)
1.3.5 by Kevin Roy
Import upstream version 2.58-svn37702
787
{
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
788
	UndoElem *uel = BLI_findlink(&undobase, nr);
1.3.5 by Kevin Roy
Import upstream version 2.58-svn37702
789
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
790
	if (active) *active = 0;
1.3.5 by Kevin Roy
Import upstream version 2.58-svn37702
791
	
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
792
	if (uel) {
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
793
		if (active && uel == curundo)
794
			*active = 1;
1.3.5 by Kevin Roy
Import upstream version 2.58-svn37702
795
		return uel->name;
796
	}
797
	return NULL;
798
}
1.1.2 by Martin Pitt
Import upstream version 2.37a
799
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
800
/* saves .blend using undo buffer, returns 1 == success */
801
int BKE_undo_save_file(const char *filename)
1.1.2 by Martin Pitt
Import upstream version 2.37a
802
{
803
	UndoElem *uel;
804
	MemFileChunk *chunk;
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
805
	const int flag = O_BINARY + O_WRONLY + O_CREAT + O_TRUNC + O_EXCL;
1.1.2 by Martin Pitt
Import upstream version 2.37a
806
	int file;
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
807
808
	if ((U.uiflag & USER_GLOBALUNDO) == 0) {
809
		return 0;
810
	}
811
812
	uel = curundo;
813
	if (uel == NULL) {
814
		fprintf(stderr, "No undo buffer to save recovery file\n");
815
		return 0;
816
	}
817
818
	/* first try create the file, if it exists call without 'O_CREAT',
819
	 * to avoid writing to a symlink - use 'O_EXCL' (CVE-2008-1103) */
820
	errno = 0;
821
	file = BLI_open(filename, flag, 0666);
1.5.4 by Matteo F. Vescovi
Import upstream version 2.69
822
	if (file < 0) {
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
823
		if (errno == EEXIST) {
824
			errno = 0;
825
			file = BLI_open(filename, flag & ~O_CREAT, 0666);
826
		}
827
	}
828
829
	if (file == -1) {
830
		fprintf(stderr, "Unable to save '%s': %s\n",
831
		        filename, errno ? strerror(errno) : "Unknown error opening file");
832
		return 0;
833
	}
834
835
	for (chunk = uel->memfile.chunks.first; chunk; chunk = chunk->next) {
836
		if (write(file, chunk->buf, chunk->size) != chunk->size) {
837
			break;
838
		}
1.1.2 by Martin Pitt
Import upstream version 2.37a
839
	}
840
	
841
	close(file);
842
	
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
843
	if (chunk) {
844
		fprintf(stderr, "Unable to save '%s': %s\n",
845
		        filename, errno ? strerror(errno) : "Unknown error writing file");
846
		return 0;
847
	}
848
	return 1;
1.1.2 by Martin Pitt
Import upstream version 2.37a
849
}
850
1.4.2 by Kevin Roy
Import upstream version 2.53-beta-svn30596
851
/* sets curscene */
852
Main *BKE_undo_get_main(Scene **scene)
853
{
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
854
	Main *mainp = NULL;
855
	BlendFileData *bfd = BLO_read_from_memfile(G.main, G.main->name, &curundo->memfile, NULL);
1.4.2 by Kevin Roy
Import upstream version 2.53-beta-svn30596
856
	
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
857
	if (bfd) {
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
858
		mainp = bfd->main;
1.3.9 by Matteo F. Vescovi
Import upstream version 2.63
859
		if (scene)
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
860
			*scene = bfd->curscene;
1.4.2 by Kevin Roy
Import upstream version 2.53-beta-svn30596
861
		
862
		MEM_freeN(bfd);
863
	}
864
	
865
	return mainp;
866
}
867
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
868
/* ************** copy paste .blend, partial saves ********** */
869
870
/* assumes data is in G.main */
871
872
void BKE_copybuffer_begin(void)
873
{
874
	/* set all id flags to zero; */
875
	flag_all_listbases_ids(LIB_NEED_EXPAND | LIB_DOIT, 0);
876
}
877
878
void BKE_copybuffer_tag_ID(ID *id)
879
{
880
	id->flag |= LIB_NEED_EXPAND | LIB_DOIT;
881
}
882
883
static void copybuffer_doit(void *UNUSED(handle), Main *UNUSED(bmain), void *vid)
884
{
885
	if (vid) {
886
		ID *id = vid;
1.5.1 by Jeremy Bicha
Import upstream version 2.66a
887
		/* only tag for need-expand if not done, prevents eternal loops */
888
		if ((id->flag & LIB_DOIT) == 0)
889
			id->flag |= LIB_NEED_EXPAND | LIB_DOIT;
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
890
	}
891
}
892
893
/* frees main in end */
1.5.2 by Matteo F. Vescovi
Import upstream version 2.67b
894
int BKE_copybuffer_save(const char *filename, ReportList *reports)
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
895
{
896
	Main *mainb = MEM_callocN(sizeof(Main), "copybuffer");
897
	ListBase *lbarray[MAX_LIBARRAY], *fromarray[MAX_LIBARRAY];
898
	int a, retval;
899
	
900
	BLO_main_expander(copybuffer_doit);
901
	BLO_expand_main(NULL, G.main);
902
	
903
	/* move over all tagged blocks */
904
	set_listbasepointers(G.main, fromarray);
905
	a = set_listbasepointers(mainb, lbarray);
906
	while (a--) {
907
		ID *id, *nextid;
908
		ListBase *lb1 = lbarray[a], *lb2 = fromarray[a];
909
		
910
		for (id = lb2->first; id; id = nextid) {
911
			nextid = id->next;
912
			if (id->flag & LIB_DOIT) {
913
				BLI_remlink(lb2, id);
914
				BLI_addtail(lb1, id);
915
			}
916
		}
917
	}
918
	
919
	
920
	/* save the buffer */
921
	retval = BLO_write_file(mainb, filename, 0, reports, NULL);
922
	
923
	/* move back the main, now sorted again */
924
	set_listbasepointers(G.main, lbarray);
925
	a = set_listbasepointers(mainb, fromarray);
926
	while (a--) {
927
		ID *id;
928
		ListBase *lb1 = lbarray[a], *lb2 = fromarray[a];
929
		
1.5.4 by Matteo F. Vescovi
Import upstream version 2.69
930
		while ((id = BLI_pophead(lb2))) {
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
931
			BLI_addtail(lb1, id);
932
			id_sort_by_name(lb1, id);
933
		}
934
	}
935
	
936
	MEM_freeN(mainb);
937
	
938
	/* set id flag to zero; */
939
	flag_all_listbases_ids(LIB_NEED_EXPAND | LIB_DOIT, 0);
940
	
941
	return retval;
942
}
943
944
/* return success (1) */
1.5.2 by Matteo F. Vescovi
Import upstream version 2.67b
945
int BKE_copybuffer_paste(bContext *C, const char *libname, ReportList *reports)
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
946
{
947
	Main *bmain = CTX_data_main(C);
948
	Scene *scene = CTX_data_scene(C);
949
	Main *mainl = NULL;
950
	Library *lib;
951
	BlendHandle *bh;
952
		
953
	bh = BLO_blendhandle_from_file(libname, reports);
954
	
955
	if (bh == NULL) {
956
		/* error reports will have been made by BLO_blendhandle_from_file() */
957
		return 0;
958
	}
959
960
	BKE_scene_base_deselect_all(scene);
961
	
962
	/* tag everything, all untagged data can be made local
963
	 * its also generally useful to know what is new
964
	 *
965
	 * take extra care flag_all_listbases_ids(LIB_LINK_TAG, 0) is called after! */
966
	flag_all_listbases_ids(LIB_PRE_EXISTING, 1);
967
	
968
	/* here appending/linking starts */
969
	mainl = BLO_library_append_begin(bmain, &bh, libname);
970
	
971
	BLO_library_append_all(mainl, bh);
972
973
	BLO_library_append_end(C, mainl, &bh, 0, 0);
974
	
975
	/* mark all library linked objects to be updated */
976
	recalc_all_library_objects(bmain);
977
	IMB_colormanagement_check_file_config(bmain);
978
	
979
	/* append, rather than linking */
980
	lib = BLI_findstring(&bmain->library, libname, offsetof(Library, filepath));
1.5.2 by Matteo F. Vescovi
Import upstream version 2.67b
981
	BKE_library_make_local(bmain, lib, true);
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
982
	
983
	/* important we unset, otherwise these object wont
984
	 * link into other scenes from this blend file */
985
	flag_all_listbases_ids(LIB_PRE_EXISTING, 0);
986
	
987
	/* recreate dependency graph to include new objects */
1.5.2 by Matteo F. Vescovi
Import upstream version 2.67b
988
	DAG_relations_tag_update(bmain);
1.3.11 by Matteo F. Vescovi
Import upstream version 2.65a+svn53743
989
	
990
	BLO_blendhandle_close(bh);
991
	/* remove library... */
992
	
993
	return 1;
994
}