paleta 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|