Add my copyright to files I've modified.
[synfig.git] / synfig-core / trunk / src / synfig / color.cpp
index 48f7363..a7b5133 100644 (file)
@@ -6,6 +6,7 @@
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2007 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
@@ -32,6 +33,9 @@
 #include <ETL/angle>
 #include "color.h"
 #include <cstdio>
+#include <sstream>
+#include <iostream>
+#include <iomanip>
 
 #endif
 
@@ -51,6 +55,70 @@ using namespace std;
 
 
 
+ColorReal
+Color::hex2real(String s)
+{
+       std::istringstream i(s);
+       int n;
+       i.fill('0');
+       if (!(i >> hex >> n))
+               throw String("bad conversion from hex string \"") + s + String("\"");
+       return n / 255.0f;
+}
+
+const String
+Color::real2hex(ColorReal c)
+{
+       std::ostringstream o;
+       o.width(2);
+       o.fill('0');
+       if (c<0) c = 0;
+       if (c>1) c = 1;
+       o << hex << int(c*255.0f);
+       return o.str();
+}
+
+void
+Color::set_hex(String& hex)
+{
+       value_type r, g, b;
+       try
+       {
+               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));
+                       b = hex2real(hex.substr(2,1)+hex.substr(2,1));
+                       r_ = r; g_ = g; b_ = b;
+               }
+               else if (hex.size() == 6)
+               {
+                       r = hex2real(hex.substr(0,2));
+                       g = hex2real(hex.substr(2,2));
+                       b = hex2real(hex.substr(4,2));
+                       r_ = r; g_ = g; b_ = b;
+               }
+       }
+       catch (string s)
+       {
+               printf("caught <%s>\n", s.c_str());
+               return;
+       }
+}
+
+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
@@ -316,7 +384,7 @@ 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
+       // really negligible. There is a reason why we use COLOR_EPSILON--we
        // want the change to be imperceptable.
 
        b.set_r(((b.get_r()/(a.get_r()+COLOR_EPSILON))-b.get_r())*(amount)+b.get_r());