Skip to content

Commit bb94a80

Browse files
committed
Convert to parametric types.
1 parent 66dfcde commit bb94a80

File tree

6 files changed

+318
-229
lines changed

6 files changed

+318
-229
lines changed

src/Color.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
module Color
22

3-
import Base: convert, hex, isless, writemime, linspace
3+
using FixedPoint
4+
5+
typealias Fractional Union(FloatingPoint, AbstractFixed)
6+
7+
import Base: convert, eltype, hex, isless, linspace, typemin, typemax, writemime
48
import Base.Graphics: set_source, set_source_rgb, GraphicsContext
59

610
export ColorValue, color,
@@ -9,6 +13,7 @@ export ColorValue, color,
913
weighted_color_mean, hex,
1014
RGB, HSV, HSL, XYZ, xyY, Lab, LAB, Luv, LUV, LCHab, LCHuv, DIN99, DIN99d, DIN99o, LMS, RGB24,
1115
RGBA, HSVA, HSLA, XYZA, xyYA, LabA, LuvA, LCHabA, LCHuvA, DIN99A, DIN99dA, DIN99oA, LMSA, RGBA32,
16+
rgba, hsva, hsla, xyza, xyYa, laba, luva, lchaba, lchuva, din99a, din99da, din99oa, lmsa, rgba32,
1217
protanopic, deuteranopic, tritanopic,
1318
distinguishable_colors,
1419
colordiff, DE_2000, DE_94, DE_JPC79, DE_CMC, DE_BFD, DE_AB, DE_DIN99, DE_DIN99d, DE_DIN99o,

src/colorspaces.jl

Lines changed: 137 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -2,234 +2,271 @@
22
# ------------------
33

44
# The base type
5-
abstract ColorValue
6-
typealias ColourValue ColorValue
5+
abstract ColorValue{T}
6+
typealias ColourValue{T} ColorValue{T}
77

8+
eltype{T}(::ColorValue{T}) = T
89

910
# Transparency support
10-
immutable AlphaColorValue{T <: ColorValue}
11-
c::T
12-
alpha::Float64
11+
immutable AlphaColorValue{C <: ColorValue, T <: Number}
12+
c::C
13+
alpha::T
1314

14-
function AlphaColorValue(x1, x2, x3, alpha=1.0)
15-
new(T(x1, x2, x3), alpha)
15+
function AlphaColorValue(x1::T, x2::T, x3::T, alpha::T)
16+
new(C(x1, x2, x3), alpha)
1617
end
17-
AlphaColorValue(c::T, alpha=1.0) = new(c, alpha)
18+
AlphaColorValue(c::C, alpha::T) = new(c, alpha)
1819
end
19-
20+
AlphaColorValue{T<:Fractional}(c::ColorValue{T}, alpha::T = one(T)) = AlphaColorValue{typeof(c),T}(c, alpha)
2021

2122
# sRGB (standard Red-Green-Blue)
22-
immutable RGB <: ColorValue
23-
r::Float64 # Red in [0,1]
24-
g::Float64 # Green in [0,1]
25-
b::Float64 # Blue in [0,1]
23+
immutable RGB{T<:Fractional} <: ColorValue{T}
24+
r::T # Red [0,1]
25+
g::T # Green [0,1]
26+
b::T # Blue [0,1]
2627

2728
function RGB(r::Number, g::Number, b::Number)
2829
new(r, g, b)
2930
end
3031

31-
RGB() = RGB(0, 0, 0)
3232
end
33+
RGB{T<:Fractional}(r::T, g::T, b::T) = RGB{T}(r, g, b)
34+
RGB(r, g, b) = (T = promote_type(typeof(r), typeof(g), typeof(b)); RGB{T}(r, g, b))
35+
RGB(r::Integer, g::Integer, b::Integer) = RGB{Float64}(r, g, b)
36+
RGB() = RGB(0.0, 0.0, 0.0)
3337

38+
typemin{T}(::Type{RGB{T}}) = RGB{T}(zero(T), zero(T), zero(T))
39+
typemax{T}(::Type{RGB{T}}) = RGB{T}(one(T), one(T), one(T))
3440

3541
# HSV (Hue-Saturation-Value)
36-
immutable HSV <: ColorValue
37-
h::Float64 # Hue in [0,360]
38-
s::Float64 # Saturation in [0,1]
39-
v::Float64 # Value in [0,1]
42+
immutable HSV{T<:FloatingPoint} <: ColorValue{T}
43+
h::T # Hue in [0,360]
44+
s::T # Saturation in [0,1]
45+
v::T # Value in [0,1]
4046

4147
function HSV(h::Number, s::Number, v::Number)
4248
new(h, s, v)
4349
end
4450

