= 0.0) ? $hue : (1.0 + $hue); } /** * Convert red/green/blue to HLSMAX-based hue/luminance/saturation. * * @return int[] */ private static function rgbToMsHls(int $red, int $green, int $blue): array { $red01 = $red / self::RGBMAX; $green01 = $green / self::RGBMAX; $blue01 = $blue / self::RGBMAX; [$hue, $luminance, $saturation] = self::rgbToHls($red01, $green01, $blue01); return [ (int) round($hue * self::HLSMAX), (int) round($luminance * self::HLSMAX), (int) round($saturation * self::HLSMAX), ]; } /** * Converts HLSMAX based HLS values to rgb values in the range (0,1). * * @return float[] */ private static function msHlsToRgb(int $hue, int $lightness, int $saturation): array { return self::hlsToRgb($hue / self::HLSMAX, $lightness / self::HLSMAX, $saturation / self::HLSMAX); } /** * Tints HLSMAX based luminance. * * @see http://ciintelligence.blogspot.co.uk/2012/02/converting-excel-theme-color-and-tint.html */ private static function tintLuminance(float $tint, float $luminance): int { if ($tint < 0) { return (int) round($luminance * (1.0 + $tint)); } return (int) round($luminance * (1.0 - $tint) + (self::HLSMAX - self::HLSMAX * (1.0 - $tint))); } /** * Return result of tinting supplied rgb as 6 hex digits. */ public static function rgbAndTintToRgb(int $red, int $green, int $blue, float $tint): string { [$hue, $luminance, $saturation] = self::rgbToMsHls($red, $green, $blue); [$red, $green, $blue] = self::msHlsToRgb($hue, self::tintLuminance($tint, $luminance), $saturation); return sprintf( '%02X%02X%02X', (int) round($red * self::RGBMAX), (int) round($green * self::RGBMAX), (int) round($blue * self::RGBMAX) ); } }