Added copyright lines for files I've edited this year.
[synfig.git] / synfig-core / trunk / src / synfig / canvas.h
index 9a0e2ab..faa0288 100644 (file)
@@ -2,10 +2,11 @@
 /*!    \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-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2007, 2008 Chris Moore
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -31,6 +32,7 @@
 #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'
+ */
+
+#define CURRENT_CANVAS_VERSION "0.3"
+
 /* === T Y P E D E F S ===================================================== */
 
 /* === C L A S S E S & S T R U C T S ======================================= */
@@ -51,7 +86,7 @@ namespace synfig {
 
 class Context;
 class GUID;
-       
+
 /*!    \class Canvas
 **     \todo writeme
 */
@@ -68,7 +103,7 @@ public:
 
        typedef std::list<Handle> Children;
 
-       friend void synfig::optimize_layers(Context, Canvas::Handle);
+       friend void synfig::optimize_layers(Time, Context, Canvas::Handle, bool seen_motion_blur);
 
        /*
  --    ** -- D A T A -------------------------------------------------------------
@@ -88,6 +123,10 @@ private:
        /*!     \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_;
@@ -119,8 +158,8 @@ private:
 
        //! List containing any child Canvases
        /*!     \see children() */
-       Children children_;             
-       
+       Children children_;
+
        //! Render Description for Canvas
        /*!     \see rend_desc() */
     RendDesc desc_;
@@ -130,16 +169,19 @@ private:
 
        //! \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 -------------------------------------------------------
@@ -148,45 +190,47 @@ private:
 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<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 -------------------------------------
@@ -202,30 +246,32 @@ public:
 
        //!     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();   }
@@ -256,10 +302,10 @@ public:
 
        //! 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;
 
@@ -281,6 +327,12 @@ public:
        //! 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_; }
 
@@ -298,7 +350,7 @@ public:
 
        //! 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;
 
@@ -325,7 +377,7 @@ public:
        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_; }
 
@@ -380,7 +432,7 @@ public:
        //! \writeme
        void add_value_node(ValueNode::Handle x, const String &id);
 
-       //! \writeme
+       //! writeme
        //void rename_value_node(ValueNode::Handle x, const String &id);
 
        //! \writeme
@@ -419,11 +471,11 @@ public:
 
        //! 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
@@ -446,7 +498,7 @@ public:
        const_reverse_iterator rbegin()const;
 
        etl::handle<Layer> &back();
-       
+
        void push_back(etl::handle<Layer> x);
 
        void push_front(etl::handle<Layer> x);
@@ -455,7 +507,7 @@ public:
 
        void insert(iterator iter,etl::handle<Layer> x);
        void erase(iterator iter);
-       
+
        const etl::handle<Layer> &back()const;
 
        void set_inline(LooseHandle parent);
@@ -463,19 +515,21 @@ public:
        static Handle create();
 
        static Handle create_inline(Handle parent);
-       
+
        Handle clone(const GUID& deriv_guid=GUID())const;
 
 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 synfig