Added copyright lines for files I've edited this year.
[synfig.git] / synfig-core / trunk / src / synfig / color.cpp
index 9ef2c03..1dcc314 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
@@ -34,6 +35,7 @@
 #include <cstdio>
 #include <sstream>
 #include <iostream>
+#include <iomanip>
 
 #endif
 
@@ -53,7 +55,7 @@ using namespace std;
 
 
 
-static ColorReal
+ColorReal
 Color::hex2real(String s)
 {
        std::istringstream i(s);
@@ -64,7 +66,7 @@ Color::hex2real(String s)
        return n / 255.0f;
 }
 
-static const String
+const String
 Color::real2hex(ColorReal c)
 {
        std::ostringstream o;
@@ -77,12 +79,24 @@ Color::real2hex(ColorReal c)
 }
 
 void
-Color::set_hex(String& hex)
+Color::set_hex(String& str)
 {
        value_type r, g, b;
+       String hex;
+
+       // use just the hex characters
+       for (String::const_iterator iter = str.begin(); iter != str.end(); iter++)
+               if (isxdigit(*iter))
+                       hex.push_back(*iter);
+
        try
        {
-               if (hex.size() == 3)
+               if (hex.size() == 1)
+               {
+                       r = hex2real(hex.substr(0,1)+hex.substr(0,1));
+                       r_ = g_ = b_ = r;
+               }
+               else if (hex.size() == 3)
                {
                        r = hex2real(hex.substr(0,1)+hex.substr(0,1));
                        g = hex2real(hex.substr(1,1)+hex.substr(1,1));
@@ -104,6 +118,14 @@ Color::set_hex(String& hex)
        }
 }
 
+const String
+Color::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());
+}
+
 #if 0
 Color&
 Color::rotate_uv(const Angle& theta)const
@@ -369,8 +391,8 @@ blendfunc_DIVIDE(Color &a,Color &b,float amount)
 
        // We add COLOR_EPSILON in order to avoid a divide-by-zero condition.
        // This causes DIVIDE to bias toward positive values, but the effect is
-       // really neglegable. There is a reason why we use COLOR_EPSILON--we
-       // want the change to be imperceptable.
+       // really negligible. There is a reason why we use COLOR_EPSILON--we
+       // want the change to be imperceptible.
 
        b.set_r(((b.get_r()/(a.get_r()+COLOR_EPSILON))-b.get_r())*(amount)+b.get_r());
        b.set_g(((b.get_g()/(a.get_g()+COLOR_EPSILON))-b.get_g())*(amount)+b.get_g());
@@ -414,7 +436,7 @@ blendfunc_LUMINANCE(Color &a,Color &b,float amount)
 static Color
 blendfunc_BEHIND(Color &a,Color &b,float amount)
 {
-       if(a.get_a()==0)a.set_a(COLOR_EPSILON);         //!< \hack
+       if(a.get_a()==0)a.set_a(COLOR_EPSILON);         //!< \todo this is a hack
        a.set_a(a.get_a()*amount);
        return blendfunc_COMPOSITE(b,a,1.0);
 }
@@ -422,7 +444,9 @@ blendfunc_BEHIND(Color &a,Color &b,float amount)
 static Color
 blendfunc_ALPHA_BRIGHTEN(Color &a,Color &b,float amount)
 {
-       if(a.get_a()<b.get_a()*amount)
+       // \todo can this be right, multiplying amount by *b*'s alpha?
+       // compare with blendfunc_BRIGHTEN where it is multiplied by *a*'s
+       if(a.get_a() < b.get_a()*amount)
                return a.set_a(a.get_a()*amount);
        return b;
 }
@@ -430,7 +454,7 @@ blendfunc_ALPHA_BRIGHTEN(Color &a,Color &b,float amount)
 static Color
 blendfunc_ALPHA_DARKEN(Color &a,Color &b,float amount)
 {
-       if(a.get_a()*amount>b.get_a())
+       if(a.get_a()*amount > b.get_a())
                return a.set_a(a.get_a()*amount);
        return b;
 }
@@ -547,27 +571,27 @@ Color::blend(Color a, Color b,float amount, Color::BlendMethod type)
 
        const static blendfunc vtable[BLEND_END]=
        {
-               blendfunc_COMPOSITE,
+               blendfunc_COMPOSITE,    // 0
                blendfunc_STRAIGHT,
                blendfunc_BRIGHTEN,
                blendfunc_DARKEN,
                blendfunc_ADD,
-               blendfunc_SUBTRACT,
+               blendfunc_SUBTRACT,             // 5
                blendfunc_MULTIPLY,
                blendfunc_DIVIDE,
                blendfunc_COLOR,
                blendfunc_HUE,
-               blendfunc_SATURATION,
+               blendfunc_SATURATION,   // 10
                blendfunc_LUMINANCE,
                blendfunc_BEHIND,
                blendfunc_ONTO,
                blendfunc_ALPHA_BRIGHTEN,
-               blendfunc_ALPHA_DARKEN,
+               blendfunc_ALPHA_DARKEN, // 15
                blendfunc_SCREEN,
                blendfunc_HARD_LIGHT,
                blendfunc_DIFFERENCE,
                blendfunc_ALPHA_OVER,
-               blendfunc_OVERLAY,
+               blendfunc_OVERLAY,              // 20
                blendfunc_STRAIGHT_ONTO,
        };