-/* === S I N F G =========================================================== */
+/* === S Y N F I G ========================================================= */
/*! \file canvas.h
** \brief Canvas Class Implementation
**
-** $Id: canvas.h,v 1.1.1.1 2005/01/04 01:23:14 darco Exp $
+** $Id$
**
** \legal
-** Copyright (c) 2002 Robert B. Quattlebaum Jr.
+** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+** Copyright (c) 2007, 2008 Chris Moore
**
-** This software and associated documentation
-** are CONFIDENTIAL and PROPRIETARY property of
-** the above-mentioned copyright holder.
+** This package is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 2 of
+** the License, or (at your option) any later version.
**
-** You may not copy, print, publish, or in any
-** other way distribute this software without
-** a prior written agreement with
-** the copyright holder.
+** This package is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
** \endlegal
*/
/* ========================================================================= */
/* === S T A R T =========================================================== */
-#ifndef __SINFG_CANVAS_H
-#define __SINFG_CANVAS_H
+#ifndef __SYNFIG_CANVAS_H
+#define __SYNFIG_CANVAS_H
/* === H E A D E R S ======================================================= */
#include <list>
#include <ETL/handle>
#include <sigc++/signal.h>
+#include <sigc++/connection.h>
#include "vector.h"
#include "string.h"
/* === M A C R O S ========================================================= */
+/* version change history:
+ *
+ * 0.1: the original version
+ *
+ * if a waypoint goes from -179 to 179 degrees, that is a 2
+ * degree change. there's no way to express a 720 degree
+ * rotation with a single pair of waypoints
+ *
+ * 0.2: svn r1227
+ *
+ * angles no longer wrap at -180 degrees back to 180 degrees; if
+ * a waypoint goes from -179 to 179 degrees, that is a rotation
+ * of 358 degrees. loading a version 0.1 canvas will modify
+ * constant angle waypoints to that they are within 180 degrees
+ * of the previous waypoint's value
+ *
+ * the 'straight' blend method didn't used to work properly. it
+ * didn't work at all on transparent pixels in layers other than
+ * the PasteCanvas layer. for example, the examples/japan.sifz
+ * file has a red circle (straight, amount=1.0) on top of a
+ * striped conical gradient. if 'straight' was working, the
+ * conical gradient would be entirely obscured by the circle
+ * layer (even by its transparent pixels)
+ *
+ * 0.3: svn r1422
+ *
+ * the 'straight' blend method was fixed. loading a version 0.2
+ * or older canvas will replace the 'straight' blend method in
+ * non-pastecanvas layers with 'composite', unless they're
+ * completely transparent, in which case it will replace them
+ * with an 'alpha over' blend instead. Images like
+ * examples/logo.sifz use transparent straight blends to do
+ * masking, which no longer works now that 'straight' blending is
+ * fixed.
+ *
+ * Tangent lengths calculated by the "Segment Tangent" and "BLine
+ * Tangent" ValueNodes were scaled by a factor of 0.5.
+ *
+ * 0.4: svn r1856
+ *
+ * Stop scaling tangents by 0.5.
+ *
+ * 0.5: svn r1863
+ *
+ * Added "offset", "scale", and "fixed_length" links to the
+ * "BLine Tangent" ValueNode.
+ *
+ * 0.6: svn r2067
+ *
+ * Added "scale" link to the "BLine Width" ValueNode in svn r1872.
+ *
+ * Added "loop" link to the "Gradient Color" ValueNode in svn r1901.
+ */
+
+#define CURRENT_CANVAS_VERSION "0.6"
+
/* === T Y P E D E F S ===================================================== */
/* === C L A S S E S & S T R U C T S ======================================= */
-namespace sinfg {
+namespace synfig {
class Context;
class GUID;
-
+
/*! \class Canvas
** \todo writeme
*/
typedef std::list<Handle> Children;
- friend void sinfg::optimize_layers(Context, Canvas::Handle);
+ friend void synfig::optimize_layers(Time, Context, Canvas::Handle, bool seen_motion_blur);
/*
-- ** -- D A T A -------------------------------------------------------------
/*! \see set_description(), get_description() */
String description_;
+ //! Contains the canvas' version string
+ /*! \see set_version(), get_version() */
+ String version_;
+
//! Contains the author's name
/*! \see set_author(), get_author() */
String author_;
//! List containing any child Canvases
/*! \see children() */
- Children children_;
-
+ Children children_;
+
//! Render Description for Canvas
/*! \see rend_desc() */
RendDesc desc_;
//! \writeme
mutable std::map<String,Handle> externals_;
-
+
//! This flag is set if this canvas is "inline"
bool is_inline_;
mutable bool is_dirty_;
-
+
bool op_flag_;
-
+
//! Layer Group database
- std::map<String,std::set<etl::handle<Layer> > > group_db_;
+ std::map<String,std::set<etl::handle<Layer> > > group_db_;
+
+ //! Layer Connection database
+ std::map<etl::loose_handle<Layer>,std::vector<sigc::connection> > connections_;
/*
-- ** -- S I G N A L S -------------------------------------------------------
private:
//! Group Added
- sigc::signal<void,String> signal_group_added_;
+ sigc::signal<void,String> signal_group_added_;
//! Group Removed
- sigc::signal<void,String> signal_group_removed_;
-
+ sigc::signal<void,String> signal_group_removed_;
+
//! Group Changed
- sigc::signal<void,String> signal_group_changed_;
+ sigc::signal<void,String> signal_group_changed_;
- sigc::signal<void,String,etl::handle<sinfg::Layer> > signal_group_pair_added_;
- sigc::signal<void,String,etl::handle<sinfg::Layer> > signal_group_pair_removed_;
+ sigc::signal<void,String,etl::handle<synfig::Layer> > signal_group_pair_added_;
+ sigc::signal<void,String,etl::handle<synfig::Layer> > signal_group_pair_removed_;
//! Layers Reordered
- sigc::signal<void,int*> signal_layers_reordered_;
-
+ sigc::signal<void,int*> signal_layers_reordered_;
+
//! RendDesc Changed
- sigc::signal<void> signal_rend_desc_changed_;
-
+ sigc::signal<void> signal_rend_desc_changed_;
+
//! ID Changed
- sigc::signal<void> signal_id_changed_;
+ sigc::signal<void> signal_id_changed_;
//! Dirty
- //sigc::signal<void> signal_dirty_;
+ //sigc::signal<void> signal_dirty_;
//! FileName Changed
- sigc::signal<void> signal_file_name_changed_;
+ sigc::signal<void> signal_file_name_changed_;
//! Metadata Changed
- sigc::signal<void, String> signal_meta_data_changed_;
+ sigc::signal<void, String> signal_meta_data_changed_;
//! Key-Specific meta data changed signals
std::map<String, sigc::signal<void> > signal_map_meta_data_changed_;
//! ValueBasenode Changed
- sigc::signal<void, etl::handle<ValueNode> > signal_value_node_changed_;
+ sigc::signal<void, etl::handle<ValueNode> > signal_value_node_changed_;
+
+ sigc::signal<void, etl::handle<ValueNode> > signal_value_node_renamed_;
- sigc::signal<void, etl::handle<ValueNode>, etl::handle<ValueNode> > signal_value_node_child_added_;
+ sigc::signal<void, etl::handle<ValueNode>, etl::handle<ValueNode> > signal_value_node_child_added_;
- sigc::signal<void, etl::handle<ValueNode>, etl::handle<ValueNode> > signal_value_node_child_removed_;
+ sigc::signal<void, etl::handle<ValueNode>, etl::handle<ValueNode> > signal_value_node_child_removed_;
/*
-- ** -- S I G N A L I N T E R F A C E -------------------------------------
public:
- sigc::signal<void,String,etl::handle<sinfg::Layer> >& signal_group_pair_added() { return signal_group_pair_added_; }
- sigc::signal<void,String,etl::handle<sinfg::Layer> >& signal_group_pair_removed() { return signal_group_pair_removed_; }
+ sigc::signal<void,String,etl::handle<synfig::Layer> >& signal_group_pair_added() { return signal_group_pair_added_; }
+ sigc::signal<void,String,etl::handle<synfig::Layer> >& signal_group_pair_removed() { return signal_group_pair_removed_; }
//! Group Added
sigc::signal<void,String>& signal_group_added() { return signal_group_added_; }
//! Group Removed
sigc::signal<void,String>& signal_group_removed() { return signal_group_removed_; }
-
+
//! Group Changed
sigc::signal<void,String>& signal_group_changed() { return signal_group_changed_; }
//! Layers Reordered
sigc::signal<void,int*>& signal_layers_reordered() { return signal_layers_reordered_; }
-
+
//! RendDesc Changed
sigc::signal<void>& signal_rend_desc_changed() { return signal_rend_desc_changed_; }
-
+
//! ID Changed
sigc::signal<void>& signal_id_changed() { return signal_id_changed_; }
//! File name Changed
sigc::signal<void>& signal_file_name_changed();
-
+
//! Metadata Changed
sigc::signal<void, String>& signal_meta_data_changed() { return signal_meta_data_changed_; }
//! Metadata Changed
sigc::signal<void>& signal_meta_data_changed(const String& key) { return signal_map_meta_data_changed_[key]; }
-
- sigc::signal<void, etl::handle<ValueNode> >& signal_value_node_changed() { return signal_value_node_changed_; }
+
+ sigc::signal<void, etl::handle<ValueNode> >& signal_value_node_changed() { return signal_value_node_changed_; }
+
+ sigc::signal<void, etl::handle<ValueNode> >& signal_value_node_renamed() { return signal_value_node_renamed_; }
//! Dirty
sigc::signal<void>& signal_dirty() { return signal_changed(); }
//! Returns the set of layers in group
std::set<etl::handle<Layer> > get_layers_in_group(const String&group);
-
+
//! Gets all the groups
std::set<String> get_groups()const;
-
+
//! Gets the number of groups in this canvas
int get_group_count()const;
//! Sets the name of the canvas
void set_name(const String &x);
+ //! Gets the version string of the canvas
+ const String get_version()const { return version_; }
+
+ //! Sets the version string of the canvas
+ void set_version(const String &x) { version_ = x; }
+
//! Gets the author of the canvas
const String & get_author()const { return author_; }
//! Sets the ID of the canvas
void set_id(const String &x);
-
+
//! Returns the data string for the given meta data key
String get_meta_data(const String& key)const;
LooseHandle parent()const { return parent_; }
LooseHandle get_root()const;
-
+
//! Returns a list of all child canvases in this canvas
std::list<Handle> &children() { return children_; }
//! \writeme
void add_value_node(ValueNode::Handle x, const String &id);
- //! \writeme
+ //! writeme
//void rename_value_node(ValueNode::Handle x, const String &id);
//! \writeme
** If not found, it creates a new Canvas and returns it
** If an error occurs, it returns an empty handle
*/
- Handle surefind_canvas(const String &id);
+ Handle surefind_canvas(const String &id,String &warnings);
//! Finds a child Canvas in the Canvas with the given \a id
/*! \return If found, returns a handle to the child Canvas.
** Otherwise, returns an empty handle.
*/
- Handle find_canvas(const String &id);
+ Handle find_canvas(const String &id, String &warnings);
//! Finds a child Canvas in the Canvas with the given \a id
/*! \return If found, returns a handle to the child Canvas.
** Otherwise, returns an empty handle.
*/
- ConstHandle find_canvas(const String &id)const;
+ ConstHandle find_canvas(const String &id, String &warnings)const;
//! Sets the file path for the Canvas
//void set_file_path(const String &);
//! Gets the filename (with path)
String get_file_name()const;
-
+
//! Creates a new child canvas, and returns its handle
Handle new_child_canvas();
- //! Creates a new child canvas with an ID of \aid, and returns its handle
+ //! Creates a new child canvas with an ID of \a id, and returns its handle
Handle new_child_canvas(const String &id);
//! Adds the given canvas as a child
const_reverse_iterator rbegin()const;
etl::handle<Layer> &back();
-
+
void push_back(etl::handle<Layer> x);
void push_front(etl::handle<Layer> x);
void insert(iterator iter,etl::handle<Layer> x);
void erase(iterator iter);
-
+
const etl::handle<Layer> &back()const;
void set_inline(LooseHandle parent);
static Handle create();
static Handle create_inline(Handle parent);
-
+
Handle clone(const GUID& deriv_guid=GUID())const;
+ void register_external_canvas(String file, Handle canvas);
+
private:
void add_group_pair(String group, etl::handle<Layer> layer);
void remove_group_pair(String group, etl::handle<Layer> layer);
+ void add_connection(etl::loose_handle<Layer> layer, sigc::connection connection);
+ void disconnect_connections(etl::loose_handle<Layer> layer);
protected:
virtual void on_changed();
virtual void get_times_vfunc(Node::time_set &set) const;
}; // END of class Canvas
-void optimize_layers(Context context, Canvas::Handle op_canvas);
+void optimize_layers(Time time, Context context, Canvas::Handle op_canvas, bool seen_motion_blur=false);
-}; // END of namespace sinfg
+}; // END of namespace synfig
/* === E N D =============================================================== */