color-generator 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -10,7 +10,18 @@ If you are using these colors as background colors, consistent lightness lets yo
10
10
  ## Usage
11
11
 
12
12
  require 'color-generator'
13
- generator = ColorGenerator.new 0.3, 1.0
13
+
14
+ Generate colors using the HSL color representation:
15
+
16
+ generator = ColorGenerator.new saturation: 0.3, lightness: 0.75
17
+ color1 = generator.create
18
+ # => "cfd2ac"
19
+ color2 = generator.create
20
+ # => "cbacd2"
21
+
22
+ Generate colors using the HSV color representation:
23
+
24
+ generator = ColorGenerator.new saturation: 0.3, value: 1.0
14
25
  color1 = generator.create
15
26
  # => "f7b3ff"
16
27
  color2 = generator.create
@@ -1,25 +1,61 @@
1
1
  class ColorGenerator
2
2
  GOLDEN_RATIO_CONJUGATE = 0.618033988749895
3
3
 
4
- attr_reader :hue, :saturation, :value
4
+ attr_reader :mode, :hue, :saturation, :lightness, :value
5
5
 
6
6
  # Initializes a color generator.
7
7
  #
8
- # @param [Float,Integer] saturation saturation in the interval [0, 1]
9
- # @param [Float,Integer] value value in the interval [0, 1]
10
- def initialize(saturation, value)
11
- @hue = rand
12
- @saturation = saturation.to_f
13
- @value = value.to_f
8
+ # @param [Hash] opts optional arguments
9
+ # @option opts [Float,Integer] :saturation saturation in the interval [0, 1]
10
+ # @option opts [Float,Integer] :lightness lightness in the interval [0, 1],
11
+ # sets the color representation to HSL
12
+ # @option opts [Float,Integer] :value value in the interval [0, 1], sets the
13
+ # color representation to HSV
14
+ def initialize(opts = {})
15
+ @hue = rand
16
+ @saturation = opts[:saturation].to_f
17
+ if opts.has_key? :lightness
18
+ @mode = :HSL
19
+ @lightness = opts[:lightness].to_f
20
+ else
21
+ @mode = :HSV
22
+ @value = opts[:value].to_f
23
+ end
14
24
  end
15
25
 
16
26
  # Generates a random color.
17
27
  #
18
28
  # @return [String] an RGB hex triplet
19
29
  def create
20
- @hue += GOLDEN_RATIO_CONJUGATE
21
- @hue %= 1
22
- '%02x%02x%02x' % self.class.rgb_from_hsv(hue, saturation, value)
30
+ @hue = (hue + GOLDEN_RATIO_CONJUGATE) % 1
31
+ color = if hsl?
32
+ self.class.rgb_from_hsl hue, saturation, lightness
33
+ else
34
+ self.class.rgb_from_hsv hue, saturation, value
35
+ end
36
+ '%02x%02x%02x' % color
37
+ end
38
+
39
+ # @return [Boolean] whether the color representation is HSL
40
+ def hsl?
41
+ mode == :HSL
42
+ end
43
+
44
+ # @return [Boolean] whether the color representation is HSV
45
+ def hsv?
46
+ mode == :HSV
47
+ end
48
+
49
+ # Converts a color from HSL to RGB.
50
+ #
51
+ # @param [Float] h hue in the interval [0, 1]
52
+ # @param [Float] s saturation in the interval [0, 1]
53
+ # @param [Float] l lightness in the interval [0, 1]
54
+ # @return [Array] an RGB decimal triplet
55
+ def self.rgb_from_hsl(h, s, l)
56
+ c = (1 - (2 * l - 1).abs) * s
57
+ m = l - 0.5 * c
58
+ rgb_from_hsl_or_hsv h, c, m
23
59
  end
24
60
 
25
61
  # Converts a color from HSV to RGB.
@@ -28,48 +64,37 @@ class ColorGenerator
28
64
  # @param [Float] s saturation in the interval [0, 1]
29
65
  # @param [Float] v value in the interval [0, 1]
30
66
  # @return [Array] an RGB decimal triplet
31
- #
32
- # @see http://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB
33
67
  def self.rgb_from_hsv(h, s, v)
34
68
  c = v * s
35
69
  m = v - c
70
+ rgb_from_hsl_or_hsv h, c, m
71
+ end
72
+
73
+ private
74
+
75
+ # @param [Float] h hue in the interval [0, 1]
76
+ # @param [Float] c chroma
77
+ # @param [Float] m
78
+ # @return [Array] an RGB decimal triplet
79
+ #
80
+ # @see http://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB
81
+ def self.rgb_from_hsl_or_hsv(h, c, m)
36
82
  h_prime = h * 6
37
- x_prime = v - c * (h_prime % 2 - 1).abs
83
+ x = c * (1 - (h_prime % 2 - 1).abs)
38
84
 
39
- # Unlike the Wikipedia article, we add m right away. This reduces the
40
- # number of operations to perform. For example, for H' < 1:
41
- #
42
- # R = R1 + m
43
- # R = C + m
44
- # R = C + V - C
45
- # R = V
46
- #
47
- # G = G1 + m
48
- # G = X + m
49
- # G = C (1 - |H' mod 2 - 1|) + m
50
- # G = C (1 - |H' mod 2 - 1|) + V - C
51
- # G = C - C |H' mod 2 - 1| + V - C
52
- # G = V - C |H' mod 2 - 1|
53
- #
54
- # B = B1 + m
55
- # B = 0 + m
56
- # B = m
57
- #
58
- # The blog post above calculates two X values, for when H' mod 2 is
59
- # greater or less than 1.
60
85
  case h_prime.to_i
61
86
  when 0 # 0 <= H' < 1
62
- [v, x_prime, m]
87
+ [c, x, 0]
63
88
  when 1 # 1 <= H' < 2
64
- [x_prime, v, m]
89
+ [x, c, 0]
65
90
  when 2 # 2 <= H' < 3
66
- [m, v, x_prime]
91
+ [0, c, x]
67
92
  when 3 # 3 <= H' < 4
68
- [m, x_prime, v]
93
+ [0, x, c]
69
94
  when 4 # 4 <= H' < 5
70
- [x_prime, m, v]
95
+ [x, 0, c]
71
96
  else # 5 <= H' < 6
72
- [v, m, x_prime]
73
- end.map{|value| (value * 255).round}
97
+ [c, 0, x]
98
+ end.map{|value| ((value + m) * 255).round}
74
99
  end
75
100
  end
@@ -1,3 +1,3 @@
1
1
  module ColorGenerator
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: color-generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: