Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Created by Vlad Zamskoi on 8/19/17.
- // Copyright (c) 2017 MobileAppSoft. All rights reserved.
- //
- class HexColorToRGBConverter {
- static func convert(_ hex: String) -> (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat)? {
- guard isValidColorHexString(hex) else { return nil }
- let hexWithoutPrefix = hex.replacingOccurrences(of: "#", with: "")
- return convertValidHexColorToRGB(hexWithoutPrefix)
- }
- private static func convertValidHexColorToRGB(_ hexColor: String) -> (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat)? {
- var rgb: UInt32 = 0
- guard Scanner(string: hexColor).scanHexInt32(&rgb) else { return nil }
- var bitsPerColorComponent, redComponentOffset, shortToLongFormMultiplier: UInt32
- var alphaSpecified: Bool
- switch hexColor.characters.count {
- case 8:
- bitsPerColorComponent = 8
- redComponentOffset = 3
- shortToLongFormMultiplier = 1
- alphaSpecified = true
- case 6:
- bitsPerColorComponent = 8
- redComponentOffset = 2
- shortToLongFormMultiplier = 1
- alphaSpecified = false
- case 4:
- bitsPerColorComponent = 4
- redComponentOffset = 3
- shortToLongFormMultiplier = 0x11
- alphaSpecified = true
- case 3:
- bitsPerColorComponent = 4
- redComponentOffset = 2
- shortToLongFormMultiplier = 0x11
- alphaSpecified = false
- default:
- return nil
- }
- let mask = 0xFF / shortToLongFormMultiplier
- let normalizer = CGFloat(255.0)
- let redOffsetInBits = UInt32(redComponentOffset * bitsPerColorComponent)
- let greenOffsetInBits = UInt32((redComponentOffset - 1) * bitsPerColorComponent)
- let blueOffsetInBits = UInt32((redComponentOffset - 2) * bitsPerColorComponent)
- let r = CGFloat(((rgb & (mask << redOffsetInBits)) >> redOffsetInBits)
- * shortToLongFormMultiplier) / normalizer
- let g = CGFloat(((rgb & (mask << greenOffsetInBits)) >> greenOffsetInBits)
- * shortToLongFormMultiplier) / normalizer
- let b = CGFloat(((rgb & (mask << blueOffsetInBits)) >> blueOffsetInBits)
- * shortToLongFormMultiplier) / normalizer
- let a = alphaSpecified ? CGFloat((rgb & mask) * shortToLongFormMultiplier) / normalizer
- : 1.0
- return (r, g, b, a)
- }
- private static func isValidColorHexString(_ hexStr: String) -> Bool {
- let uppercasedHex = hexStr.uppercased()
- let hexDigitRegex = "[0-9A-F]"
- let hexColorRegex: String = "#?(\(hexDigitRegex){3,4}"
- + "|\(hexDigitRegex){6}"
- + "|\(hexDigitRegex){8})"
- let test = NSPredicate(format: "SELF MATCHES %@", hexColorRegex)
- return test.evaluate(with: uppercasedHex)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement