Skip to content

Commit

Permalink
Improve Color
Browse files Browse the repository at this point in the history
tomasf committed Jul 28, 2024
1 parent 3f32457 commit 9dba783
Showing 4 changed files with 188 additions and 178 deletions.
38 changes: 6 additions & 32 deletions Sources/SwiftSCAD/Development/ApplyColor.swift
Original file line number Diff line number Diff line change
@@ -1,21 +1,5 @@
import Foundation

internal extension Color {
var invocation: Invocation {
let params: [String: any SCADValue]

switch self {
case .components (let red, let green, let blue, let alpha):
params = ["c": [red, green, blue, alpha]]

case .named (let name, let alpha):
params = ["c": name.rawValue, "alpha": alpha]
}

return Invocation(name: "color", parameters: params)
}
}

struct ApplyColor2D: WrappedGeometry2D {
let color: Color
let body: any Geometry2D
@@ -33,13 +17,8 @@ extension Geometry2D {
ApplyColor2D(color: color, body: self)
}

/// Apply a color to the geometry
/// - Parameters:
/// - name: One of the standard colors. See [the OpenSCAD docs](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Transformations#color) for more info.
/// - alpha: The alpha value of the color, in the range 0.0 to 1.0.
/// - Returns: A colored geometry
public func colored(_ name: Color.Name, alpha: Double = 1) -> any Geometry2D {
ApplyColor2D(color: .named(name, alpha: alpha), body: self)
public func colored(_ color: Color, alpha: Double) -> any Geometry2D {
ApplyColor2D(color: color.withAlphaComponent(alpha), body: self)
}

/// Apply a color to the geometry
@@ -50,7 +29,7 @@ extension Geometry2D {
/// - alpha: The alpha component, in the range 0.0 to 1.0.
/// - Returns: A colored geometry
public func colored(red: Double, green: Double, blue: Double, alpha: Double = 1) -> any Geometry2D {
ApplyColor2D(color: .components(red: red, green: green, blue: blue, alpha: alpha), body: self)
ApplyColor2D(color: .init(red: red, green: green, blue: blue, alpha: alpha), body: self)
}
}

@@ -59,13 +38,8 @@ extension Geometry3D {
ApplyColor3D(color: color, body: self)
}

/// Apply a color to the geometry
/// - Parameters:
/// - name: One of the standard colors. See [the OpenSCAD docs](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Transformations#color) for more info.
/// - alpha: The alpha value of the color, in the range 0.0 to 1.0.
/// - Returns: A colored geometry
public func colored(_ name: Color.Name, alpha: Double = 1) -> any Geometry3D {
ApplyColor3D(color: .named(name, alpha: alpha), body: self)
public func colored(_ color: Color, alpha: Double) -> any Geometry3D {
ApplyColor3D(color: color.withAlphaComponent(alpha), body: self)
}

/// Apply a color to the geometry
@@ -76,6 +50,6 @@ extension Geometry3D {
/// - alpha: The alpha component, in the range 0.0 to 1.0.
/// - Returns: A colored geometry
public func colored(red: Double, green: Double, blue: Double, alpha: Double = 1) -> any Geometry3D {
ApplyColor3D(color: .components(red: red, green: green, blue: blue, alpha: alpha), body: self)
ApplyColor3D(color: .init(red: red, green: green, blue: blue, alpha: alpha), body: self)
}
}
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@ import Foundation

extension Boundary {
fileprivate var visualizationPointColor: Color {
Color.named(.red, alpha: 1)
.red
}

fileprivate var visualizationStandardPointSize: Double { 0.1 }
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@ import Foundation

extension BoundingBox {
fileprivate var visualizationBorderColor: Color {
Color.named(.blue, alpha: 0.5)
.blue.withAlphaComponent(0.5)
}

fileprivate var visualizationStandardBorderWidth: Double { 0.1 }
324 changes: 180 additions & 144 deletions Sources/SwiftSCAD/Values/Color.swift
Original file line number Diff line number Diff line change
@@ -1,149 +1,185 @@
import Foundation

public enum Color: Sendable {
case components (red: Double, green: Double, blue: Double, alpha: Double)
case named (Name, alpha: Double)
public struct Color: Sendable {
private let value: Value

public enum Name: String, Sendable {
case lavender
case thistle
case plum
case violet
case orchid
case fuchsia
case magenta
case mediumOrchid
case mediumPurple
case blueViolet
case darkViolet
case darkOrchid
case darkMagenta
case purple
case indigo
case darkSlateBlue
case slateBlue
case mediumSlateBlue
case pink
case lightPink
case hotPink
case deepPink
case mediumVioletRed
case paleVioletRed
case aqua
case cyan
case lightCyan
case paleTurquoise
case aquamarine
case turquoise
case mediumTurquoise
case darkTurquoise
case cadetBlue
case steelBlue
case lightSteelBlue
case powderBlue
case lightBlue
case skyBlue
case lightSkyBlue
case deepSkyBlue
case dodgerBlue
case cornflowerBlue
case royalBlue
case blue
case mediumBlue
case darkBlue
case navy
case midnightBlue
case indianRed
case lightCoral
case salmon
case darkSalmon
case lightSalmon
case red
case crimson
case fireBrick
case darkRed
case greenYellow
case chartreuse
case lawnGreen
case lime
case limeGreen
case paleGreen
case lightGreen
case mediumSpringGreen
case springGreen
case mediumSeaGreen
case seaGreen
case forestGreen
case green
case darkGreen
case yellowGreen
case oliveDrab
case olive
case darkOliveGreen
case mediumAquamarine
case darkSeaGreen
case lightSeaGreen
case darkCyan
case teal
case coral
case tomato
case orangeRed
case darkOrange
case orange
case gold
case yellow
case lightYellow
case lemonChiffon
case lightGoldenrodYellow
case papayaWhip
case moccasin
case peachPuff
case paleGoldenrod
case khaki
case darkKhaki
case cornsilk
case blanchedAlmond
case bisque
case navajoWhite
case wheat
case burlyWood
case tan
case rosyBrown
case sandyBrown
case goldenrod
case darkGoldenrod
case peru
case chocolate
case saddleBrown
case sienna
case brown
case maroon
case white
case snow
case honeydew
case mintCream
case azure
case aliceBlue
case ghostWhite
case whiteSmoke
case seashell
case beige
case oldLace
case floralWhite
case ivory
case antiqueWhite
case linen
case lavenderBlush
case mistyRose
case gainsboro
case lightGrey
case silver
case darkGray
case gray
case dimGray
case lightSlateGray
case slateGray
case darkSlateGray
case black
init(red: Double, green: Double, blue: Double, alpha: Double = 1.0) {
value = .components(red: red, green: green, blue: blue, alpha: alpha)
}

func withAlphaComponent(_ alpha: Double) -> Color {
switch value {
case .components (let red, let green, let blue, _):
Color(red: red, green: green, blue: blue, alpha: alpha)
case .named (let name, _):
Color(name: name, alpha: alpha)
}
}
}

internal extension Color {
enum Value {
case components (red: Double, green: Double, blue: Double, alpha: Double)
case named (String, alpha: Double)

var parameters: Invocation.Parameters {
switch self {
case .components (let red, let green, let blue, let alpha):
["c": [red, green, blue, alpha]]
case .named (let name, let alpha):
["c": name, "alpha": alpha]
}
}
}

init(name: String, alpha: Double = 1.0) {
value = .named(name, alpha: alpha)
}

var invocation: Invocation {
Invocation(name: "color", parameters: value.parameters)
}
}

public extension Color {
static let lavender = Color(name: "lavender")
static let thistle = Color(name: "thistle")
static let plum = Color(name: "plum")
static let violet = Color(name: "violet")
static let orchid = Color(name: "orchid")
static let fuchsia = Color(name: "fuchsia")
static let magenta = Color(name: "magenta")
static let mediumOrchid = Color(name: "mediumOrchid")
static let mediumPurple = Color(name: "mediumPurple")
static let blueViolet = Color(name: "blueViolet")
static let darkViolet = Color(name: "darkViolet")
static let darkOrchid = Color(name: "darkOrchid")
static let darkMagenta = Color(name: "darkMagenta")
static let purple = Color(name: "purple")
static let indigo = Color(name: "indigo")
static let darkSlateBlue = Color(name: "darkSlateBlue")
static let slateBlue = Color(name: "slateBlue")
static let mediumSlateBlue = Color(name: "mediumSlateBlue")
static let pink = Color(name: "pink")
static let lightPink = Color(name: "lightPink")
static let hotPink = Color(name: "hotPink")
static let deepPink = Color(name: "deepPink")
static let mediumVioletRed = Color(name: "mediumVioletRed")
static let paleVioletRed = Color(name: "paleVioletRed")
static let aqua = Color(name: "aqua")
static let cyan = Color(name: "cyan")
static let lightCyan = Color(name: "lightCyan")
static let paleTurquoise = Color(name: "paleTurquoise")
static let aquamarine = Color(name: "aquamarine")
static let turquoise = Color(name: "turquoise")
static let mediumTurquoise = Color(name: "mediumTurquoise")
static let darkTurquoise = Color(name: "darkTurquoise")
static let cadetBlue = Color(name: "cadetBlue")
static let steelBlue = Color(name: "steelBlue")
static let lightSteelBlue = Color(name: "lightSteelBlue")
static let powderBlue = Color(name: "powderBlue")
static let lightBlue = Color(name: "lightBlue")
static let skyBlue = Color(name: "skyBlue")
static let lightSkyBlue = Color(name: "lightSkyBlue")
static let deepSkyBlue = Color(name: "deepSkyBlue")
static let dodgerBlue = Color(name: "dodgerBlue")
static let cornflowerBlue = Color(name: "cornflowerBlue")
static let royalBlue = Color(name: "royalBlue")
static let blue = Color(name: "blue")
static let mediumBlue = Color(name: "mediumBlue")
static let darkBlue = Color(name: "darkBlue")
static let navy = Color(name: "navy")
static let midnightBlue = Color(name: "midnightBlue")
static let indianRed = Color(name: "indianRed")
static let lightCoral = Color(name: "lightCoral")
static let salmon = Color(name: "salmon")
static let darkSalmon = Color(name: "darkSalmon")
static let lightSalmon = Color(name: "lightSalmon")
static let red = Color(name: "red")
static let crimson = Color(name: "crimson")
static let fireBrick = Color(name: "fireBrick")
static let darkRed = Color(name: "darkRed")
static let greenYellow = Color(name: "greenYellow")
static let chartreuse = Color(name: "chartreuse")
static let lawnGreen = Color(name: "lawnGreen")
static let lime = Color(name: "lime")
static let limeGreen = Color(name: "limeGreen")
static let paleGreen = Color(name: "paleGreen")
static let lightGreen = Color(name: "lightGreen")
static let mediumSpringGreen = Color(name: "mediumSpringGreen")
static let springGreen = Color(name: "springGreen")
static let mediumSeaGreen = Color(name: "mediumSeaGreen")
static let seaGreen = Color(name: "seaGreen")
static let forestGreen = Color(name: "forestGreen")
static let green = Color(name: "green")
static let darkGreen = Color(name: "darkGreen")
static let yellowGreen = Color(name: "yellowGreen")
static let oliveDrab = Color(name: "oliveDrab")
static let olive = Color(name: "olive")
static let darkOliveGreen = Color(name: "darkOliveGreen")
static let mediumAquamarine = Color(name: "mediumAquamarine")
static let darkSeaGreen = Color(name: "darkSeaGreen")
static let lightSeaGreen = Color(name: "lightSeaGreen")
static let darkCyan = Color(name: "darkCyan")
static let teal = Color(name: "teal")
static let coral = Color(name: "coral")
static let tomato = Color(name: "tomato")
static let orangeRed = Color(name: "orangeRed")
static let darkOrange = Color(name: "darkOrange")
static let orange = Color(name: "orange")
static let gold = Color(name: "gold")
static let yellow = Color(name: "yellow")
static let lightYellow = Color(name: "lightYellow")
static let lemonChiffon = Color(name: "lemonChiffon")
static let lightGoldenrodYellow = Color(name: "lightGoldenrodYellow")
static let papayaWhip = Color(name: "papayaWhip")
static let moccasin = Color(name: "moccasin")
static let peachPuff = Color(name: "peachPuff")
static let paleGoldenrod = Color(name: "paleGoldenrod")
static let khaki = Color(name: "khaki")
static let darkKhaki = Color(name: "darkKhaki")
static let cornsilk = Color(name: "cornsilk")
static let blanchedAlmond = Color(name: "blanchedAlmond")
static let bisque = Color(name: "bisque")
static let navajoWhite = Color(name: "navajoWhite")
static let wheat = Color(name: "wheat")
static let burlyWood = Color(name: "burlyWood")
static let tan = Color(name: "tan")
static let rosyBrown = Color(name: "rosyBrown")
static let sandyBrown = Color(name: "sandyBrown")
static let goldenrod = Color(name: "goldenrod")
static let darkGoldenrod = Color(name: "darkGoldenrod")
static let peru = Color(name: "peru")
static let chocolate = Color(name: "chocolate")
static let saddleBrown = Color(name: "saddleBrown")
static let sienna = Color(name: "sienna")
static let brown = Color(name: "brown")
static let maroon = Color(name: "maroon")
static let white = Color(name: "white")
static let snow = Color(name: "snow")
static let honeydew = Color(name: "honeydew")
static let mintCream = Color(name: "mintCream")
static let azure = Color(name: "azure")
static let aliceBlue = Color(name: "aliceBlue")
static let ghostWhite = Color(name: "ghostWhite")
static let whiteSmoke = Color(name: "whiteSmoke")
static let seashell = Color(name: "seashell")
static let beige = Color(name: "beige")
static let oldLace = Color(name: "oldLace")
static let floralWhite = Color(name: "floralWhite")
static let ivory = Color(name: "ivory")
static let antiqueWhite = Color(name: "antiqueWhite")
static let linen = Color(name: "linen")
static let lavenderBlush = Color(name: "lavenderBlush")
static let mistyRose = Color(name: "mistyRose")
static let gainsboro = Color(name: "gainsboro")
static let lightGrey = Color(name: "lightGrey")
static let silver = Color(name: "silver")
static let darkGray = Color(name: "darkGray")
static let gray = Color(name: "gray")
static let dimGray = Color(name: "dimGray")
static let lightSlateGray = Color(name: "lightSlateGray")
static let slateGray = Color(name: "slateGray")
static let darkSlateGray = Color(name: "darkSlateGray")
static let black = Color(name: "black")
}

0 comments on commit 9dba783

Please sign in to comment.