
// rainbow lookup
// maps 1-0 to roygbiv

#include "RainbowLookup.h"

using namespace std;

RainbowLookup::RainbowLookup(){
}

void RainbowLookup::printTestValues(){  
  
  float* value;
  
  cout << "RainbowLookup::init" << endl;  
  for ( float i = 0; i < 1; i+=.01){
    value = getValue(i);
    cout << i << value[0] << " " << value[1] << " " << value[2] << endl;
  }
  cout << "RainbowLookup::end rainbow Lookup" << endl;
  
}

float* RainbowLookup::getValue(float invalue){
  
  float r=0,g=0,b=0;
  
  int h = (int) ((1-invalue) * 360.0);
  int hi = (int) (h/60.0);
  float f = (float) h/60.0 - hi;
  
  float v = 1;
  float s = 1;
  
  float p = v * (1-s);
  float q = v * (1-(s*f));
  float t = v * (1-(s*(1-f)));

  if (hi == 1) {
    r = v;
    g = t;
    b = p;
  } else if (hi == 2) {
    r = q;
    g = v;
    b = p;
  } else if (hi == 3) {
    r = p;
    g = v;
    b = t;
  } else if (hi == 4) {
    r = p;
    g = q;
    b = v;
  } else if (hi == 5) {
    r = t;
    g = p;
    b = v;
  } else if (hi == 6) {
    r = v;
    g = p;
    b = q;
  } else if (hi == 0){
    r = 1;
    g = 0;
    b = 1;
  }
  
  value[0] = r;
  value[1] = g;
  value[2] = b;
  
  if (invalue< .15){ // darken the low end
    value[0] *= invalue/0.15;
    value[1] *= invalue/0.15;
    value[2] *= invalue/0.15;

  } 


  return value;
  
}
    

