mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Swift
		
	
| // Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
 | |
| 
 | |
| import UIKit
 | |
| import SessionUIKit
 | |
| import SessionUtilitiesKit
 | |
| 
 | |
| @objc(LKIdenticon)
 | |
| public final class Identicon: NSObject {
 | |
|     private static let placeholderCache: Atomic<NSCache<NSString, UIImage>> = {
 | |
|         let result = NSCache<NSString, UIImage>()
 | |
|         result.countLimit = 50
 | |
|         
 | |
|         return Atomic(result)
 | |
|     }()
 | |
|     
 | |
|     @objc public static func generatePlaceholderIcon(seed: String, text: String, size: CGFloat) -> UIImage {
 | |
|         let icon = PlaceholderIcon(seed: seed)
 | |
|         
 | |
|         var content: String = (text.hasSuffix("\(String(seed.suffix(4))))") ?
 | |
|             (text.split(separator: "(")
 | |
|                 .first
 | |
|                 .map { String($0) })
 | |
|                 .defaulting(to: text) :
 | |
|                 text
 | |
|         )
 | |
| 
 | |
|         if content.count > 2 && SessionId.Prefix(from: content) != nil {
 | |
|             content.removeFirst(2)
 | |
|         }
 | |
|         
 | |
|         let initials: String = content
 | |
|             .split(separator: " ")
 | |
|             .compactMap { word in word.first.map { String($0) } }
 | |
|             .joined()
 | |
|         let cacheKey: String = "\(content)-\(Int(floor(size)))"
 | |
|         
 | |
|         if let cachedIcon: UIImage = placeholderCache.wrappedValue.object(forKey: cacheKey as NSString) {
 | |
|             return cachedIcon
 | |
|         }
 | |
|         
 | |
|         let layer = icon.generateLayer(
 | |
|             with: size,
 | |
|             text: (initials.count >= 2 ?
 | |
|                 initials.substring(to: 2).uppercased() :
 | |
|                 content.substring(to: 2).uppercased()
 | |
|             )
 | |
|         )
 | |
|         
 | |
|         let rect = CGRect(origin: CGPoint.zero, size: layer.frame.size)
 | |
|         let renderer = UIGraphicsImageRenderer(size: rect.size)
 | |
|         let result = renderer.image { layer.render(in: $0.cgContext) }
 | |
|         
 | |
|         placeholderCache.mutate { $0.setObject(result, forKey: cacheKey as NSString) }
 | |
|         
 | |
|         return result
 | |
|     }
 | |
| }
 |