Skip to content

Commit ec2b08e

Browse files
authored
Handle fixed-point Q0f colors by converting them to float (#29)
* Handle fixed-point colors by always converting them to float * Fix only 'Q0f' colors
1 parent 8e15b76 commit ec2b08e

File tree

4 files changed

+71
-6
lines changed

4 files changed

+71
-6
lines changed

Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ version = "1.0.1"
77
ColorSchemes = "35d6a980-a343-548e-a6ea-1d62b119f2f4"
88
Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
99
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
10+
FixedPointNumbers = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
1011

1112
[weakdeps]
1213
CategoricalArrays = "324d7699-5711-5eae-9e2f-1d82baa6b597"
@@ -24,5 +25,6 @@ ColorSchemes = "3.24"
2425
Colors = "0.12, 0.13"
2526
Dates = "1.9"
2627
Distributions = "0.25"
28+
FixedPointNumbers = "0.8"
2729
Unitful = "1.19"
2830
julia = "1.9"

src/Colorfy.jl

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module Colorfy
66

77
using Colors
88
using ColorSchemes
9+
using FixedPointNumbers
910
using Dates
1011

1112
export Colorfier, colorfy
@@ -32,12 +33,13 @@ struct Colorfier{V,A,S,R}
3233
colorrange::R
3334
end
3435

35-
Colorfier(
36-
values;
37-
alphas=defaultalphas(values),
38-
colorscheme=defaultcolorscheme(values),
39-
colorrange=defaultcolorrange(values)
40-
) = Colorfier(values, asalphas(alphas, values), ascolorscheme(colorscheme), ascolorrange(colorrange))
36+
function Colorfier(values; alphas=nothing, colorscheme=nothing, colorrange=nothing)
37+
values′ = asvalues(values)
38+
alphas′ = isnothing(alphas) ? defaultalphas(values′) : alphas
39+
colorscheme′ = isnothing(colorscheme) ? defaultcolorscheme(values′) : colorscheme
40+
colorrange′ = isnothing(colorrange) ? defaultcolorrange(values′) : colorrange
41+
Colorfier(values′, asalphas(alphas′, values′), ascolorscheme(colorscheme′), ascolorrange(colorrange′))
42+
end
4143

4244
"""
4345
colorfy(values; kwargs...)
@@ -131,6 +133,18 @@ Default color range for `values`.
131133
"""
132134
defaultcolorrange(_) = :extrema
133135

136+
"""
137+
Colorfy.asvalues(values)
138+
139+
Valid color values for a given `values`.
140+
"""
141+
asvalues(values) = values
142+
asvalues(values::Values{Colorant}) = values
143+
asvalues(values::Values{Colorant{Q0f7}}) = fixcolors(values)
144+
asvalues(values::Values{Colorant{Q0f15}}) = fixcolors(values)
145+
asvalues(values::Values{Colorant{Q0f31}}) = fixcolors(values)
146+
asvalues(values::Values{Colorant{Q0f63}}) = fixcolors(values)
147+
134148
"""
135149
Colorfy.asalphas(alphas, values)
136150
@@ -228,6 +242,8 @@ end
228242
# HELPER FUNCTIONS
229243
# -----------------
230244

245+
fixcolors(colors) = convert.(floattype(eltype(colors)), colors)
246+
231247
nonmissingvec(x::AbstractVector{T}) where {T} = convert(AbstractVector{nonmissingtype(T)}, x)
232248

233249
function genvec(vecinds, vec, valinds, val, len)

test/Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ Colorfy = "03fe91ce-8ec6-4610-8e8d-e7491ccca690"
55
Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
66
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
77
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
8+
FixedPointNumbers = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
89
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
910
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"

test/runtests.jl

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Colorfy
22
using Colors
33
using ColorSchemes
4+
using FixedPointNumbers
45
using CategoricalArrays
56
using Distributions
67
using Unitful
@@ -16,6 +17,51 @@ using Test
1617
@test Colorfy.colorscheme(colorfier) == colorschemes[:viridis]
1718
@test Colorfy.colorrange(colorfier) == :extrema
1819

20+
colors = [Gray(rand()) for _ in 1:10]
21+
colorfier = Colorfier(colors)
22+
@test eltype(Colorfy.values(colorfier)) <: Gray
23+
@test eltype(eltype(Colorfy.values(colorfier))) <: AbstractFloat
24+
@test Colorfy.values(colorfier) == colors
25+
@test Colorfy.alphas(colorfier) == fill(1, 10)
26+
@test Colorfy.colorscheme(colorfier) == colorschemes[:viridis]
27+
@test Colorfy.colorrange(colorfier) == :extrema
28+
29+
colors = [Gray(rand(Q0f7)) for _ in 1:10]
30+
colorfier = Colorfier(colors)
31+
@test eltype(Colorfy.values(colorfier)) <: Gray
32+
@test eltype(eltype(Colorfy.values(colorfier))) <: AbstractFloat
33+
@test Colorfy.values(colorfier) == colors
34+
@test Colorfy.alphas(colorfier) == fill(1, 10)
35+
@test Colorfy.colorscheme(colorfier) == colorschemes[:viridis]
36+
@test Colorfy.colorrange(colorfier) == :extrema
37+
38+
colors = [Gray(rand(Q0f15)) for _ in 1:10]
39+
colorfier = Colorfier(colors)
40+
@test eltype(Colorfy.values(colorfier)) <: Gray
41+
@test eltype(eltype(Colorfy.values(colorfier))) <: AbstractFloat
42+
@test Colorfy.values(colorfier) == colors
43+
@test Colorfy.alphas(colorfier) == fill(1, 10)
44+
@test Colorfy.colorscheme(colorfier) == colorschemes[:viridis]
45+
@test Colorfy.colorrange(colorfier) == :extrema
46+
47+
colors = [Gray(rand(Q0f31)) for _ in 1:10]
48+
colorfier = Colorfier(colors)
49+
@test eltype(Colorfy.values(colorfier)) <: Gray
50+
@test eltype(eltype(Colorfy.values(colorfier))) <: AbstractFloat
51+
@test Colorfy.values(colorfier) == colors
52+
@test Colorfy.alphas(colorfier) == fill(1, 10)
53+
@test Colorfy.colorscheme(colorfier) == colorschemes[:viridis]
54+
@test Colorfy.colorrange(colorfier) == :extrema
55+
56+
colors = [Gray(rand(Q0f63)) for _ in 1:10]
57+
colorfier = Colorfier(colors)
58+
@test eltype(Colorfy.values(colorfier)) <: Gray
59+
@test eltype(eltype(Colorfy.values(colorfier))) <: AbstractFloat
60+
@test Colorfy.values(colorfier) == colors
61+
@test Colorfy.alphas(colorfier) == fill(1, 10)
62+
@test Colorfy.colorscheme(colorfier) == colorschemes[:viridis]
63+
@test Colorfy.colorrange(colorfier) == :extrema
64+
1965
colorfier = Colorfier(values, alphas=0.5)
2066
@test Colorfy.values(colorfier) == values
2167
@test Colorfy.alphas(colorfier) == fill(0.5, 10)

0 commit comments

Comments
 (0)