paleta 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -1
- data/LICENSE +20 -0
- data/lib/paleta.rb +1 -0
- data/lib/paleta/color.rb +77 -29
- data/lib/paleta/multiple_regression.rb +39 -0
- data/lib/paleta/palette.rb +55 -0
- data/lib/paleta/version.rb +1 -1
- data/paleta.gemspec +2 -2
- data/readme.markdown +86 -0
- data/spec/models/color_spec.rb +70 -0
- data/spec/models/palette_spec.rb +80 -0
- metadata +8 -4
data/.gitignore
CHANGED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 Jordan Stephens <http://jordanstephens.net>
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/lib/paleta.rb
CHANGED
data/lib/paleta/color.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Paleta
|
2
2
|
class Color
|
3
|
+
include Math
|
3
4
|
|
4
|
-
attr_reader :red, :green, :blue, :hue, :saturation, :lightness
|
5
|
+
attr_reader :red, :green, :blue, :hue, :saturation, :lightness, :hex
|
5
6
|
|
6
7
|
def initialize(red = 0, green = 0, blue = 0)
|
7
8
|
self.red = red
|
@@ -12,31 +13,77 @@ module Paleta
|
|
12
13
|
def red=(val)
|
13
14
|
@red = range_validator(val, 0..255)
|
14
15
|
update_hsl
|
16
|
+
update_hex
|
15
17
|
end
|
16
18
|
|
17
19
|
def green=(val)
|
18
20
|
@green = range_validator(val, 0..255)
|
19
21
|
update_hsl
|
22
|
+
update_hex
|
20
23
|
end
|
21
24
|
|
22
25
|
def blue=(val)
|
23
26
|
@blue = range_validator(val, 0..255)
|
24
27
|
update_hsl
|
28
|
+
update_hex
|
25
29
|
end
|
26
30
|
|
27
31
|
def lightness=(val)
|
28
32
|
@lightness = range_validator(val, 0..100)
|
29
33
|
update_rgb
|
34
|
+
update_hex
|
30
35
|
end
|
31
36
|
|
32
37
|
def saturation=(val)
|
33
38
|
@saturation = range_validator(val, 0..100)
|
34
39
|
update_rgb
|
40
|
+
update_hex
|
35
41
|
end
|
36
42
|
|
37
43
|
def hue=(val)
|
38
44
|
@hue = range_validator(val, 0..360)
|
39
45
|
update_rgb
|
46
|
+
update_hex
|
47
|
+
end
|
48
|
+
|
49
|
+
def hex=(val)
|
50
|
+
if val.length != 6 ||
|
51
|
+
(val[0..1] == 0 && val[0..1] != "00") ||
|
52
|
+
(val[2..3] == 0 && val[2..3] != "00") ||
|
53
|
+
(val[4..5] == 0 && val[4..5] != "00")
|
54
|
+
raise(ArgumentError, "Invalid Hex String")
|
55
|
+
end
|
56
|
+
@hex = val.upcase
|
57
|
+
@red = val[0..1].hex
|
58
|
+
@green = val[2..3].hex
|
59
|
+
@blue = val[4..5].hex
|
60
|
+
update_hsl
|
61
|
+
end
|
62
|
+
|
63
|
+
def lighten!(percent = 5)
|
64
|
+
@lightness += percent
|
65
|
+
@lightness = 100 if @lightness > 100
|
66
|
+
update_rgb
|
67
|
+
update_hex
|
68
|
+
end
|
69
|
+
|
70
|
+
def darken!(percent = 5)
|
71
|
+
@lightness -= percent
|
72
|
+
@lightness = 0 if @lightness < 0
|
73
|
+
update_rgb
|
74
|
+
update_hex
|
75
|
+
end
|
76
|
+
|
77
|
+
def invert!
|
78
|
+
@red = 255 - @red
|
79
|
+
@green = 255 - @green
|
80
|
+
@blue = 255 - @blue
|
81
|
+
update_hsl
|
82
|
+
update_hex
|
83
|
+
end
|
84
|
+
|
85
|
+
def similarity(color)
|
86
|
+
sqrt(((@red - color.red) ** 2) + ((@green - color.green) ** 2) + ((@blue - color.blue) ** 2)) / sqrt(3 * (255 ** 2))
|
40
87
|
end
|
41
88
|
|
42
89
|
private
|
@@ -50,22 +97,21 @@ module Paleta
|
|
50
97
|
max = [r, g, b].max
|
51
98
|
delta = max - min
|
52
99
|
|
53
|
-
|
54
|
-
|
55
|
-
@lightness = (max + min) / 2.0
|
100
|
+
h = s = 0
|
101
|
+
l = (max + min) / 2.0
|
56
102
|
|
57
103
|
if delta != 0
|
58
|
-
|
104
|
+
s = (l < 0.5) ? delta / (max + min) : delta / (2.0 - max - min)
|
59
105
|
case max
|
60
|
-
when r;
|
61
|
-
when g;
|
62
|
-
when b;
|
106
|
+
when r; h = (g - b) / delta
|
107
|
+
when g; h = 2 + (b - r) / delta
|
108
|
+
when b; h = 4 + (r - g) / delta
|
63
109
|
end
|
64
110
|
end
|
65
|
-
@hue
|
111
|
+
@hue = h * 60
|
66
112
|
@hue += 360 if @hue < 0
|
67
|
-
@saturation
|
68
|
-
@lightness
|
113
|
+
@saturation = s * 100
|
114
|
+
@lightness = l * 100
|
69
115
|
end
|
70
116
|
|
71
117
|
def update_rgb
|
@@ -75,32 +121,34 @@ module Paleta
|
|
75
121
|
l = @lightness / 100.0
|
76
122
|
|
77
123
|
if s == 0
|
78
|
-
r = l * 255
|
79
|
-
g = l * 255
|
80
|
-
b = l * 255
|
124
|
+
r = g = b = l * 255
|
81
125
|
else
|
82
|
-
|
83
|
-
|
84
|
-
t2 = l * (s + 1)
|
85
|
-
else
|
86
|
-
t2 = (l + s) - (l * s)
|
87
|
-
end
|
126
|
+
h /= 6.0
|
127
|
+
t2 = l < 0.5 ? l * (s + 1) : (l + s) - (l * s)
|
88
128
|
t1 = 2 * l - t2
|
89
129
|
|
90
|
-
|
91
|
-
|
92
|
-
|
130
|
+
r = h + (1.0 / 3.0)
|
131
|
+
g = h
|
132
|
+
b = h - (1.0 / 3.0)
|
93
133
|
|
94
|
-
|
95
|
-
|
96
|
-
|
134
|
+
r = hue_calc(r, t1, t2)
|
135
|
+
g = hue_calc(g, t1, t2)
|
136
|
+
b = hue_calc(b, t1, t2)
|
97
137
|
|
98
|
-
@red =
|
99
|
-
@green =
|
100
|
-
@blue =
|
138
|
+
@red = r * 255.0
|
139
|
+
@green = g * 255.0
|
140
|
+
@blue = b * 255.0
|
101
141
|
end
|
102
142
|
end
|
103
143
|
|
144
|
+
def update_hex
|
145
|
+
r = @red.to_s(16) rescue "00"
|
146
|
+
g = @green.to_s(16) rescue "00"
|
147
|
+
b = @blue.to_s(16) rescue "00"
|
148
|
+
[r, g, b].each { |c| c = "0#{c}" if c.length < 2 }
|
149
|
+
@hex = "#{r}#{g}#{b}".upcase
|
150
|
+
end
|
151
|
+
|
104
152
|
def hue_calc(value, t1, t2)
|
105
153
|
value += 1 if value < 0
|
106
154
|
value -= 1 if value > 1
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class MultipleRegression
|
2
|
+
attr_accessor :slope, :offset
|
3
|
+
|
4
|
+
def initialize dr, dg, db
|
5
|
+
|
6
|
+
@size = dr.size
|
7
|
+
raise "arguments not same length!" unless @size == dg.size && @size == db.size
|
8
|
+
|
9
|
+
if @size == 1
|
10
|
+
@slope = { :r => dr[0], :g => dg[0], :b => db[0] }
|
11
|
+
@offset = { :r => 0, :g => 0, :b => 0 }
|
12
|
+
return
|
13
|
+
end
|
14
|
+
|
15
|
+
srr = sgg = sbb = srg = sbr = sgb = sr = sb = sg = 0
|
16
|
+
dr.zip(dg,db).each do |r,g,b|
|
17
|
+
srr += r ** 2
|
18
|
+
sgg += g ** 2
|
19
|
+
srg += r * g
|
20
|
+
sbr += b * r
|
21
|
+
sgb += g * b
|
22
|
+
sr += r
|
23
|
+
sb += g
|
24
|
+
sg += b
|
25
|
+
end
|
26
|
+
|
27
|
+
slope_rg = ( @size * srg - sr * sb ) / ( @size * srr - sr ** 2 ).to_f
|
28
|
+
slope_gb = ( @size * sgb - sb * sg ) / ( @size * sgg - sb ** 2 ).to_f
|
29
|
+
slope_br = ( @size * sgb - sb * sg ) / ( @size * sbb - sg ** 2 ).to_f
|
30
|
+
|
31
|
+
offset_rg = (sb - slope_rg * sr) / @size
|
32
|
+
offset_gb = (sg - slope_gb * sb) / @size
|
33
|
+
offset_br = (sr - slope_br * sg) / @size
|
34
|
+
|
35
|
+
@slope = { :r => slope_rg, :g => slope_gb, :b => slope_br }
|
36
|
+
@offset = { :r => offset_rg, :g => offset_gb, :b => offset_br }
|
37
|
+
return
|
38
|
+
end
|
39
|
+
end
|
data/lib/paleta/palette.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Paleta
|
2
2
|
class Palette
|
3
|
+
include Math
|
3
4
|
|
4
5
|
attr_accessor :colors
|
5
6
|
|
@@ -18,8 +19,62 @@ module Paleta
|
|
18
19
|
@colors[i]
|
19
20
|
end
|
20
21
|
|
22
|
+
def size
|
23
|
+
@colors.size
|
24
|
+
end
|
25
|
+
|
21
26
|
def include?(color)
|
22
27
|
@colors.include?(color)
|
23
28
|
end
|
29
|
+
|
30
|
+
def lighten!(percent = 5)
|
31
|
+
@colors.each do |color|
|
32
|
+
color.lighten!(percent)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def darken!(percent = 5)
|
37
|
+
@colors.each do |color|
|
38
|
+
color.darken!(percent)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def invert!
|
43
|
+
@colors.each do |color|
|
44
|
+
color.invert!
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def similarity(palette)
|
49
|
+
r1 = self.fit
|
50
|
+
r2 = palette.fit
|
51
|
+
|
52
|
+
a1, a2, b1, b2 = {}, {}, {}, {}
|
53
|
+
a1[:r] = 0 * r1.slope[:r] + r1.offset[:r]
|
54
|
+
a1[:g] = 0 * r1.slope[:g] + r1.offset[:g]
|
55
|
+
a1[:b] = 0 * r1.slope[:b] + r1.offset[:b]
|
56
|
+
b1[:r] = 255 * r1.slope[:r] + r1.offset[:r]
|
57
|
+
b1[:g] = 255 * r1.slope[:g] + r1.offset[:g]
|
58
|
+
b1[:b] = 255 * r1.slope[:b] + r1.offset[:b]
|
59
|
+
a2[:r] = 0 * r2.slope[:r] + r2.offset[:r]
|
60
|
+
a2[:g] = 0 * r2.slope[:g] + r2.offset[:g]
|
61
|
+
a2[:b] = 0 * r2.slope[:b] + r2.offset[:b]
|
62
|
+
b2[:r] = 255 * r2.slope[:r] + r2.offset[:r]
|
63
|
+
b2[:g] = 255 * r2.slope[:g] + r2.offset[:g]
|
64
|
+
b2[:b] = 255 * r2.slope[:b] + r2.offset[:b]
|
65
|
+
|
66
|
+
d1 = sqrt(((a1[:r] - a2[:r]) ** 2) + ((a1[:g] - a2[:g]) ** 2) + ((a1[:b] - a2[:b]) ** 2)) / sqrt(3 * (65025 ** 2))
|
67
|
+
d2 = sqrt(((b1[:r] - b2[:r]) ** 2) + ((b1[:g] - b2[:g]) ** 2) + ((b1[:b] - b2[:b]) ** 2)) / sqrt(3 * (65025 ** 2))
|
68
|
+
|
69
|
+
d1 + d2
|
70
|
+
end
|
71
|
+
|
72
|
+
def fit
|
73
|
+
# create a 3xn matrix where n = @colors.size to represent the set of colors
|
74
|
+
reds = @colors.map { |c| c.red }
|
75
|
+
greens = @colors.map { |c| c.green }
|
76
|
+
blues = @colors.map { |c| c.blue }
|
77
|
+
MultipleRegression.new(reds, greens, blues)
|
78
|
+
end
|
24
79
|
end
|
25
80
|
end
|
data/lib/paleta/version.rb
CHANGED
data/paleta.gemspec
CHANGED
@@ -4,8 +4,8 @@ require File.expand_path('../lib/paleta/version', __FILE__)
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.authors = ['Jordan Stephens']
|
6
6
|
gem.email = ['iam@jordanstephens.net']
|
7
|
-
gem.description = 'color
|
8
|
-
gem.summary = 'color
|
7
|
+
gem.description = 'A gem for working with color palettes'
|
8
|
+
gem.summary = 'A little library for creating, manipulating and comparing colors and color palettes'
|
9
9
|
gem.homepage = 'http://jordanstephens.net'
|
10
10
|
|
11
11
|
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
data/readme.markdown
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
# Paleta
|
2
|
+
|
3
|
+
A gem for working with color palettes
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
To install, run
|
8
|
+
|
9
|
+
$ gem install paleta
|
10
|
+
|
11
|
+
Or, add this to your application's Gemfile
|
12
|
+
|
13
|
+
``` ruby
|
14
|
+
gem 'paleta'
|
15
|
+
```
|
16
|
+
|
17
|
+
and run
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
### Color
|
24
|
+
|
25
|
+
# create a color with RGB components
|
26
|
+
color = Paleta::Color.new(94, 161, 235)
|
27
|
+
|
28
|
+
# access component values
|
29
|
+
color.red # => 94
|
30
|
+
color.green # => 161
|
31
|
+
color.blue # => 235
|
32
|
+
|
33
|
+
# HSL components are maintained too!
|
34
|
+
color.hue # => 211.48936170212767
|
35
|
+
color.saturation # => 77.90055248618782
|
36
|
+
color.lightness # => 64.50980392156862
|
37
|
+
|
38
|
+
# a HEX value is also maintained for each Color
|
39
|
+
color.hex # => "5EA1EB"
|
40
|
+
|
41
|
+
# lighten by a percentage
|
42
|
+
color.lighten!(10)
|
43
|
+
|
44
|
+
# darken by a percentage
|
45
|
+
color.darken!(10)
|
46
|
+
|
47
|
+
# invert a color
|
48
|
+
color.invert!
|
49
|
+
|
50
|
+
# calculate similarity between Colors
|
51
|
+
# Color#similarity calculates the similarity between two colors and returns a
|
52
|
+
# value in 0..1, with 0 being identical and 1 being as dissimilar as possible
|
53
|
+
color2 = Paleta::Color.new(237, 172, 33)
|
54
|
+
color.similarity(color2) # => 0.5609077061558945
|
55
|
+
|
56
|
+
### Palette
|
57
|
+
|
58
|
+
# add Colors to a Palette
|
59
|
+
color1 = Paleta::Color.new(13, 57, 182)
|
60
|
+
color2 = Paleta::Color.new(94, 161, 235)
|
61
|
+
palette = Paleta::Palette.new(c1, c2)
|
62
|
+
|
63
|
+
# retreive a Color from a Palette
|
64
|
+
palette[1] # => color2
|
65
|
+
|
66
|
+
# lighten and darken an entire Palette by a percentage
|
67
|
+
palette.lighten!(15)
|
68
|
+
palette.darken!(20)
|
69
|
+
|
70
|
+
# invert each color in a Palette
|
71
|
+
palette.invert!
|
72
|
+
|
73
|
+
# calculate similarity of two Palettes
|
74
|
+
color1 = Paleta::Color.new(13, 57, 182)
|
75
|
+
color2 = Paleta::Color.new(237, 172, 33)
|
76
|
+
palette1 = Paleta::Palette.new(color1, color2)
|
77
|
+
|
78
|
+
color3 = Paleta::Color.new(13, 57, 182)
|
79
|
+
color4 = Paleta::Color.new(94, 161, 235)
|
80
|
+
palette2 = Paleta::Palette.new(color3, color4)
|
81
|
+
|
82
|
+
palette1.similarity(palette2) # => 0.0046992695975874915
|
83
|
+
|
84
|
+
See the [documentation](http://rubydoc.info/gems/paleta/ "Documentation").
|
85
|
+
|
86
|
+
|
data/spec/models/color_spec.rb
CHANGED
@@ -56,4 +56,74 @@ describe Paleta::Color do
|
|
56
56
|
color.green.to_i.should == 195
|
57
57
|
color.blue.to_i.should == 178
|
58
58
|
end
|
59
|
+
|
60
|
+
it "should lighten by a percentage, " do
|
61
|
+
color = Paleta::Color.new(94, 161, 235)
|
62
|
+
lightness = color.lightness
|
63
|
+
color.lighten!
|
64
|
+
color.lightness.should == lightness + 5
|
65
|
+
lightness = color.lightness
|
66
|
+
color.lighten!(20)
|
67
|
+
color.lightness.should == lightness + 20
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should quietly maintain a maximum of 100 when lightening" do
|
71
|
+
color = Paleta::Color.new(94, 161, 235)
|
72
|
+
color.lighten!(300)
|
73
|
+
color.lightness.should == 100
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should darken by a percentage" do
|
77
|
+
color = Paleta::Color.new(94, 161, 235)
|
78
|
+
lightness = color.lightness
|
79
|
+
color.darken!
|
80
|
+
color.lightness.should == lightness - 5
|
81
|
+
lightness = color.lightness
|
82
|
+
color.darken!(20)
|
83
|
+
color.lightness.should == lightness - 20
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should quietly maintain a minimum of 0 when darkening" do
|
87
|
+
color = Paleta::Color.new(94, 161, 235)
|
88
|
+
color.darken!(300)
|
89
|
+
color.lightness.should == 0
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should invert" do
|
93
|
+
color = Paleta::Color.new(94, 161, 235)
|
94
|
+
color.invert!
|
95
|
+
color.red.should == 161
|
96
|
+
color.green.should == 94
|
97
|
+
color.blue.should == 20
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should calculate its similarity to another Color" do
|
101
|
+
color1 = Paleta::Color.new(94, 161, 235)
|
102
|
+
color2 = Paleta::Color.new(237, 172, 33)
|
103
|
+
color1.similarity(color2).round(5).should == 0.56091
|
104
|
+
|
105
|
+
color1 = Paleta::Color.new(237, 172, 33)
|
106
|
+
color2 = Paleta::Color.new(237, 172, 33)
|
107
|
+
color1.similarity(color2).should == 0
|
108
|
+
|
109
|
+
color1 = Paleta::Color.new(0, 0, 0)
|
110
|
+
color2 = Paleta::Color.new(255, 255, 255)
|
111
|
+
color1.similarity(color2).should == 1
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should maintain its HEX value" do
|
115
|
+
color = Paleta::Color.new(94, 161, 235)
|
116
|
+
color.hex.should == "5EA1EB"
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should update its HSB and RGB components when its HEX value is updated" do
|
120
|
+
color = Paleta::Color.new
|
121
|
+
color.hex = "ffffff"
|
122
|
+
color.red.should == 255
|
123
|
+
color.green.should == 255
|
124
|
+
color.blue.should == 255
|
125
|
+
color.hue.should == 0
|
126
|
+
color.saturation.should == 0
|
127
|
+
color.lightness.should == 100
|
128
|
+
end
|
59
129
|
end
|
data/spec/models/palette_spec.rb
CHANGED
@@ -28,4 +28,84 @@ describe Paleta::Palette do
|
|
28
28
|
palette[0].should == c1
|
29
29
|
palette[1].should be_nil
|
30
30
|
end
|
31
|
+
|
32
|
+
it "should lighten each color in a palette by a percentage" do
|
33
|
+
c1 = Paleta::Color.new(13, 57, 182)
|
34
|
+
c2 = Paleta::Color.new(94, 161, 235)
|
35
|
+
palette = Paleta::Palette.new(c1, c2)
|
36
|
+
lightness1 = c1.lightness
|
37
|
+
lightness2 = c2.lightness
|
38
|
+
percent = 20
|
39
|
+
palette.lighten!(percent)
|
40
|
+
palette[0].lightness.should == lightness1 + percent
|
41
|
+
palette[1].lightness.should == lightness2 + percent
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should darken each color in a palette by a percentage" do
|
45
|
+
c1 = Paleta::Color.new(13, 57, 182)
|
46
|
+
c2 = Paleta::Color.new(94, 161, 235)
|
47
|
+
palette = Paleta::Palette.new(c1, c2)
|
48
|
+
lightness1 = c1.lightness
|
49
|
+
lightness2 = c2.lightness
|
50
|
+
percent = 20
|
51
|
+
palette.darken!(percent)
|
52
|
+
palette[0].lightness.should == lightness1 - percent
|
53
|
+
palette[1].lightness.should == lightness2 - percent
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should invert each color in a palette" do
|
57
|
+
c1 = Paleta::Color.new(13, 57, 182)
|
58
|
+
c2 = Paleta::Color.new(94, 161, 235)
|
59
|
+
palette = Paleta::Palette.new(c1, c2)
|
60
|
+
palette.invert!
|
61
|
+
palette[0].red.should == 242
|
62
|
+
palette[0].green.should == 198
|
63
|
+
palette[0].blue.should == 73
|
64
|
+
palette[1].red.should == 161
|
65
|
+
palette[1].green.should == 94
|
66
|
+
palette[1].blue.should == 20
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should calculate a multiple regression over each Color in the Palette in RGB space" do
|
70
|
+
c1 = Paleta::Color.new(13, 57, 182)
|
71
|
+
c2 = Paleta::Color.new(94, 161, 235)
|
72
|
+
c3 = Paleta::Color.new(237, 172, 33)
|
73
|
+
palette = Paleta::Palette.new(c1, c2, c3)
|
74
|
+
r = palette.fit
|
75
|
+
r.slope[:r].should == 0.4632575855725132
|
76
|
+
r.slope[:g].should == -0.5730072013906133
|
77
|
+
r.slope[:b].should == 0.06837037037037037
|
78
|
+
r.offset[:r].should == 76.87979685435182
|
79
|
+
r.offset[:g].should == 224.49093618077973
|
80
|
+
r.offset[:b].should == 104.41111111111111
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should calculate its similarity to another Palette" do
|
84
|
+
c1 = Paleta::Color.new(0, 0, 0)
|
85
|
+
p1 = Paleta::Palette.new(c1)
|
86
|
+
|
87
|
+
c2 = Paleta::Color.new(255, 255, 255)
|
88
|
+
p2 = Paleta::Palette.new(c2)
|
89
|
+
|
90
|
+
p1.similarity(p2).should == 1
|
91
|
+
|
92
|
+
c3 = Paleta::Color.new(0, 0, 0)
|
93
|
+
c4 = Paleta::Color.new(255, 255, 255)
|
94
|
+
p3 = Paleta::Palette.new(c3, c4)
|
95
|
+
|
96
|
+
c5 = Paleta::Color.new(0, 0, 0)
|
97
|
+
c6 = Paleta::Color.new(255, 255, 255)
|
98
|
+
p4 = Paleta::Palette.new(c5, c6)
|
99
|
+
p3.similarity(p4).should == 0
|
100
|
+
|
101
|
+
|
102
|
+
c7 = Paleta::Color.new(13, 57, 182)
|
103
|
+
c8 = Paleta::Color.new(237, 172, 33)
|
104
|
+
p5 = Paleta::Palette.new(c7, c8)
|
105
|
+
|
106
|
+
c9 = Paleta::Color.new(13, 57, 182)
|
107
|
+
c10 = Paleta::Color.new(94, 161, 235)
|
108
|
+
p6 = Paleta::Palette.new(c9, c10)
|
109
|
+
p5.similarity(p6).round(5).should == 0.0047
|
110
|
+
end
|
31
111
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paleta
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,9 +9,9 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-01-
|
12
|
+
date: 2012-01-06 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
|
-
description: color
|
14
|
+
description: A gem for working with color palettes
|
15
15
|
email:
|
16
16
|
- iam@jordanstephens.net
|
17
17
|
executables: []
|
@@ -20,11 +20,14 @@ extra_rdoc_files: []
|
|
20
20
|
files:
|
21
21
|
- .gitignore
|
22
22
|
- Gemfile
|
23
|
+
- LICENSE
|
23
24
|
- lib/paleta.rb
|
24
25
|
- lib/paleta/color.rb
|
26
|
+
- lib/paleta/multiple_regression.rb
|
25
27
|
- lib/paleta/palette.rb
|
26
28
|
- lib/paleta/version.rb
|
27
29
|
- paleta.gemspec
|
30
|
+
- readme.markdown
|
28
31
|
- spec/models/color_spec.rb
|
29
32
|
- spec/models/palette_spec.rb
|
30
33
|
- spec/spec_helper.rb
|
@@ -51,7 +54,8 @@ rubyforge_project:
|
|
51
54
|
rubygems_version: 1.8.10
|
52
55
|
signing_key:
|
53
56
|
specification_version: 3
|
54
|
-
summary:
|
57
|
+
summary: A little library for creating, manipulating and comparing colors and color
|
58
|
+
palettes
|
55
59
|
test_files:
|
56
60
|
- spec/models/color_spec.rb
|
57
61
|
- spec/models/palette_spec.rb
|