getTintOpacityModifier static method

double getTintOpacityModifier(
  1. Color color
)

Implementation

static double getTintOpacityModifier(Color color) {
  // Mid point of HsvV range that these calculations are based on. This is here for easy tuning.
  const double midPoint = 0.50;

  const double whiteMaxOpacity = 0.45; // 100% luminosity
  const double midPointMaxOpacity = 0.90; // 50% luminosity
  const double blackMaxOpacity = 0.85; // 0% luminosity

  HSVColor hsv = HSVColor.fromColor(color);

  double opacityModifier = midPointMaxOpacity;

  if (hsv.value != midPoint) {
    // Determine maximum suppression amount
    double lowestMaxOpacity = midPointMaxOpacity;
    double maxDeviation = midPoint;

    if (hsv.value > midPoint) {
      lowestMaxOpacity = whiteMaxOpacity; // At white (100% hsvV)
      maxDeviation = 1 - maxDeviation;
    } else if (hsv.value < midPoint) {
      lowestMaxOpacity = blackMaxOpacity; // At black (0% hsvV)
    }

    double maxOpacitySuppression = midPointMaxOpacity - lowestMaxOpacity;

    // Determine normalized deviation from the midpoint
    double deviation = (hsv.value - midPoint);
    double normalizedDeviation = deviation / maxDeviation;

    // If we have saturation, reduce opacity suppression to allow that color to come through more
    if (hsv.saturation > 0) {
      // Dampen opacity suppression based on how much saturation there is
      maxOpacitySuppression *= math.max(1 - (hsv.saturation * 2), 0.0);
    }

    double opacitySuppression = maxOpacitySuppression * normalizedDeviation;

    opacityModifier = midPointMaxOpacity - opacitySuppression;
  }

  return opacityModifier;
}