45-
HSV() = HSV(0, 0, 0)
4651
end
52+
HSV{T<:FloatingPoint}(h::T, s::T, v::T) = HSV{T}(h, s, v)
53+
HSV(h, s, v) = HSV{Float64}(h, s, v)
54+
HSV() = HSV(0.0, 0.0, 0.0)
4755

4856

4957
HSB(h, s, b) = HSV(h, s, b)
5058

5159

5260
# HSL (Hue-Lightness-Saturation)
53-
immutable HSL <: ColorValue
54-
h::Float64 # Hue in [0,360]
55-
s::Float64 # Saturation in [0,1]
56-
l::Float64 # Lightness in [0,1]
61+
immutable HSL{T<:FloatingPoint} <: ColorValue{T}
62+
h::T # Hue in [0,360]
63+
s::T # Saturation in [0,1]
64+
l::T # Lightness in [0,1]
5765

5866
function HSL(h::Number, s::Number, l::Number)
5967
new(h, s, l)
6068
end
61-
62-
HSL() = HSL(0, 0, 0)
6369
end
70+
HSL{T<:FloatingPoint}(h::T, s::T, l::T) = HSL{T}(h, s, l)
71+
HSL(h, s, l) = HSL{Float64}(h, s, l)
72+
HSL() = HSL(0.0, 0.0, 0.0)
6473

6574

6675
HLS(h, l, s) = HSL(h, s, l)
6776

6877

6978
# XYZ (CIE 1931)
70-
immutable XYZ <: ColorValue
71-
x::Float64
72-
y::Float64
73-
z::Float64
79+
immutable XYZ{T<:Fractional} <: ColorValue{T}
80+
x::T
81+
y::T
82+
z::T
7483

7584
function XYZ(x::Number, y::Number, z::Number)
7685
new(x, y, z)
7786
end
78-
79-
XYZ() = XYZ(0, 0, 0)
8087
end
88+
XYZ{T<:Fractional}(x::T, y::T, z::T) = XYZ{T}(x, y, z)
89+
XYZ(x, y, z) = (T = promote_type(typeof(x), typeof(y), typeof(z)); XYZ{T}(x, y, z))
90+
XYZ() = XYZ(0.0, 0.0, 0.0)
8191

8292
# CIE 1931 xyY (chromaticity + luminance) space
83-
immutable xyY <: ColorValue
84-
x::Float64
85-
y::Float64
86-
Y::Float64
93+
immutable xyY{T<:FloatingPoint} <: ColorValue{T}
94+
x::T
95+
y::T
96+
Y::T
8797

8898
function xyY(x::Number, y::Number, Y::Number)
8999
new(x, y, Y)
90100
end
91-
92-
xyY() = xyY(0,0,0)
93101
end
102+
xyY{T<:FloatingPoint}(x::T, y::T, Y::T) = xyY{T}(x, y, Y)
103+
xyY(x, y, Y) = xyY{Float64}(x, y, Y)
104+
xyY() = xyY(0.0,0.0,0.0)
94105

95106

96107
# Lab (CIELAB)
97-
immutable Lab <: ColorValue
98-
l::Float64 # Luminance in approximately [0,100]
99-
a::Float64 # Red/Green
100-
b::Float64 # Blue/Yellow
108+
immutable Lab{T<:FloatingPoint} <: ColorValue{T}
109+
l::T # Luminance in approximately [0,100]
110+
a::T # Red/Green
111+
b::T # Blue/Yellow
101112

102113
function Lab(l::Number, a::Number, b::Number)
103114
new(l, a, b)
104115
end
105-
106-
Lab() = Lab(0, 0, 0)
107116
end
117+
Lab{T<:FloatingPoint}(l::T, a::T, b::T) = Lab{T}(l, a, b)
118+
Lab(l, a, b) = Lab{Float64}(l, a, b)
119+
Lab() = Lab(0.0, 0.0, 0.0)
108120

109121
typealias LAB Lab
110122

111123

112124
# LCHab (Luminance-Chroma-Hue, Polar-Lab)
113-
immutable LCHab <: ColorValue
114-
l::Float64 # Luminance in [0,100]
115-
c::Float64 # Chroma
116-
h::Float64 # Hue in [0,360]
125+
immutable LCHab{T<:FloatingPoint} <: ColorValue{T}
126+
l::T # Luminance in [0,100]
127+
c::T # Chroma
128+
h::T # Hue in [0,360]
117129

118130
function LCHab(l::Number, c::Number, h::Number)
119131
new(l, c, h)
120132
end
121-
122-
LCHab() = LCHab(0, 0, 0)
123133
end
134+
LCHab{T<:FloatingPoint}(l::T, c::T, h::T) = LCHab{T}(l, c, h)
135+
LCHab(l, c, h) = LCHab{Float64}(l, c, h)
136+
LCHab() = LCHab(0.0, 0.0, 0.0)
124137

125138

126139
# Luv (CIELUV)
127-
immutable Luv <: ColorValue
128-
l::Float64 # Luminance
129-
u::Float64 # Red/Green
130-
v::Float64 # Blue/Yellow
140+
immutable Luv{T<:FloatingPoint} <: ColorValue{T}
141+
l::T # Luminance
142+
u::T # Red/Green
143+
v::T # Blue/Yellow
131144

132145
function Luv(l::Number, u::Number, v::Number)
133146
new(l, u, v)
134147
end
135-
136-
Luv() = Luv(0, 0, 0)
137148
end
149+
Luv{T<:FloatingPoint}(l::T, u::T, v::T) = Luv{T}(l, u, v)
150+
Luv(l, u, v) = Luv{Float64}(l, u, v)
151+
Luv() = Luv(0.0, 0.0, 0.0)
138152

139153
typealias LUV Luv
140154

141155

142156
# LCHuv (Luminance-Chroma-Hue, Polar-Luv)
143-
immutable LCHuv <: ColorValue
144-
l::Float64 # Luminance
145-
c::Float64 # Chroma
146-
h::Float64 # Hue
157+
immutable LCHuv{T<:FloatingPoint} <: ColorValue{T}
158+
l::T # Luminance
159+
c::T # Chroma
160+
h::T # Hue
147161

148162
function LCHuv(l::Number, c::Number, h::Number)
149163
new(l, c, h)
150164
end
151-
152-
LCHuv() = LCHuv(0, 0, 0)
153165
end
166+
LCHuv{T<:FloatingPoint}(l::T, c::T, h::T) = LCHuv{T}(l, c, h)
167+
LCHuv(l, c, h) = LCHuv{Float64}(l, c, h)
168+
LCHuv() = LCHuv(0.0, 0.0, 0.0)
154169

155170

156171
# DIN99 (L99, a99, b99) - adaptation of CIELAB
157-
immutable DIN99 <: ColorValue
158-
l::Float64 # L99
159-
a::Float64 # a99
160-
b::Float64 # b99
172+
immutable DIN99{T<:FloatingPoint} <: ColorValue{T}
173+
l::T # L99
174+
a::T # a99
175+
b::T # b99
161176

162177
function DIN99(l::Number, a::Number, b::Number)
163178
new(l, a, b)
164179
end
165-
166-
DIN99() = DIN99(0, 0, 0)
167180
end
181+
DIN99{T<:FloatingPoint}(l::T, a::T, b::T) = DIN99{T}(l, a, b)
182+
DIN99(l, a, b) = DIN99{Float64}(l, a, b)
183+
DIN99() = DIN99(0.0, 0.0, 0.0)
168184

169185

170186
# DIN99d (L99d, a99d, b99d) - Improvement on DIN99
171-
immutable DIN99d <: ColorValue
172-
l::Float64 # L99d
173-
a::Float64 # a99d
174-
b::Float64 # b99d
187+
immutable DIN99d{T<:FloatingPoint} <: ColorValue{T}
188+
l::T # L99d
189+
a::T # a99d
190+
b::T # b99d
175191

176192
function DIN99d(l::Number, a::Number, b::Number)
177193
new(l, a, b)
178194
end
179-
180-
DIN99d() = DIN99d(0, 0, 0)
181195
end
196+
DIN99d{T<:FloatingPoint}(l::T, a::T, b::T) = DIN99d{T}(l, a, b)
197+
DIN99d(l, a, b) = DIN99{Float64}(l, a, b)
198+
DIN99d() = DIN99d(0.0, 0.0, 0.0)
182199

183200

184201
# DIN99o (L99o, a99o, b99o) - adaptation of CIELAB
185-
immutable DIN99o <: ColorValue
186-
l::Float64 # L99o
187-
a::Float64 # a99o
188-
b::Float64 # b99o
202+
immutable DIN99o{T<:FloatingPoint} <: ColorValue{T}
203+
l::T # L99o
204+
a::T # a99o
205+
b::T # b99o
189206

190207
function DIN99o(l::Number, a::Number, b::Number)
191208
new(l, a, b)
192209
end
193-
194-
DIN99o() = DIN99o(0, 0, 0)
195210
end
211+
DIN99o{T<:FloatingPoint}(l::T, a::T, b::T) = DIN99o{T}(l, a, b)
212+
DIN99o(l, a, b) = DIN99o{Float64}(l, a, b)
213+
DIN99o() = DIN99o(0.0, 0.0, 0.0)
196214

197215

198216
# LMS (Long Medium Short)
199-
immutable LMS <: ColorValue
200-
l::Float64 # Long
201-
m::Float64 # Medium
202-
s::Float64 # Short
217+
immutable LMS{T<:FloatingPoint} <: ColorValue{T}
218+
l::T # Long
219+
m::T # Medium
220+
s::T # Short
203221

