colormath 0.1.0 → 0.1.1
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/README.md +42 -0
- data/lib/colormath.rb +1 -0
- data/lib/colormath/adjust.rb +39 -0
- data/lib/colormath/color/hsl.rb +3 -2
- data/lib/colormath/color/rgb.rb +1 -0
- data/lib/colormath/version.rb +1 -1
- data/test/adjust_test.rb +81 -0
- data/test/hsl_test.rb +2 -2
- data/test/rgb_test.rb +5 -0
- metadata +6 -3
data/README.md
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
ColorMath
|
2
|
+
=========
|
3
|
+
|
4
|
+
A simple Ruby library to perform operations on RGB and HSL colours.
|
5
|
+
|
6
|
+
Usage
|
7
|
+
-----
|
8
|
+
|
9
|
+
Instantiate an RGB (red, green, blue) colour:
|
10
|
+
|
11
|
+
orange = ColorMath::RGB.new(1.0, 0.5, 0)
|
12
|
+
|
13
|
+
Or from a hex value via a helper method:
|
14
|
+
|
15
|
+
white = ColorMath::hex_color("#fff")
|
16
|
+
blue = ColorMath::hex_color("#0000ff")
|
17
|
+
|
18
|
+
Instantiate an HSL (hue, saturation, luminance) colour:
|
19
|
+
|
20
|
+
pink = ColorMath::HSL.new(350, 1, 0.88)
|
21
|
+
|
22
|
+
Retrieve the RGB components of a colour:
|
23
|
+
|
24
|
+
pink.red # => 1.0
|
25
|
+
pink.green # => 0.76
|
26
|
+
pink.blue # => 0.8
|
27
|
+
|
28
|
+
Or the HSL components:
|
29
|
+
|
30
|
+
orange.hue # => 30.0
|
31
|
+
orange.saturation # => 1.0
|
32
|
+
orange.luminance # => 0.5
|
33
|
+
|
34
|
+
Combine two colours via an alpha blend, e.g. 30% orange on white:
|
35
|
+
|
36
|
+
combined = ColorMath::Blend.alpha(white, orange, 0.3)
|
37
|
+
|
38
|
+
Convert a colour to hexadecimal representation:
|
39
|
+
|
40
|
+
combined.hex # => "#ffd8b2"
|
41
|
+
|
42
|
+
That’s it. It only does the basics that I need for the job in hand, but it’s probably a good basis for extension.
|
data/lib/colormath.rb
CHANGED
@@ -0,0 +1,39 @@
|
|
1
|
+
module ColorMath
|
2
|
+
|
3
|
+
# Adjust parameters of a colour
|
4
|
+
#
|
5
|
+
module Adjust
|
6
|
+
|
7
|
+
# Rotate the hue by delta degrees in either direction
|
8
|
+
def hue(color, delta)
|
9
|
+
HSL.new(color.hue + delta, color.saturation, color.luminance)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Adjust the saturation by delta, stopping at 0 or 1
|
13
|
+
def saturation(color, delta)
|
14
|
+
HSL.new(color.hue, color.saturation + delta, color.luminance)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Adjust the luminance by delta, stopping at 0 or 1
|
18
|
+
def luminance(color, delta)
|
19
|
+
HSL.new(color.hue, color.saturation, color.luminance + delta)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Adjust the red component by delta, stopping at 0 or 1
|
23
|
+
def red(color, delta)
|
24
|
+
RGB.new(color.red + delta, color.green, color.blue)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Adjust the green component by delta, stopping at 0 or 1
|
28
|
+
def green(color, delta)
|
29
|
+
RGB.new(color.red, color.green + delta, color.blue)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Adjust the blue component by delta, stopping at 0 or 1
|
33
|
+
def blue(color, delta)
|
34
|
+
RGB.new(color.red, color.green, color.blue + delta)
|
35
|
+
end
|
36
|
+
|
37
|
+
extend self
|
38
|
+
end
|
39
|
+
end
|
data/lib/colormath/color/hsl.rb
CHANGED
@@ -12,10 +12,11 @@ module ColorMath
|
|
12
12
|
# 0 <= s <= 1
|
13
13
|
# 0 <= l <= 1
|
14
14
|
#
|
15
|
-
#
|
15
|
+
# Saturation and luminance values outside these ranges will be clipped.
|
16
|
+
# Hue values will be mapped to a circle, so that e.g. -20 becomes 340.
|
16
17
|
#
|
17
18
|
def initialize(h, s, l)
|
18
|
-
@hue =
|
19
|
+
@hue = h % 360
|
19
20
|
@saturation = force_range(s, 0, 1).to_f
|
20
21
|
@luminance = force_range(l, 0, 1).to_f
|
21
22
|
end
|
data/lib/colormath/color/rgb.rb
CHANGED
data/lib/colormath/version.rb
CHANGED
data/test/adjust_test.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
2
|
+
require "test/unit"
|
3
|
+
require "shoulda"
|
4
|
+
require "colormath"
|
5
|
+
|
6
|
+
class AdjustmentTest < Test::Unit::TestCase
|
7
|
+
include ColorMath
|
8
|
+
EPSILON = 1e-3
|
9
|
+
|
10
|
+
context "in the HSL space" do
|
11
|
+
should "rotate hue" do
|
12
|
+
c = HSL.new(180, 0.5, 0.5)
|
13
|
+
assert_equal 120, Adjust.hue(c, -60).hue
|
14
|
+
assert_equal 340, Adjust.hue(c, -200).hue
|
15
|
+
assert_equal 240, Adjust.hue(c, 60).hue
|
16
|
+
assert_equal 20, Adjust.hue(c, 200).hue
|
17
|
+
end
|
18
|
+
|
19
|
+
should "adjust saturation" do
|
20
|
+
c = HSL.new(180, 0.5, 0.5)
|
21
|
+
assert_in_delta 0.2, Adjust.saturation(c, -0.3).saturation, EPSILON
|
22
|
+
assert_in_delta 0.0, Adjust.saturation(c, -0.6).saturation, EPSILON
|
23
|
+
assert_in_delta 0.8, Adjust.saturation(c, 0.3).saturation, EPSILON
|
24
|
+
assert_in_delta 1.0, Adjust.saturation(c, 0.6).saturation, EPSILON
|
25
|
+
end
|
26
|
+
|
27
|
+
should "adjust luminance" do
|
28
|
+
c = HSL.new(180, 0.5, 0.5)
|
29
|
+
assert_in_delta 0.2, Adjust.luminance(c, -0.3).luminance, EPSILON
|
30
|
+
assert_in_delta 0.0, Adjust.luminance(c, -0.6).luminance, EPSILON
|
31
|
+
assert_in_delta 0.8, Adjust.luminance(c, 0.3).luminance, EPSILON
|
32
|
+
assert_in_delta 1.0, Adjust.luminance(c, 0.6).luminance, EPSILON
|
33
|
+
end
|
34
|
+
|
35
|
+
should "not affect unrelated parameters" do
|
36
|
+
c = HSL.new(180, 0.4, 0.6)
|
37
|
+
assert_in_delta 180, Adjust.saturation(c, -0.3).hue, EPSILON
|
38
|
+
assert_in_delta 180, Adjust.luminance(c, -0.3).hue, EPSILON
|
39
|
+
assert_in_delta 0.4, Adjust.hue(c, -20).saturation, EPSILON
|
40
|
+
assert_in_delta 0.4, Adjust.luminance(c, -0.3).saturation, EPSILON
|
41
|
+
assert_in_delta 0.6, Adjust.hue(c, -20).luminance, EPSILON
|
42
|
+
assert_in_delta 0.6, Adjust.saturation(c, -0.3).luminance, EPSILON
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "in the RGB space" do
|
47
|
+
should "adjust red" do
|
48
|
+
c = RGB.new(0.5, 0.3, 0.4)
|
49
|
+
assert_in_delta 0.2, Adjust.red(c, -0.3).red, EPSILON
|
50
|
+
assert_in_delta 0.0, Adjust.red(c, -0.6).red, EPSILON
|
51
|
+
assert_in_delta 0.8, Adjust.red(c, 0.3).red, EPSILON
|
52
|
+
assert_in_delta 1.0, Adjust.red(c, 0.6).red, EPSILON
|
53
|
+
end
|
54
|
+
|
55
|
+
should "adjust green" do
|
56
|
+
c = RGB.new(0.3, 0.5, 0.4)
|
57
|
+
assert_in_delta 0.2, Adjust.green(c, -0.3).green, EPSILON
|
58
|
+
assert_in_delta 0.0, Adjust.green(c, -0.6).green, EPSILON
|
59
|
+
assert_in_delta 0.8, Adjust.green(c, 0.3).green, EPSILON
|
60
|
+
assert_in_delta 1.0, Adjust.green(c, 0.6).green, EPSILON
|
61
|
+
end
|
62
|
+
|
63
|
+
should "adjust blue" do
|
64
|
+
c = RGB.new(0.3, 0.4, 0.5)
|
65
|
+
assert_in_delta 0.2, Adjust.blue(c, -0.3).blue, EPSILON
|
66
|
+
assert_in_delta 0.0, Adjust.blue(c, -0.6).blue, EPSILON
|
67
|
+
assert_in_delta 0.8, Adjust.blue(c, 0.3).blue, EPSILON
|
68
|
+
assert_in_delta 1.0, Adjust.blue(c, 0.6).blue, EPSILON
|
69
|
+
end
|
70
|
+
|
71
|
+
should "not affect unrelated parameters" do
|
72
|
+
c = RGB.new(0.3, 0.4, 0.5)
|
73
|
+
assert_in_delta 0.3, Adjust.green(c, -0.3).red, EPSILON
|
74
|
+
assert_in_delta 0.3, Adjust.blue(c, -0.3).red, EPSILON
|
75
|
+
assert_in_delta 0.4, Adjust.red(c, -0.3).green, EPSILON
|
76
|
+
assert_in_delta 0.4, Adjust.blue(c, -0.3).green, EPSILON
|
77
|
+
assert_in_delta 0.5, Adjust.red(c, -0.3).blue, EPSILON
|
78
|
+
assert_in_delta 0.5, Adjust.green(c, -0.3).blue, EPSILON
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/test/hsl_test.rb
CHANGED
@@ -14,12 +14,12 @@ class HSLTest < Test::Unit::TestCase
|
|
14
14
|
|
15
15
|
should "force hue >= 0" do
|
16
16
|
c = ColorMath::HSL.new(-2, 0, 0)
|
17
|
-
assert_equal
|
17
|
+
assert_equal 358, c.hue
|
18
18
|
end
|
19
19
|
|
20
20
|
should "force hue <= 360" do
|
21
21
|
c = ColorMath::HSL.new(361, 0, 0)
|
22
|
-
assert_equal
|
22
|
+
assert_equal 1, c.hue
|
23
23
|
end
|
24
24
|
|
25
25
|
should "force saturation >= 0" do
|
data/test/rgb_test.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: colormath
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Battley
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-12-03 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -31,11 +31,14 @@ extensions: []
|
|
31
31
|
extra_rdoc_files: []
|
32
32
|
|
33
33
|
files:
|
34
|
+
- README.md
|
35
|
+
- test/adjust_test.rb
|
34
36
|
- test/blend_test.rb
|
35
37
|
- test/conversion_test.rb
|
36
38
|
- test/hex_decoding_test.rb
|
37
39
|
- test/hsl_test.rb
|
38
40
|
- test/rgb_test.rb
|
41
|
+
- lib/colormath/adjust.rb
|
39
42
|
- lib/colormath/blend.rb
|
40
43
|
- lib/colormath/color/hsl.rb
|
41
44
|
- lib/colormath/color/rgb.rb
|
@@ -66,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
66
69
|
requirements: []
|
67
70
|
|
68
71
|
rubyforge_project:
|
69
|
-
rubygems_version: 1.3.
|
72
|
+
rubygems_version: 1.3.5
|
70
73
|
signing_key:
|
71
74
|
specification_version: 3
|
72
75
|
summary: Colour manipulation library for Ruby
|