public static float getModifiedValue(float value, Shade shade) {

    if (shade.getValue() == 500) {
      return value;
    }

    float indexFloat = ((float) shade.getValue()) / 100.0f;

    int indexFloor = (int) Math.floor(indexFloat);
    int indexCeil = (int) Math.ceil(indexFloat);

    int max = mValuePercentConversion.length - 1;
    int lowerIndex = Math.min(Math.max(indexFloor, 0), max);
    int upperIndex = Math.min(Math.max(indexCeil, 0), max);

    float lowerPercent = mValuePercentConversion[lowerIndex];
    float valuePercent;
    if (lowerIndex != upperIndex) {
      float upperPercent = mValuePercentConversion[upperIndex];
      float deltaPercent = upperPercent - lowerPercent;
      float deltaIndex = upperIndex - lowerIndex;
      valuePercent = lowerPercent + (deltaPercent / deltaIndex) * (indexFloat - (float) lowerIndex);
    } else {
      valuePercent = lowerPercent;
    }

    if (shade.getValue() < 500) {
      return value + ((1.0f - value) * valuePercent);
    } else {
      return value + (value * valuePercent);
    }
  }
 public static float getModifiedHue(float hue, Shade shade) {
   float s = (float) shade.getValue();
   if (s > 500) {
     // Initial calculations are based on hue being in the range [0.0-1.0]
     // java has the range [0.0-360.0] so we'll do a little conversion
     hue = hue / 360.0f;
     float hueAt900 = (1.003f * hue) - 0.016f;
     hue = ((hueAt900 - hue) / ((float) 900 - (float) 500)) * (s - (float) 500) + hue;
     return hue * 360.0f;
   } else {
     return hue;
   }
 }
  public static float getModifiedSaturation(float saturation, Shade shade) {
    if (shade.getValue() == 500) {
      return saturation;
    }

    if (shade.getValue() < 500) {
      // get the saturation target @ 50:
      // clamp to 0.0
      float f = (0.136f * saturation) - 0.025f;
      float satAt50 = Math.max(f, 0.0f);
      // lerp shade 500->900
      return ((saturation - satAt50) / (500 - 50)) * (shade.getValue() - 50) + satAt50;
    } else {
      // get the saturation target @ 900:
      // quick inaccurate version:
      // 110% of the base saturation (clamped to 1.0)
      //            CGFloat satAt900 = MIN(baseSaturation * 1.10, 1.0);
      // expensive(?) accurate version
      float satAt900 =
          Math.min((-1.019f * saturation * saturation) + (2.283f * saturation) - 0.281f, 1.0f);
      // lerp shade 500->900
      return ((satAt900 - saturation) / (900 - 500)) * (shade.getValue() - 500) + saturation;
    }
  }