Fix 1795913. Subtract now works with colors.
[synfig.git] / synfig-core / trunk / src / synfig / color.h
index 3d501a2..447bd56 100644 (file)
 /* === H E A D E R S ======================================================= */
 
 
+#include <iostream>
+#include <iomanip>
+#include <sstream>
+#include <string>
+
 //#include <cmath>
 #include <math.h>
 #include <cassert>
@@ -107,10 +112,16 @@ public:
 
 private:
        value_type a_, r_, g_, b_;
-       mutable String hex_;
 
 public:
 
+       inline const String get_string(void)const
+       {
+               std::ostringstream o;
+               o << std::fixed << std::setprecision(3) << "#" << get_hex() << " : " << std::setw(6) << a_;
+               return String(o.str().c_str());
+       }
+
        Color &
        operator+=(const Color &rhs)
        {
@@ -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 */