Advertisement
Guest User

Untitled

a guest
Aug 19th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.84 KB | None | 0 0
  1. //
  2. // Created by Vlad Zamskoi on 8/19/17.
  3. // Copyright (c) 2017 MobileAppSoft. All rights reserved.
  4. //
  5.  
  6. class HexColorToRGBConverter {
  7. static func convert(_ hex: String) -> (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat)? {
  8. guard isValidColorHexString(hex) else { return nil }
  9. let hexWithoutPrefix = hex.replacingOccurrences(of: "#", with: "")
  10. return convertValidHexColorToRGB(hexWithoutPrefix)
  11. }
  12.  
  13. private static func convertValidHexColorToRGB(_ hexColor: String) -> (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat)? {
  14. var rgb: UInt32 = 0
  15. guard Scanner(string: hexColor).scanHexInt32(&rgb) else { return nil }
  16.  
  17. var bitsPerColorComponent, redComponentOffset, shortToLongFormMultiplier: UInt32
  18. var alphaSpecified: Bool
  19. switch hexColor.characters.count {
  20. case 8:
  21. bitsPerColorComponent = 8
  22. redComponentOffset = 3
  23. shortToLongFormMultiplier = 1
  24. alphaSpecified = true
  25. case 6:
  26. bitsPerColorComponent = 8
  27. redComponentOffset = 2
  28. shortToLongFormMultiplier = 1
  29. alphaSpecified = false
  30. case 4:
  31. bitsPerColorComponent = 4
  32. redComponentOffset = 3
  33. shortToLongFormMultiplier = 0x11
  34. alphaSpecified = true
  35. case 3:
  36. bitsPerColorComponent = 4
  37. redComponentOffset = 2
  38. shortToLongFormMultiplier = 0x11
  39. alphaSpecified = false
  40. default:
  41. return nil
  42. }
  43.  
  44. let mask = 0xFF / shortToLongFormMultiplier
  45. let normalizer = CGFloat(255.0)
  46. let redOffsetInBits = UInt32(redComponentOffset * bitsPerColorComponent)
  47. let greenOffsetInBits = UInt32((redComponentOffset - 1) * bitsPerColorComponent)
  48. let blueOffsetInBits = UInt32((redComponentOffset - 2) * bitsPerColorComponent)
  49. let r = CGFloat(((rgb & (mask << redOffsetInBits)) >> redOffsetInBits)
  50. * shortToLongFormMultiplier) / normalizer
  51. let g = CGFloat(((rgb & (mask << greenOffsetInBits)) >> greenOffsetInBits)
  52. * shortToLongFormMultiplier) / normalizer
  53. let b = CGFloat(((rgb & (mask << blueOffsetInBits)) >> blueOffsetInBits)
  54. * shortToLongFormMultiplier) / normalizer
  55. let a = alphaSpecified ? CGFloat((rgb & mask) * shortToLongFormMultiplier) / normalizer
  56. : 1.0
  57. return (r, g, b, a)
  58. }
  59.  
  60. private static func isValidColorHexString(_ hexStr: String) -> Bool {
  61. let uppercasedHex = hexStr.uppercased()
  62. let hexDigitRegex = "[0-9A-F]"
  63. let hexColorRegex: String = "#?(\(hexDigitRegex){3,4}"
  64. + "|\(hexDigitRegex){6}"
  65. + "|\(hexDigitRegex){8})"
  66. let test = NSPredicate(format: "SELF MATCHES %@", hexColorRegex)
  67. return test.evaluate(with: uppercasedHex)
  68. }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement