Created
August 8, 2017 16:05
-
-
Save algal/260c970ef5b42928094b309c3f53d560 to your computer and use it in GitHub Desktop.
Generate CGColors to match UIColors
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//: Known-Good: Version 9.0 beta 5 (9M202q) | |
//: Playground - noun: a place where people can play | |
import UIKit | |
//: This playground is for generating code to define CGColors to match UIColors | |
/** | |
Parse UIColor.description and generate Swift code for a CGColor | |
*/ | |
fileprivate func parseUIColorDescription( line:String) -> String | |
{ | |
let tokens = line.components(separatedBy: CharacterSet(charactersIn: " ")) | |
let colorspaceString = tokens.first! | |
let valueTokens = tokens.dropFirst() | |
switch colorspaceString { | |
case "UIExtendedSRGBColorSpace": | |
let rgba = valueTokens.map({ | |
(s) -> CGFloat in | |
CGFloat(Float(s)!) | |
}) | |
let code:String = "CGColor.fromRGB(rgba:\(rgba))\n" | |
return code | |
case "UIExtendedGrayColorSpace": | |
let grayA = valueTokens.map({ | |
(s) -> CGFloat in | |
CGFloat(Float(s)!) | |
}) | |
let code:String = "CGColor.fromDevice(graya:\(grayA))\n" | |
return code | |
default: | |
fatalError("unexpected") | |
} | |
return line | |
} | |
/// Generate code to define a CGColor based on a UIColor | |
fileprivate func generateCGColorDefinition(_ c:UIColor) -> String { | |
let s = c.description | |
return parseUIColorDescription(line: s) | |
} | |
/// Generate code defining static CGColor constants matching the UIColor constants | |
func generateCGColorExtensionDefinitionForUIColors() -> String | |
{ | |
let colorNames:[UIColor:String] = [.black: "black", | |
.blue: "blue", | |
.brown: "brown", | |
.clear: "clear", | |
.cyan: "cyan", | |
.darkGray: "darkGray", | |
.gray: "gray", | |
.green: "green", | |
.lightGray: "lightGray", | |
.magenta: "magenta", | |
.orange: "orange", | |
.purple: "purple", | |
.red: "red", | |
.white: "white", | |
.yellow: "yellow"] | |
var lines:[String] = [] | |
for (color,colorName) in colorNames { | |
let cgColorDefinition:String = generateCGColorDefinition(color) | |
let line = "static var \(colorName):CGColor {\n return \(cgColorDefinition) }" | |
lines.append(line) | |
} | |
return "extension CGColor {\n" + lines.joined(separator: "\n") + " \n } " | |
} | |
//let s = generateCGColorExtensionDefinitionForUIColors() | |
//print(s) | |
/// Extension needed to use generated CGColor definitions | |
extension CGColor | |
{ | |
static func fromRGB(rgba array:[CGFloat]) -> CGColor { | |
let colorSpace = CGColorSpaceCreateDeviceRGB() | |
return array.withUnsafeBufferPointer({ (ptr) -> CGColor in | |
let baseAddress = ptr.baseAddress! | |
let color = CGColor(colorSpace: colorSpace, components: baseAddress)! | |
return color | |
}) | |
} | |
static func fromDevice(graya array:[CGFloat]) -> CGColor { | |
let colorSpace = CGColorSpaceCreateDeviceGray() | |
return array.withUnsafeBufferPointer({ (ptr) -> CGColor in | |
let baseAddress = ptr.baseAddress! | |
let color = CGColor(colorSpace: colorSpace, components: baseAddress)! | |
return color | |
}) | |
} | |
} | |
// generated: | |
extension CGColor { | |
static var magenta:CGColor { | |
return CGColor.fromRGB(rgba:[1.0, 0.0, 1.0, 1.0]) | |
} | |
static var orange:CGColor { | |
return CGColor.fromRGB(rgba:[1.0, 0.5, 0.0, 1.0]) | |
} | |
static var red:CGColor { | |
return CGColor.fromRGB(rgba:[1.0, 0.0, 0.0, 1.0]) | |
} | |
static var yellow:CGColor { | |
return CGColor.fromRGB(rgba:[1.0, 1.0, 0.0, 1.0]) | |
} | |
static var lightGray:CGColor { | |
return CGColor.fromDevice(graya:[0.666666984558105, 1.0]) | |
} | |
static var black:CGColor { | |
return CGColor.fromDevice(graya:[0.0, 1.0]) | |
} | |
static var purple:CGColor { | |
return CGColor.fromRGB(rgba:[0.5, 0.0, 0.5, 1.0]) | |
} | |
static var green:CGColor { | |
return CGColor.fromRGB(rgba:[0.0, 1.0, 0.0, 1.0]) | |
} | |
static var clear:CGColor { | |
return CGColor.fromDevice(graya:[0.0, 0.0]) | |
} | |
static var cyan:CGColor { | |
return CGColor.fromRGB(rgba:[0.0, 1.0, 1.0, 1.0]) | |
} | |
static var darkGray:CGColor { | |
return CGColor.fromDevice(graya:[0.333332985639572, 1.0]) | |
} | |
static var brown:CGColor { | |
return CGColor.fromRGB(rgba:[0.600000023841858, 0.400000005960464, 0.200000002980232, 1.0]) | |
} | |
static var blue:CGColor { | |
return CGColor.fromRGB(rgba:[0.0, 0.0, 1.0, 1.0]) | |
} | |
static var white:CGColor { | |
return CGColor.fromDevice(graya:[1.0, 1.0]) | |
} | |
static var gray:CGColor { | |
return CGColor.fromDevice(graya:[0.5, 1.0]) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment