mirror of
				https://github.com/LadybirdBrowser/ladybird.git
				synced 2025-10-31 13:20:59 +00:00 
			
		
		
		
	
		
			
	
	
		
			86 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
		
		
			
		
	
	
			86 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
|   | /*
 | ||
|  |  * Copyright (c) 2024, Andrew Kaster <andrew@ladybird.org> | ||
|  |  * | ||
|  |  * SPDX-License-Identifier: BSD-2-Clause | ||
|  |  */ | ||
|  | 
 | ||
|  | import AK | ||
|  | import LibGfx.Color | ||
|  | 
 | ||
|  | // FIXME: Do this without extending String with an index operation that was explicitly deleted :^) | ||
|  | extension Swift.String { | ||
|  |     subscript(_ index: Int) -> Character { | ||
|  |         return self[self.index(self.startIndex, offsetBy: index)] | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | private func hexNibbleToUInt8(_ nibble: Character) -> UInt8? { | ||
|  |     guard nibble.isHexDigit else { | ||
|  |         return nil | ||
|  |     } | ||
|  |     return UInt8(nibble.hexDigitValue!) | ||
|  | } | ||
|  | 
 | ||
|  | private func hexNibblesToUInt8(_ nib1: Character, _ nib2: Character) -> UInt8? { | ||
|  |     guard let n1 = hexNibbleToUInt8(nib1) else { | ||
|  |         return nil | ||
|  |     } | ||
|  |     guard let n2 = hexNibbleToUInt8(nib2) else { | ||
|  |         return nil | ||
|  |     } | ||
|  |     return n1 << 4 | n2 | ||
|  | } | ||
|  | 
 | ||
|  | // FIXME: Return Gfx.Color? When swift ABI bug is fixed | ||
|  | public func parseHexString(_ string: Swift.String) -> [Gfx.Color] { | ||
|  |     assert(string.hasPrefix("#")) | ||
|  | 
 | ||
|  |     switch string.count { | ||
|  |     case 4: | ||
|  |         let r = hexNibbleToUInt8(string[1]) | ||
|  |         let g = hexNibbleToUInt8(string[2]) | ||
|  |         let b = hexNibbleToUInt8(string[3]) | ||
|  | 
 | ||
|  |         guard r != nil && g != nil && b != nil else { | ||
|  |             return [] | ||
|  |         } | ||
|  | 
 | ||
|  |         return [Gfx.Color(r! * 17, g! * 17, b! * 17)] | ||
|  |     case 5: | ||
|  |         let r = hexNibbleToUInt8(string[1]) | ||
|  |         let g = hexNibbleToUInt8(string[2]) | ||
|  |         let b = hexNibbleToUInt8(string[3]) | ||
|  |         let a = hexNibbleToUInt8(string[4]) | ||
|  | 
 | ||
|  |         guard r != nil && g != nil && b != nil && a != nil else { | ||
|  |             return [] | ||
|  |         } | ||
|  | 
 | ||
|  |         return [Gfx.Color(r! * 17, g! * 17, b! * 17, a! * 17)] | ||
|  |     case 6: return [] | ||
|  |     case 7: | ||
|  |         let r = hexNibblesToUInt8(string[1], string[2]) | ||
|  |         let g = hexNibblesToUInt8(string[3], string[4]) | ||
|  |         let b = hexNibblesToUInt8(string[5], string[6]) | ||
|  | 
 | ||
|  |         guard r != nil && g != nil && b != nil else { | ||
|  |             return [] | ||
|  |         } | ||
|  | 
 | ||
|  |         return [Gfx.Color(r!, g!, b!, UInt8(255))] | ||
|  |     case 8: return [] | ||
|  |     case 9: | ||
|  |         let r = hexNibblesToUInt8(string[1], string[2]) | ||
|  |         let g = hexNibblesToUInt8(string[3], string[4]) | ||
|  |         let b = hexNibblesToUInt8(string[5], string[6]) | ||
|  |         let a = hexNibblesToUInt8(string[7], string[8]) | ||
|  | 
 | ||
|  |         guard r != nil && g != nil && b != nil && a != nil else { | ||
|  |             return [] | ||
|  |         } | ||
|  | 
 | ||
|  |         return [Gfx.Color(r!, g!, b!, a!)] | ||
|  |     default: return [] | ||
|  |     } | ||
|  | } |