Skip to content

Instantly share code, notes, and snippets.

@algal
Created August 8, 2017 16:05
Show Gist options
  • Save algal/260c970ef5b42928094b309c3f53d560 to your computer and use it in GitHub Desktop.
Save algal/260c970ef5b42928094b309c3f53d560 to your computer and use it in GitHub Desktop.
Generate CGColors to match UIColors
//: 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