Added copyright lines for files I've edited this year.
[synfig.git] / synfig-core / trunk / src / synfig / color.h
index d3ae54d..d54b0e9 100644 (file)
@@ -6,6 +6,7 @@
 **
 **     \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
 
 /* === M A C R O S ========================================================= */
 
+#define use_colorspace_gamma() App::use_colorspace_gamma
+#define colorspace_gamma()             (2.2f)
+#define gamma_in(x)                            ((x>=0) ? pow((float)x,1.0f/colorspace_gamma()) : -pow((float)-x,1.0f/colorspace_gamma()))
+#define gamma_out(x)                   ((x>=0) ? pow((float)x,     colorspace_gamma()) : -pow((float)-x,     colorspace_gamma()))
+
 #ifdef WIN32
 #include <float.h>
 #ifndef isnan
@@ -107,10 +113,11 @@ public:
 
 private:
        value_type a_, r_, g_, b_;
-       static String hex_;
 
 public:
 
+       const String get_string(void)const;
+
        Color &
        operator+=(const Color &rhs)
        {
@@ -203,7 +210,11 @@ public:
        }
 
 public:
-       Color() /*:r_(0), g_(0), b_(0), a_(0)*/ { }
+       // ETL/trunk/ETL/_gaussian.h does:
+       //   SR1=SR2=SR3=typename T::value_type();
+       // and expects that to give it initialized colors
+       // Otherwise the 'gaussian' blur type is random.
+       Color() :a_(0), r_(0), g_(0), b_(0) { }
        Color(const value_type &f) :a_(f),r_(f), g_(f), b_(f) { }
        Color(int f) :a_(f),r_(f), g_(f), b_(f) { }
 
@@ -271,7 +282,7 @@ public:
        static const String real2hex(ColorReal c);
 
        //! Returns the color as a 6 character hex sting
-       const String& get_hex()const { return hex_ = real2hex(r_)+real2hex(g_)+real2hex(b_); }
+       const String get_hex()const { return String(real2hex(r_)+real2hex(g_)+real2hex(b_)); }
 
        //! Sets the color's R, G, and B from a 3 or 6 character hex string
        void set_hex(String& hex);
@@ -463,32 +474,31 @@ public:
        //! \writeme
        enum BlendMethod
        {
-               BLEND_COMPOSITE=0,      //!< Color A is composited onto B (Taking into about A's alpha)
-               BLEND_STRAIGHT=1,       //!< Straight linear interpolation from A->B (Alpha ignored)
-               BLEND_BRIGHTEN=2,       //!< If composite is brighter than B, use composite. B otherwise.
-               BLEND_DARKEN=3,         //!< If composite is brighter than B, use composite. B otherwise.
-               BLEND_ADD=4,            //!< Simple A+B.
-               BLEND_SUBTRACT=5,       //!< Simple A-B.
-               BLEND_MULTIPLY=6,       //!< Simple A*B.
-               BLEND_DIVIDE=7,         //!< Simple B/A
-               BLEND_COLOR=8,          //!< Preserves the U and V channels of color A
-               BLEND_HUE=9,            //!< Preserves the angle of the UV vector of color A
-               BLEND_SATURATION=10,//!< Preserves the magnitude of the UV Vector of color A
-               BLEND_LUMINANCE=11,     //!< Preserves the Y channel of color A
-               BLEND_BEHIND=12,        //!< Similar to BLEND_COMPOSITE, except that B is composited onto A.
-               BLEND_ONTO=13,          //!< Similar to BLEND_COMPOSITE, except that B's alpha is maintained
-               BLEND_SCREEN=16,                //!< \writeme
-               BLEND_OVERLAY=20,               //!< \writeme
-               BLEND_DIFFERENCE=18,            //!< \writeme
+               BLEND_COMPOSITE=0,                      //!< Color A is composited onto B (Taking A's alpha into account)
+               BLEND_STRAIGHT=1,                       //!< Straight linear interpolation from A->B (Alpha ignored)
+               BLEND_ONTO=13,                          //!< Similar to BLEND_COMPOSITE, except that B's alpha is maintained
+               BLEND_STRAIGHT_ONTO=21,         //!< \deprecated \writeme
+               BLEND_BEHIND=12,                        //!< Similar to BLEND_COMPOSITE, except that B is composited onto A.
+               BLEND_SCREEN=16,                        //!< \writeme
+               BLEND_OVERLAY=20,                       //!< \writeme
                BLEND_HARD_LIGHT=17,            //!< \writeme
-
-               //! Deprecated
-               BLEND_ALPHA_BRIGHTEN=14,        //!< If A is less opaque than B, use A
-               BLEND_ALPHA_DARKEN=15,          //!< If A is more opaque than B, use B
-               BLEND_ALPHA_OVER=19,//!< multiply alphas and then straight blends that using the amount
-               BLEND_STRAIGHT_ONTO=21,//!< \writeme
-
-               BLEND_END=22                    //!< \internal
+               BLEND_MULTIPLY=6,                       //!< Simple A*B.
+               BLEND_DIVIDE=7,                         //!< Simple B/A
+               BLEND_ADD=4,                            //!< Simple A+B.
+               BLEND_SUBTRACT=5,                       //!< Simple A-B.
+               BLEND_DIFFERENCE=18,            //!< Simple |A-B|.
+               BLEND_BRIGHTEN=2,                       //!< If composite is brighter than B, use composite. B otherwise.
+               BLEND_DARKEN=3,                         //!< If composite is darker than B, use composite. B otherwise.
+               BLEND_COLOR=8,                          //!< Preserves the U and V channels of color A
+               BLEND_HUE=9,                            //!< Preserves the angle of the UV vector of color A
+               BLEND_SATURATION=10,            //!< Preserves the magnitude of the UV Vector of color A
+               BLEND_LUMINANCE=11,                     //!< Preserves the Y channel of color A
+
+               BLEND_ALPHA_BRIGHTEN=14,        //!< \deprecated If A is less opaque than B, use A
+               BLEND_ALPHA_DARKEN=15,          //!< \deprecated If A is more opaque than B, use B
+               BLEND_ALPHA_OVER=19,            //!< \deprecated multiply alphas and then straight blends using the amount
+
+               BLEND_END=22                            //!< \internal
        };
 
        /* Other */
@@ -514,6 +524,15 @@ public:
                        || x==BLEND_HARD_LIGHT
                ;
        }
+
+       //! a blending method is considered 'straight' if transparent pixels in the upper layer can affect the result of the blend
+       static bool is_straight(BlendMethod x)
+       {
+               return x==BLEND_STRAIGHT
+                       || x==BLEND_STRAIGHT_ONTO
+                       || x==BLEND_ALPHA_BRIGHTEN
+               ;
+       }
 /*protected:
 
        value_type& operator[](const int i)
@@ -702,7 +721,7 @@ enum PixelFormat
 ** 3   Endian (BGR/RGB)
 ** 4   Alpha Location (Start/End)
 ** 5   ZDepth Location (Start/End)
-** 6   Alpha/ZDepth Arangement (ZA,AZ)
+** 6   Alpha/ZDepth Arrangement (ZA,AZ)
 ** 7   Alpha Range (Inverted,Normal)
 ** 8   Z Range (Inverted,Normal)
 */
@@ -713,11 +732,11 @@ enum PixelFormat
        PF_BGR=(1<<3),                  //!< If set, reverse the order of the RGB channels
        PF_A_START=(1<<4),              //!< If set, alpha channel is before the color data. If clear, it is after.
        PF_Z_START=(1<<5),              //!< If set, ZDepth channel is before the color data. If clear, it is after.
-       PF_ZA=(1<<6),                   //!< If set, the ZDepth channel will be infront of the alpha channel. If clear, they are reversed.
+       PF_ZA=(1<<6),                   //!< If set, the ZDepth channel will be in front of the alpha channel. If clear, they are reversed.
 
        PF_A_INV=(1<<7),                //!< If set, the alpha channel is stored as 1.0-a
        PF_Z_INV=(1<<8),                //!< If set, the ZDepth channel is stored as 1.0-z
-       PF_RAW_COLOR=(1<<9)+(1<<1)      //!< If set, the data represents a raw Color datastructure, and all other bits are ignored.
+       PF_RAW_COLOR=(1<<9)+(1<<1)      //!< If set, the data represents a raw Color data structure, and all other bits are ignored.
 };
 
 inline PixelFormat operator|(PixelFormat lhs, PixelFormat rhs)