204222
function LMS(l::Number, m::Number, s::Number)
205223
new(l, m, s)
206224
end
207-
208-
LMS() = LMS(0, 0, 0)
209225
end
226+
LMS{T<:FloatingPoint}(l::T, m::T, s::T) = LMS{T}(l, m, s)
227+
LMS(l, m, s) = LMS{Float64}(l, m, s)
228+
LMS() = LMS(0.0, 0.0, 0.0)
210229

211230

212231
# 24 bit RGB (used by Cairo)
213-
immutable RGB24 <: ColorValue
232+
immutable RGB24 <: ColorValue{Uint8}
214233
color::Uint32
215234

216235
RGB24(c::Unsigned) = new(c)
217236
RGB24() = RGB24(0)
218237
end
219238

239+
AlphaColorValue(c::RGB24, alpha::Uint8 = 0xff) = AlphaColorValue{typeof(c),Uint8}(c, alpha)
220240

221241
# Versions with transparency
222-
typealias RGBA AlphaColorValue{RGB}
223-
typealias HSVA AlphaColorValue{HSV}
224-
typealias HSLA AlphaColorValue{HSL}
225-
typealias XYZA AlphaColorValue{XYZ}
226-
typealias xyYA AlphaColorValue{xyY}
227-
typealias LabA AlphaColorValue{Lab}
228-
typealias LCHabA AlphaColorValue{LCHab}
229-
typealias LuvA AlphaColorValue{Luv}
230-
typealias LCHuvA AlphaColorValue{LCHuv}
231-
typealias DIN99A AlphaColorValue{DIN99}
232-
typealias DIN99dA AlphaColorValue{DIN99d}
233-
typealias DIN99oA AlphaColorValue{DIN99o}
234-
typealias LMSA AlphaColorValue{LMS}
235-
typealias RGBA32 AlphaColorValue{RGB24}
242+
typealias RGBA{T} AlphaColorValue{RGB{T},T}
243+
typealias HSVA{T} AlphaColorValue{HSV{T},T}
244+
typealias HSLA{T} AlphaColorValue{HSL{T},T}
245+
typealias XYZA{T} AlphaColorValue{XYZ{T},T}
246+
typealias xyYA{T} AlphaColorValue{xyY{T},T}
247+
typealias LabA{T} AlphaColorValue{Lab{T},T}
248+
typealias LCHabA{T} AlphaColorValue{LCHab{T},T}
249+
typealias LuvA{T} AlphaColorValue{Luv{T},T}
250+
typealias LCHuvA{T} AlphaColorValue{LCHuv{T},T}
251+
typealias DIN99A{T} AlphaColorValue{DIN99{T},T}
252+
typealias DIN99dA{T} AlphaColorValue{DIN99d{T},T}
253+
typealias DIN99oA{T} AlphaColorValue{DIN99o{T},T}
254+
typealias LMSA{T} AlphaColorValue{LMS{T},T}
255+
typealias RGBA32 AlphaColorValue{RGB24,Uint8}
256+
257+
rgba{T}(c::ColorValue{T}) = AlphaColorValue(convert(RGB{T},c))
258+
hsva{T}(c::ColorValue{T}) = AlphaColorValue(convert(HSV{T},c))
259+
hsla{T}(c::ColorValue{T}) = AlphaColorValue(convert(HSL{T},c))
260+
xyza{T}(c::ColorValue{T}) = AlphaColorValue(convert(XYZ{T},c))
261+
xyYa{T}(c::ColorValue{T}) = AlphaColorValue(convert(xyY{T},c))
262+
laba{T}(c::ColorValue{T}) = AlphaColorValue(convert(Lab{T},c))
263+
lchaba{T}(c::ColorValue{T}) = AlphaColorValue(convert(LCH{T},c))
264+
luva{T}(c::ColorValue{T}) = AlphaColorValue(convert(Luv{T},c))
265+
lchuva{T}(c::ColorValue{T}) = AlphaColorValue(convert(LCHuv{T},c))
266+
din99a{T}(c::ColorValue{T}) = AlphaColorValue(convert(DIN99{T},c))
267+
din99da{T}(c::ColorValue{T}) = AlphaColorValue(convert(DIN99d{T},c))
268+
din99oa{T}(c::ColorValue{T}) = AlphaColorValue(convert(DIN99o{T},c))
269+
lmsa{T}(c::ColorValue{T}) = AlphaColorValue(convert(LMS{T},c))
270+
rgba32{T}(c::ColorValue{T}) = AlphaColorValue(convert(RGB24,c))
271+
272+
const CVparametric = (RGB, HSV, HSL, XYZ, xyY, Lab, Luv, LCHab, LCHuv, DIN99, DIN99d, DIN99o, LMS)

0 commit comments

Comments
 (0)