**
** \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
#include <cstdio>
#include <sstream>
#include <iostream>
+#include <iomanip>
#endif
/* === G L O B A L S ======================================================= */
-String Color::hex_;
-
/* === P R O C E D U R E S ================================================= */
/* === M E T H O D S ======================================================= */
}
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() == 1)
}
}
+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
// 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 negligible. There is a reason why we use COLOR_EPSILON--we
- // want the change to be imperceptable.
+ // 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());
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);
}
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;
}
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;
}
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,
};