X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftags%2Fstable%2Fsrc%2Fsynfig%2Fcolor.cpp;h=1dcc314ebe049fe06add9eb84d6d7b953e96fc55;hb=47fce282611fbba1044921d22ca887f9b53ad91a;hp=d70ed3f752b1020d87ec7f726a48df31de959360;hpb=40dd10f62f1b0983b20cf99dd4780ea73236eb0c;p=synfig.git diff --git a/synfig-core/tags/stable/src/synfig/color.cpp b/synfig-core/tags/stable/src/synfig/color.cpp index d70ed3f..1dcc314 100644 --- a/synfig-core/tags/stable/src/synfig/color.cpp +++ b/synfig-core/tags/stable/src/synfig/color.cpp @@ -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 #include #include +#include #endif @@ -47,8 +49,6 @@ using namespace std; /* === 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 ======================================================= */ @@ -79,9 +79,16 @@ 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() == 1) @@ -111,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 @@ -376,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()); @@ -421,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); } @@ -429,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()) + if(a.get_a()*amount > b.get_a()) return a.set_a(a.get_a()*amount); return b; } @@ -554,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, };