/* === M A C R O S ========================================================= */
+#define ALLOW_CLONE_NON_INLINE_CANVASES
+
struct _CanvasCounter
{
static int counter;
Canvas::Handle external_canvas;
+ if(!is_absolute_path(file_name))
+ file_name = get_file_path()+ETL_DIRECTORY_SEPARATOR+file_name;
+
// If the composition is already open, then use it.
if(externals_.count(file_name))
external_canvas=externals_[file_name];
else
{
String errors;
- if(is_absolute_path(file_name))
- external_canvas=open_canvas(file_name, errors, warnings);
- else
- external_canvas=open_canvas(get_file_path()+ETL_DIRECTORY_SEPARATOR+file_name, errors, warnings);
-
+ external_canvas=open_canvas(file_name, errors, warnings);
if(!external_canvas)
throw runtime_error(errors);
externals_[file_name]=external_canvas;
Canvas::Handle external_canvas;
+ if(!is_absolute_path(file_name))
+ file_name = get_file_path()+ETL_DIRECTORY_SEPARATOR+file_name;
+
// If the composition is already open, then use it.
if(externals_.count(file_name))
external_canvas=externals_[file_name];
else
{
String errors, warnings;
- if(is_absolute_path(file_name))
- external_canvas=open_canvas(file_name, errors, warnings);
- else
- external_canvas=open_canvas(get_file_path()+ETL_DIRECTORY_SEPARATOR+file_name, errors, warnings);
-
+ external_canvas=open_canvas(file_name, errors, warnings);
if(!external_canvas)
throw runtime_error(errors);
externals_[file_name]=external_canvas;
{
name=get_id()+"_CLONE";
+#ifndef ALLOW_CLONE_NON_INLINE_CANVASES
throw runtime_error("Cloning of non-inline canvases is not yet supported");
+#endif // ALLOW_CLONE_NON_INLINE_CANVASES
}
Handle canvas(new Canvas(name));
!composite->reads_context())
{
Canvas::Handle sub_canvas(Canvas::create_inline(op_canvas));
- sub_canvas->push_back(composite = composite->clone());
+ // don't use clone() because it re-randomizes the seeds of any random valuenodes
+ sub_canvas->push_back(composite = composite->simple_clone());
layer = Layer::create("PasteCanvas");
composite->set_description(strprintf("Wrapped clone of '%s'", composite->get_non_empty_description().c_str()));
layer->set_description(strprintf("PasteCanvas wrapper for '%s'", composite->get_non_empty_description().c_str()));
(*iter)->add_to_group(new_name);
}
}
+
+void
+Canvas::register_external_canvas(String file_name, Handle canvas)
+{
+ if(!is_absolute_path(file_name)) file_name = get_file_path()+ETL_DIRECTORY_SEPARATOR+file_name;
+ externals_[file_name] = canvas;
+}
+
+#ifdef _DEBUG
+void
+Canvas::show_externals(String file, int line, String text) const
+{
+ printf(" .----- (externals for %lx '%s')\n | %s:%d %s\n", ulong(this), get_name().c_str(), file.c_str(), line, text.c_str());
+ std::map<String, Handle>::iterator iter;
+ for (iter = externals_.begin(); iter != externals_.end(); iter++)
+ {
+ synfig::String first(iter->first);
+ etl::loose_handle<Canvas> second(iter->second);
+ printf(" | %40s : %lx (%d)\n", first.c_str(), ulong(&*second), second->count());
+ }
+ printf(" `-----\n\n");
+}
+#endif // _DEBUG