/*! \file layer.h
** \brief Layer Class Header
**
-** $Id: layer.h,v 1.2 2005/01/24 03:08:18 darco Exp $
+** $Id$
**
** \legal
-** Copyright (c) 2002 Robert B. Quattlebaum Jr.
+** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+** Copyright (c) 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
*/
/* ========================================================================= */
/* === M A C R O S ========================================================= */
//! \writeme
-#define SYNFIG_LAYER_MODULE_EXT public: static const char name__[], version__[], cvs_id__[], local_name__[], category__[]; static Layer *create();
+#define SYNFIG_LAYER_MODULE_EXT \
+ public: \
+ static const char name__[], version__[], cvs_id__[], local_name__[], category__[]; \
+ static Layer *create();
//! Sets the name of the layer
-#define SYNFIG_LAYER_SET_NAME(class,x) const char class::name__[]=x
+#define SYNFIG_LAYER_SET_NAME(class,x) \
+ const char class::name__[]=x
//! Sets the local name of the layer
-#define SYNFIG_LAYER_SET_LOCAL_NAME(class,x) const char class::local_name__[]=x;
+#define SYNFIG_LAYER_SET_LOCAL_NAME(class,x) \
+ const char class::local_name__[]=x;
-//! Sets the categpru of the layer
-#define SYNFIG_LAYER_SET_CATEGORY(class,x) const char class::category__[]=x
+//! Sets the category of the layer
+#define SYNFIG_LAYER_SET_CATEGORY(class,x) \
+ const char class::category__[]=x
//! Sets the version string for the layer
-#define SYNFIG_LAYER_SET_VERSION(class,x) const char class::version__[]=x
+#define SYNFIG_LAYER_SET_VERSION(class,x) \
+ const char class::version__[]=x
//! Sets the CVS ID string for the layer
-#define SYNFIG_LAYER_SET_CVS_ID(class,x) const char class::cvs_id__[]=x
+#define SYNFIG_LAYER_SET_CVS_ID(class,x) \
+ const char class::cvs_id__[]=x
//! \writeme
-#define SYNFIG_LAYER_INIT(class) synfig::Layer* class::create() { return new class(); }
+#define SYNFIG_LAYER_INIT(class) \
+ synfig::Layer* class::create() \
+ { \
+ return new class(); \
+ }
//! \writeme
-#define IMPORT_PLUS(x,y) if(param==#x && value.same_as(x)) { value.put(&x);{y;}return true;}
+#define IMPORT_PLUS(x,y) \
+ if (param==#x && value.same_type_as(x)) \
+ { \
+ value.put(&x); \
+ { \
+ y; \
+ } \
+ return true; \
+ }
//! \writeme
-#define IMPORT_AS(x,y) if(param==y && value.same_as(x)) { value.put(&x); return true;}
+#define IMPORT_AS(x,y) \
+ if (param==y && value.same_type_as(x)) \
+ { \
+ value.put(&x); \
+ return true; \
+ }
//! \writeme
-#define IMPORT(x) IMPORT_AS(x,#x)
+#define IMPORT(x) \
+ IMPORT_AS(x,#x)
//! \writeme
-#define EXPORT_AS(x,y) if(param==y) { return ValueBase(x); }
+#define EXPORT_AS(x,y) \
+ if (param==y) \
+ return ValueBase(x);
//! \writeme
-#define EXPORT(x) EXPORT_AS(x,#x)
+#define EXPORT(x) \
+ EXPORT_AS(x,#x)
//! \writeme
-#define EXPORT_NAME() if(param=="Name" || param=="name" || param=="name__") { return name__; } if(param=="local_name__") { return local_name__; }
+#define EXPORT_NAME() \
+ if (param=="Name" || param=="name" || param=="name__") \
+ return name__; \
+ else if (param=="local_name__") \
+ return dgettext("synfig",local_name__);
//! \writeme
-#define EXPORT_VERSION() if(param=="Version" || param=="version" || param=="version__") { return version__; }
+#define EXPORT_VERSION() \
+ if (param=="Version" || param=="version" || param=="version__") \
+ return version__;
+
+//! This is used as the category for layer book entries which represent aliases of layers.
+//! It prevents these layers showing up in the menu.
+#define CATEGORY_DO_NOT_USE "Do Not Use"
/* === T Y P E D E F S ===================================================== */
{
friend class ValueNode;
friend class Context;
-
+
/*
-- ** -- T Y P E S -----------------------------------------------------------
*/
String cvs_id;
String version;
BookEntry() { }
- BookEntry(Factory factory, const String& name,const String& local_name,const String& category,const String& cvs_id,const String& version):
- factory(factory),name(name),local_name(local_name),category(category),cvs_id(cvs_id),version(version) { }
+ BookEntry(Factory factory,
+ const String &name,
+ const String &local_name,
+ const String &category,
+ const String &cvs_id,
+ const String &version):
+ factory(factory),
+ name(name),
+ local_name(local_name),
+ category(category),
+ cvs_id(cvs_id),
+ version(version) { }
};
typedef std::map<String,BookEntry> Book;
static void register_in_book(const BookEntry &);
static Book& book();
-
+
static bool subsys_init();
static bool subsys_stop();
private:
- /*! \c true if the layer is visible, \c is it is to be skipped
+ /*! \c true if the layer is visible, \c false if it is to be skipped
** \see set_active(), enable(), disable, active()
*/
bool active_;
//! \writeme
float z_depth_;
-
+
//! \writeme
mutable Time dirty_time_;
-
+
//! Contains the name of the group that this layer belongs to
String group_;
-
+
//! \writeme
sigc::connection parent_death_connect_;
-
+
/*
-- ** -- S I G N A L S -------------------------------------------------------
*/
private:
//! Status Changed
- sigc::signal<void> signal_status_changed_;
-
+ sigc::signal<void> signal_status_changed_;
+
//! Parameter changed
- sigc::signal<void,String> signal_param_changed_;
+ sigc::signal<void,String> signal_param_changed_;
//! Description Changed
- sigc::signal<void> signal_description_changed_;
+ sigc::signal<void> signal_description_changed_;
//! Moved
- sigc::signal<void, int, etl::handle<Canvas> > signal_moved_;
+ sigc::signal<void, int, etl::handle<Canvas> > signal_moved_;
- sigc::signal<void, String> signal_added_to_group_;
+ sigc::signal<void, String> signal_added_to_group_;
- sigc::signal<void, String> signal_removed_from_group_;
+ sigc::signal<void, String> signal_removed_from_group_;
/*
-- ** -- S I G N A L I N T E R F A C E -------------------------------------
public:
//! Status Changed
- sigc::signal<void>& signal_status_changed() { return signal_status_changed_; }
-
+ sigc::signal<void>& signal_status_changed() { return signal_status_changed_; }
+
//! Parameter changed
sigc::signal<void,String>& signal_param_changed() { return signal_param_changed_; }
//! Description Changed
- sigc::signal<void>& signal_description_changed() { return signal_description_changed_;}
+ sigc::signal<void>& signal_description_changed() { return signal_description_changed_;}
//! Moved
sigc::signal<void, int, etl::handle<Canvas> >& signal_moved() { return signal_moved_; }
- sigc::signal<void, String>& signal_added_to_group() { return signal_added_to_group_; }
+ sigc::signal<void, String>& signal_added_to_group() { return signal_added_to_group_; }
- sigc::signal<void, String>& signal_removed_from_group() { return signal_removed_from_group_; }
+ sigc::signal<void, String>& signal_removed_from_group() { return signal_removed_from_group_; }
/*
-- ** -- C O N S T R U C T O R S ---------------------------------------------
//! Adds this layer to the given layer group
void add_to_group(const String&);
-
+
//! Removes this layer from the given layer group
void remove_from_group(const String&);
-
+
//! Removes this layer from all layer groups
void remove_from_all_groups();
-
+
//! Gets the name of the group that this layer belongs to
String get_group()const;
- //! \todo writeme
+ //! writeme
//DynamicParamList &dynamic_param_list() { return dynamic_param_list_; }
//! \todo writeme
bool connect_dynamic_param(const String& param, etl::loose_handle<ValueNode>);
bool disconnect_dynamic_param(const String& param);
-
+
//! Enables the layer for rendering (Making it \em active)
void enable() { set_active(true); }
//! \writeme
void set_z_depth(float x) { z_depth_=x; }
-
+
//! Sets the Canvas that this Layer is a part of
void set_canvas(etl::loose_handle<Canvas> canvas);
-
+
//! Returns a handle to the Canvas to which this Layer belongs
etl::loose_handle<Canvas> get_canvas()const;
-
+
//! \writeme
const String& get_description()const { return description_; }
//! \writeme
void set_description(const String& x);
-
+
+ //! Returns the layer's description if it's not empty, else its local name
+ const String get_non_empty_description()const { return get_description().empty() ? get_local_name() : get_description(); }
+
+ //! Returns the localised version of the given layer parameter
+ const String get_param_local_name(const String ¶m_name)const;
+
/*
-- ** -- V I R T U A L F U N C T I O N S -----------------------------------
*/
virtual Rect get_full_bounding_rect(Context context)const;
//! Returns a string containing the name of the Layer
- virtual String get_name()const;
+ virtual String get_name()const;
//! Returns a string containing the localized name of the Layer
virtual String get_local_name()const;
- //! Gets the paramater vocabulary
+ //! Gets the parameter vocabulary
virtual Vocab get_param_vocab()const;
//! Gets the version string for this layer
virtual ParamList get_param_list()const;
//! Sets the \a time for the selected Layer and those under it
- /*! \param context Context iterator refering to next Layer.
+ /*! \param context Context iterator referring to next Layer.
** \param time writeme
** \see Handle::set_time()
*/
virtual void set_time(Context context, Time time)const;
//! Sets the \a time for the selected Layer and those under it for a specific \a point
- /*! \param context Context iterator refering to next Layer.
+ /*! \param context Context iterator referring to next Layer.
** \param time writeme
** \param point writeme
** \see Handle::set_time()
** \todo \a point should be of the type <tt>const Point \&</tt> */
virtual void set_time(Context context, Time time, const Point &point)const;
- //! Gets the color of the Canvas at \a point
- /*! \param context Context iterator refering to next Layer.
- ** \param point Point which indicates where the desired Color should come from
- ** \todo \a point should be of the type <tt>const Point \&</tt>
+ //! Gets the color of the Canvas at \a pos
+ /*! \param context Context iterator referring to next Layer.
+ ** \param pos Point which indicates where the Color should come from
** \see Handle::get_color()
*/
- virtual Color get_color(Context context, const Point &point)const;
+ virtual Color get_color(Context context, const Point &pos)const;
//! Renders the Canvas to the given Surface in an accelerated manner
- /*! \param context Context iterator refering to next Layer.
+ /*! \param context Context iterator referring to next Layer.
** \param surface Pointer to Surface to render to.
** \param quality The requested quality-level to render at.
- ** \param rend_desc The associated RendDesc.
- ** \param callback Pointer to callback object. May be NULL if there is no callback.
+ ** \param renddesc The associated RendDesc.
+ ** \param cb Pointer to callback object. May be NULL if there is no callback.
** \return \c true on success, \c false on failure
** \see Handle::accelerated_render()
*/
- virtual bool accelerated_render(Context context,Surface *surface,int quality, const RendDesc &rend_desc, ProgressCallback *callback)const;
+ virtual bool accelerated_render(Context context,Surface *surface,int quality, const RendDesc &renddesc, ProgressCallback *cb)const;
//! Checks to see if a part of the layer is directly under \a point
- /*! \param context Context iterator refering to next Layer.
+ /*! \param context Context iterator referring to next Layer.
** \param point The point to check
** \return The handle of the layer under \a point. If there is not
** a layer under \a point, then returns an empty handle. */
//! Duplicates the Layer
virtual Handle clone(const GUID& deriv_guid=GUID())const;
+ //! Returns true if the layer needs to be able to examine its context.
+ /*! context to render itself, other than for simple blending. For
+ ** example, the blur layer will return true - it can't do its job
+ ** if it can't see its context, and the circle layer will return
+ ** false - rendering a circle doesn't depend on the underlying
+ ** context until the final blend operation. */
+ virtual bool reads_context()const;
+
//! Duplicates the Layer without duplicating the value nodes
- virtual Layer *simple_clone()const;
+ virtual Handle simple_clone()const;
protected: