1
-
2
1
/// An object which maps a value in the range `0...1` to a `Color`.
3
2
///
4
3
/// This object wraps a conformer to `ColorMapProtocol`, and is used instead of `ColorMapProtocol` directly
8
7
///
9
8
public struct ColorMap : ColorMapProtocol {
10
9
var base : ColorMapProtocol
11
-
10
+
12
11
public init ( _ base: ColorMapProtocol ) {
13
12
// If base is already wrapped, do not re-wrap it.
14
- if let existing = base as? ColorMap { self = existing }
15
- else { self . base = base }
13
+ if let existing = base as? ColorMap { self = existing } else { self . base = base }
16
14
}
17
15
public func colorForOffset( _ offset: Double ) -> Color {
18
16
let offset = min ( max ( offset, 0 ) , 1 )
@@ -35,8 +33,8 @@ extension ColorMapProtocol {
35
33
36
34
private struct ColorTransformer : ColorMapProtocol {
37
35
var base : ColorMapProtocol
38
- var transform : ( Color ) -> Color
39
- init ( _ base: ColorMapProtocol , transform: @escaping ( Color ) -> Color ) {
36
+ var transform : ( Color ) -> Color
37
+ init ( _ base: ColorMapProtocol , transform: @escaping ( Color ) -> Color ) {
40
38
self . base = base; self . transform = transform
41
39
}
42
40
func colorForOffset( _ offset: Double ) -> Color {
@@ -45,13 +43,13 @@ private struct ColorTransformer: ColorMapProtocol {
45
43
}
46
44
47
45
extension ColorMap {
48
-
46
+
49
47
/// Returns a `ColorMap` whose output is transformed by the given closure.
50
48
///
51
- public func withTransform( _ transform: @escaping ( Color ) -> Color ) -> ColorMap {
49
+ public func withTransform( _ transform: @escaping ( Color ) -> Color ) -> ColorMap {
52
50
return ColorMap ( ColorTransformer ( base, transform: transform) )
53
51
}
54
-
52
+
55
53
/// Returns a `ColorMap` whose output colors' alpha components are given by `alpha`.
56
54
///
57
55
public func withAlpha( _ alpha: Float ) -> ColorMap {
@@ -63,7 +61,7 @@ extension ColorMap {
63
61
public func lightened( by amount: Float ) -> ColorMap {
64
62
return withTransform { $0. linearBlend ( with: . white, offset: amount) }
65
63
}
66
-
64
+
67
65
/// Returns a `ColorMap` whose output colors are darkened by the given `amount`.
68
66
///
69
67
public func darkened( by amount: Float ) -> ColorMap {
@@ -75,8 +73,8 @@ extension ColorMap {
75
73
76
74
private struct ColorMapOffsetTransformer : ColorMapProtocol {
77
75
var base : ColorMapProtocol
78
- var transform : ( Double ) -> Double
79
- init ( _ base: ColorMapProtocol , transform: @escaping ( Double ) -> Double ) {
76
+ var transform : ( Double ) -> Double
77
+ init ( _ base: ColorMapProtocol , transform: @escaping ( Double ) -> Double ) {
80
78
self . base = base; self . transform = transform
81
79
}
82
80
func colorForOffset( _ offset: Double ) -> Color {
@@ -88,11 +86,11 @@ private struct ColorMapOffsetTransformer: ColorMapProtocol {
88
86
}
89
87
90
88
extension ColorMap {
91
-
89
+
92
90
private func withOffsetTransform( _ transform: @escaping ( Double ) -> Double ) -> ColorMap {
93
91
return ColorMap ( ColorMapOffsetTransformer ( base, transform: transform) )
94
92
}
95
-
93
+
96
94
/// Returns a `ColorMap` whose output at offset `x` is equal to this `ColorMap`'s output at `1 - x`.
97
95
///
98
96
public func reversed( ) -> ColorMap {
@@ -110,11 +108,11 @@ private struct SingleColorMap: ColorMapProtocol {
110
108
}
111
109
112
110
extension ColorMap {
113
-
111
+
114
112
/// Returns a `ColorMap` which always returns the same color.
115
113
///
116
114
public static func color( _ color: Color ) -> ColorMap {
117
- return ColorMap ( SingleColorMap ( color: color) )
115
+ return ColorMap ( SingleColorMap ( color: color) )
118
116
}
119
117
}
120
118
@@ -132,7 +130,7 @@ public struct GradientStop {
132
130
133
131
private struct LinearGradient : ColorMapProtocol {
134
132
var stops : [ GradientStop ]
135
-
133
+
136
134
init ( stops: [ GradientStop ] ) {
137
135
self . stops = stops. sorted { $0. position < $1. position }
138
136
}
@@ -147,29 +145,29 @@ private struct LinearGradient: ColorMapProtocol {
147
145
guard rightStopIdx > stops. startIndex else { return rightStop. color }
148
146
let leftStop = stops [ stops. index ( before: rightStopIdx) ]
149
147
assert ( leftStop. position <= offset)
150
-
148
+
151
149
let distance = rightStop. position - leftStop. position
152
150
guard distance > 0 else { return rightStop. color }
153
-
151
+
154
152
let offset = ( offset - leftStop. position) / distance
155
153
return leftStop. color. linearBlend ( with: rightStop. color, offset: Float ( offset) )
156
154
}
157
155
}
158
156
159
157
extension ColorMap {
160
-
158
+
161
159
/// Returns a `ColorMap` whose output is a linear gradient with the given stops.
162
160
///
163
161
public static func linearGradient( _ stops: [ GradientStop ] ) -> ColorMap {
164
162
return ColorMap ( LinearGradient ( stops: stops) )
165
163
}
166
-
164
+
167
165
/// Returns a `ColorMap` whose output is a linear gradient between the given colors.
168
166
///
169
167
public static func linearGradient( _ start: Color , _ end: Color ) -> ColorMap {
170
168
return ColorMap ( LinearGradient ( start: start, end: end) )
171
169
}
172
-
170
+
173
171
/// A standard, five-color heat map.
174
172
///
175
173
public static let fiveColorHeatMap = ColorMap . linearGradient ( [
@@ -192,4 +190,3 @@ extension ColorMap {
192
190
GradientStop ( Color ( 1 , 1 , 1 , 1 ) , at: 1 )
193
191
] )
194
192
}
195
-
0 commit comments