// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. import UIKit.UIColor public extension UIColor { struct HSBA { public var hue: CGFloat = 0 public var saturation: CGFloat = 0 public var brightness: CGFloat = 0 public var alpha: CGFloat = 0 public init?(color: UIColor) { // Note: Looks like as of iOS 10 devices use the kCGColorSpaceExtendedGray color // space for grayscale colors which seems to be compatible with the RGB color space // meaning we don'e need to check 'getWhite:alpha:' if the below method fails, for // more info see: https://developer.apple.com/documentation/uikit/uicolor#overview guard color.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) else { return nil } } } var hsba: HSBA? { return HSBA(color: self) } // MARK: - Functions func toImage(isDarkMode: Bool) -> UIImage { let bounds: CGRect = CGRect(x: 0, y: 0, width: 1, height: 1) let renderer: UIGraphicsImageRenderer = UIGraphicsImageRenderer(bounds: bounds) return renderer.image { rendererContext in rendererContext.cgContext .setFillColor( self.resolvedColor( // Note: This is needed for '.cgColor' to support dark mode with: UITraitCollection(userInterfaceStyle: isDarkMode ? .dark : .light) ).cgColor ) rendererContext.cgContext.fill(bounds) } } func darken(by percentage: CGFloat) -> UIColor { guard percentage != 0 else { return self } guard let hsba: HSBA = self.hsba else { return self } return UIColor(hue: hsba.hue, saturation: hsba.saturation, brightness: (hsba.brightness - percentage), alpha: hsba.alpha) } }