more fixes to SVAModifier constructor(s)
[ardour.git] / libs / canvas / colors.cc
index 19ab783b78187bb3074b19c03cd522a46fab33ce..b66828937e6fea85c7c869c344a7662b8ba55e69 100644 (file)
@@ -529,9 +529,9 @@ HSV::mod (SVAModifier const & svam)
 
 SVAModifier::SVAModifier (string const &str)
        : type (Add)
-       , s (-1.0)
-       , v (-1.0)
-       , a (-1.0)
+       , s (0)
+       , v (0)
+       , a (0)
 {
        from_string (str);
 }
@@ -548,12 +548,24 @@ SVAModifier::from_string (string const & str)
        switch (op) {
        case '*':
                type = Multiply;
+               /* no-op values for multiply */
+               s = 1.0;
+               v = 1.0;
+               a = 1.0;
                break;
        case '+':
                type = Add;
+               /* no-op values for add */
+               s = 0.0;
+               v = 0.0;
+               a = 1.0;
                break;
        case '=':
                type = Assign;
+               /* this will avoid assignment in operator() (see below) */
+               s = -1.0;
+               v = -1.0;
+               a = -1.0;
                break;
        default:
                throw failed_constructor ();
@@ -564,11 +576,11 @@ SVAModifier::from_string (string const & str)
        while (ss) {
                ss >> mod;
                if ((pos = mod.find ("alpha:")) != string::npos) {
-                       a = PBD::atoi (mod.substr (pos+6));
+                       a = PBD::atof (mod.substr (pos+6));
                } else if ((pos = mod.find ("saturate:")) != string::npos) {
-                       s = PBD::atoi (mod.substr (pos+9));
+                       s = PBD::atof (mod.substr (pos+9));
                } else if ((pos = mod.find ("darkness:")) != string::npos) {
-                       v = PBD::atoi (mod.substr (pos+9));
+                       v = PBD::atof (mod.substr (pos+9));
                } else {
                        throw failed_constructor ();
                }
@@ -625,9 +637,15 @@ SVAModifier::operator () (HSV& hsv)  const
                r.a *= a;
                break;
        case Assign:
-               r.s = s;
-               r.v = v;
-               r.a = a;
+               if (s > -1.0) {
+                       r.s = s;
+               }
+               if (v > -1.0) {
+                       r.v = v;
+               }
+               if (a > -1.0) {
+                       r.a = a;
+               }
                break;
        }