redgreenblue 0.6.0 → 0.7.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1cac7c885ca1de3e3fe22ebfaf7207dd17b7bd25e8c1dd6f82cfdab0e0b5cee1
4
- data.tar.gz: 7ca71212d78ae2a638d8bfb54dcb8a824367eac6e7fe8ca1eaa1e239b22bbaa9
3
+ metadata.gz: 9dea62bd74822100097e661284f2d44164a1be23ee0f81acdc778c182f0939ec
4
+ data.tar.gz: baa4c5ab0b3a367841ee18d94131ad4077661d515edb29939ed661175b479ee1
5
5
  SHA512:
6
- metadata.gz: 23316f3526690807fabde09d5a909ae7afe396da7b039baa6352c814ab653d02ee5646aa23ece364748cf090f4b9218a34c0cd19b8a04313086b2c5f9dcadf97
7
- data.tar.gz: 19f71a26312a83d845f8ff508758e653b693289be129e02281e65cb8da4b13d32ab5b58282883ea0d0dc4c156ddd775c0179354bea5dccc6065f00ad49b7f66c
6
+ metadata.gz: 81808e69a0aadb6ea54cb291fd682c1949e2178df1c31954256167552f12b990ef825561689a958cb533144c25d31852785ebcebe9d07ddb5684b3b0dfcd26ba
7
+ data.tar.gz: 62370184d5b291081bd8e7a1f698647d961fd4c98525677821950f59e58e5536473d5f4c0e87da53109866e875caf94fc578fdf14d4de602d50fd0085d4fe6d9
data/lib/redgreenblue.rb CHANGED
@@ -9,6 +9,8 @@ require 'redgreenblue/24bit'
9
9
  require 'redgreenblue/48bit'
10
10
  require 'redgreenblue/hex'
11
11
 
12
+ require 'redgreenblue/hsl_hsv'
13
+
12
14
  require 'redgreenblue/lazy'
13
15
  require 'redgreenblue/nice'
14
16
 
@@ -2,43 +2,50 @@ class RGB
2
2
 
3
3
  # r, g, b methods
4
4
 
5
+ # Returns the red component as an integer in the range 0..255 (an 8-bit value).
5
6
  def r
6
7
  (red * 255).round
7
8
  end
8
9
 
10
+ # Returns the green component as an integer in the range 0..255 (an 8-bit value).
9
11
  def g
10
12
  (green * 255).round
11
13
  end
12
14
 
15
+ # Returns the blue component as an integer in the range 0..255 (an 8-bit value).
13
16
  def b
14
17
  (blue * 255).round
15
18
  end
16
19
 
20
+ # Sets the red component using an integer in the range 0..255 (an 8-bit value).
17
21
  def r=(n)
18
22
  self.red = n / 255.0
19
23
  end
20
24
 
25
+ # Sets the green component using an integer in the range 0..255 (an 8-bit value).
21
26
  def g=(n)
22
27
  self.green = n / 255.0
23
28
  end
24
29
 
30
+ # Sets the blue component using an integer in the range 0..255 (an 8-bit value).
25
31
  def b=(n)
26
32
  self.blue = n / 255.0
27
33
  end
28
34
 
29
35
  # rgb methods
30
36
 
37
+ # Returns the red, green, and blue components as integers in the range 0..255 (three 8-bit values).
31
38
  def rgb
32
39
  [r,g,b]
33
40
  end
34
41
 
35
- def rgb=(rgb)
36
- self.r, self.g, self.b = rgb
42
+ # Sets the red, green, and blue components using three integers in the range 0..255 (three 8-bit values).
43
+ def rgb=(*rgb)
44
+ self.r, self.g, self.b = rgb.flatten
37
45
  end
38
46
 
39
- # factory method
40
-
41
- def self.rgb(rgb)
47
+ # Creates a new object from red, green, and blue components as integers in the range 0..255 (three 8-bit values).
48
+ def self.rgb(*rgb)
42
49
  c = self.new
43
50
  c.rgb = rgb
44
51
  c
@@ -2,43 +2,50 @@ class RGB
2
2
 
3
3
  # rr, gg, bb methods
4
4
 
5
+ # Returns the red component as an integer in the range 0..65535 (a 16-bit value).
5
6
  def rr
6
7
  (red * 65535).round
7
8
  end
8
9
 
10
+ # Returns the green component as an integer in the range 0..65535 (a 16-bit value).
9
11
  def gg
10
12
  (green * 65535).round
11
13
  end
12
14
 
15
+ # Returns the blue component as an integer in the range 0..65535 (a 16-bit value).
13
16
  def bb
14
17
  (blue * 65535).round
15
18
  end
16
19
 
20
+ # Sets the red component using an integer in the range 0..65535 (a 16-bit value).
17
21
  def rr=(n)
18
22
  self.red = n / 65535.0
19
23
  end
20
24
 
25
+ # Sets the green component using an integer in the range 0..65535 (a 16-bit value).
21
26
  def gg=(n)
22
27
  self.green = n / 65535.0
23
28
  end
24
29
 
30
+ # Sets the blue component using an integer in the range 0..65535 (a 16-bit value).
25
31
  def bb=(n)
26
32
  self.blue = n / 65535.0
27
33
  end
28
34
 
29
35
  # rrggbb methods
30
36
 
37
+ # Returns the red, green, and blue components as integers in the range 0..65535 (three 16-bit values).
31
38
  def rrggbb
32
39
  [rr,gg,bb]
33
40
  end
34
41
 
35
- def rrggbb=(rrggbb)
36
- self.rr, self.gg, self.bb = rrggbb
42
+ # Sets the red, green, and blue components using three integers in the range 0..65535 (three 16-bit values).
43
+ def rrggbb=(*rrggbb)
44
+ self.rr, self.gg, self.bb = rrggbb.flatten
37
45
  end
38
46
 
39
- # factory method
40
-
41
- def self.rrggbb(rrggbb)
47
+ # Creates a new object from red, green, and blue components as integers in the range 0..65535 (three 16-bit values).
48
+ def self.rrggbb(*rrggbb)
42
49
  c = self.new
43
50
  c.rrggbb = rrggbb
44
51
  c
@@ -2,8 +2,8 @@ class RGB
2
2
 
3
3
  attr_reader :red, :green, :blue
4
4
 
5
- def initialize(a=[0.5, 0.5, 0.5])
6
- self.values = a
5
+ def initialize(*a)
6
+ self.values = a.any? ? a : [ 0.5, 0.5, 0.5 ]
7
7
  end
8
8
 
9
9
  def red=(n)
@@ -24,8 +24,22 @@ class RGB
24
24
 
25
25
  alias to_a values
26
26
 
27
- def values=(a)
28
- self.red, self.green, self.blue = a
27
+ def values=(*a)
28
+ self.red, self.green, self.blue = a.flatten
29
+ end
30
+
31
+ # Returns true if this object and an other object represent exactly the same color. Otherwise returns false.
32
+ def ==(other)
33
+ ( self.class == other.class ) && ( self.values == other.values )
34
+ end
35
+
36
+ # Returns a sorted hash of 3 key/value pairs
37
+ # for red, green and blue,
38
+ # sorted in order of decreasing value
39
+ def to_h
40
+ ([:red, :green, :blue].zip values).sort_by {
41
+ |k,v| [-v,[:red, :green, :blue].index(k)]
42
+ }.to_h
29
43
  end
30
44
 
31
45
  private
@@ -1,15 +1,16 @@
1
1
  class RGB
2
2
 
3
- # Return a 1-pixel GIF
3
+ # Returns a 1-pixel GIF image set to the color.
4
4
  #
5
5
  # With help from:
6
- # - http://www.perlmonks.org/?node_id=7974
6
+ # - https://www.perlmonks.org/?node_id=7974
7
7
  def gif_pixel
8
8
  "GIF89a\1\0\1\0\x90\0\0".b +
9
9
  rgb.pack('C3') +
10
10
  "\0\0\0,\0\0\0\0\1\0\1\0\0\x02\x02\x04\1\0;".b
11
11
  end
12
12
 
13
+ # Writes a 1-pixel GIF image to a file.
13
14
  def gif_pixel_write(file_path)
14
15
  File.binwrite(file_path, gif_pixel)
15
16
  end
@@ -0,0 +1,59 @@
1
+ class RGB
2
+
3
+ # Returns color as HSL:
4
+ # hue (0..360), saturation (0..1), lightness (0..1).
5
+ # When saturation is 0, hue is nil.
6
+ def hsl
7
+ hsl_hsv_c[0]
8
+ end
9
+
10
+ # Returns color as HSV:
11
+ # hue (0..360), saturation (0..1), value (0..1).
12
+ # When saturation is 0, hue is nil.
13
+ #
14
+ # #hsb is an alias for #hsv.
15
+ def hsv
16
+ hsl_hsv_c[1]
17
+ end
18
+
19
+ alias hsb hsv
20
+
21
+ private
22
+
23
+ # Compute HSL, HSV, and chroma.
24
+ # With help from:
25
+ # - https://en.wikipedia.org/wiki/HSL_and_HSV
26
+ def hsl_hsv_c
27
+ sorted_hash = to_h
28
+ min, max = sorted_hash.values.values_at(2,0)
29
+
30
+ chroma = max - min
31
+
32
+ hue =
33
+ if chroma == 0
34
+ nil
35
+ else
36
+ case sorted_hash.keys.first
37
+ when :red
38
+ 60 * ( ( ( green - blue ) / chroma ).modulo 6 )
39
+ when :green
40
+ 60 * ( ( blue - red ) / chroma + 2 )
41
+ when :blue
42
+ 60 * ( ( red - green ) / chroma + 4 )
43
+ end
44
+ end
45
+
46
+ lightness = ( min + max ) / 2.0
47
+
48
+ saturation_hsl =
49
+ chroma == 0 ? 0.0 : ( chroma / ( 1 - (2 * lightness - 1).abs ) ).round(9)
50
+
51
+ value = max
52
+
53
+ saturation_hsv =
54
+ value == 0 ? 0.0 : chroma / value
55
+
56
+ [ [hue, saturation_hsl, lightness], [hue, saturation_hsv, value], chroma ]
57
+ end
58
+
59
+ end
@@ -1,11 +1,38 @@
1
1
  class RGB
2
2
 
3
+ # Creates a white RGB object.
3
4
  def self.white
4
- new([1,1,1])
5
+ new(1,1,1)
5
6
  end
6
7
 
8
+ # Creates a black RGB object.
7
9
  def self.black
8
- new([0,0,0])
10
+ new(0,0,0)
11
+ end
12
+
13
+ # Creates a grey RGB object. Defaults to lightness 0.5, a middle grey. Black equals grey(0), white equals grey(1).
14
+ #
15
+ # ::gray is an alias for ::grey.
16
+ def self.grey(lightness=0.5)
17
+ new(lightness, lightness, lightness)
18
+ end
19
+
20
+ # Alias gray for grey.
21
+ self.singleton_class.send(:alias_method, :gray, :grey)
22
+
23
+ # Creates a pure red RGB object.
24
+ def self.red
25
+ new(1,0,0)
26
+ end
27
+
28
+ # Creates a pure green RGB object.
29
+ def self.green
30
+ new(0,1,0)
31
+ end
32
+
33
+ # Creates a pure blue RGB object.
34
+ def self.blue
35
+ new(0,0,1)
9
36
  end
10
37
 
11
38
  end
@@ -4,4 +4,6 @@ class RGB
4
4
  "RGB ##{hex} (red=%1.5f green=%1.5f blue=%1.5f)" % [red, green, blue]
5
5
  end
6
6
 
7
+ alias to_s inspect
8
+
7
9
  end
@@ -0,0 +1,35 @@
1
+ class RGB
2
+
3
+ # Returns the arguments required by the Philips Hue API to set a light to this RGB object's hue, saturation and brightness (HSB).
4
+ #
5
+ # When formatted as JSON, this hash can be used
6
+ # directly to set a light's state.
7
+ def to_philips_hue_api_hsb_arguments(black_off=true)
8
+ my_hsb = hsb
9
+
10
+ # Black means 'off'
11
+ if black_off and ( my_hsb[2] == 0 )
12
+ { 'on' => false }
13
+
14
+ else
15
+ {
16
+
17
+ # On/Off state of the light
18
+ 'on' => true,
19
+
20
+ # Brightness 1..254
21
+ # Note: a brightness of 1 will not switch the light off
22
+ 'bri' => ( my_hsb[2] * 253 + 1 ).round,
23
+
24
+ # Hue 0..65535
25
+ 'hue' => (( my_hsb[0] || 0 ) * 65535 / 360 ).round,
26
+
27
+ # Saturation 0..254
28
+ 'sat' => ( my_hsb[1] * 254 ).round
29
+
30
+ }
31
+
32
+ end
33
+ end
34
+
35
+ end
@@ -1,5 +1,6 @@
1
1
  class RGB
2
2
 
3
+ # Shows the Mac OS color picker to choose a color for the RGB object.
3
4
  def pick
4
5
  result = RGB.mac_choose(rrggbb)
5
6
  if result
@@ -7,10 +8,10 @@ class RGB
7
8
  end
8
9
  end
9
10
 
10
- # factory method
11
-
12
- def self.pick
13
- result = RGB.mac_choose(RGB.new.rrggbb)
11
+ # Shows the Mac OS color picker and creates an RGB object with the chosen color.
12
+ # If no default color is specified, the picker defaults to a middle grey.
13
+ def self.pick(default_color=RGB.new)
14
+ result = RGB.mac_choose(default_color.rrggbb)
14
15
  if result
15
16
  RGB.rrggbb result
16
17
  else
@@ -20,11 +21,14 @@ class RGB
20
21
 
21
22
  private
22
23
 
23
- # Use Applescript to call color picker on Mac.
24
- # - requires a 48-bit RGB triplet [rr, gg, bb] for default choice.
25
- #
26
- # - Returns nil when <cancel> is clicked or <esc> key hit.
27
- # - Otherwise returns 48-bit RGB triplet [rr, gg, bb].
24
+ # Uses Applescript to call the color picker on Mac OS.
25
+ # - requires a 48-bit RGB triplet [rr, gg, bb] for default choice.
26
+ #
27
+ # - Returns nil when <cancel> is clicked or <esc> key hit.
28
+ # - Otherwise returns 48-bit RGB triplet [rr, gg, bb].
29
+ #
30
+ # Applescript command documented here:
31
+ # Standard Additions -> User Interaction -> choose color
28
32
  def self.mac_choose(color)
29
33
 
30
34
  script = <<~ENDSCRIPT
@@ -1,17 +1,20 @@
1
1
  class RGB
2
2
 
3
+ # Shuffles the object's red, green, and blue values.
3
4
  def shuffle!
4
- self.red, self.green, self.blue = [red, green, blue].shuffle
5
+ self.values = values.shuffle
5
6
  self
6
7
  end
7
8
 
9
+ # Assigns random values to red, green, and blue.
8
10
  def randomize!
9
- self.red, self.green, self.blue = Kernel::rand, Kernel::rand, Kernel::rand
11
+ self.values = Kernel::rand, Kernel::rand, Kernel::rand
10
12
  self
11
13
  end
12
14
 
15
+ # Creates a new RGB object with random red, green, and blue values.
13
16
  def self.rand
14
- new([Kernel::rand, Kernel::rand, Kernel::rand])
17
+ new(Kernel::rand, Kernel::rand, Kernel::rand)
15
18
  end
16
19
 
17
20
  end
@@ -1,25 +1,29 @@
1
1
  class RGB
2
2
 
3
+ # Returns the color in 16-bit RGB565 format.
3
4
  def rgb565
4
5
  [((r >> 3) << 11) + ((g >> 2) << 5) + (b >> 3)].pack 'S<'
5
6
  end
6
7
 
7
- # https://stackoverflow.com/questions/2442576/
8
- def rgb565=(s)
9
- v = ( s.unpack "S<" )[0]
8
+ # Sets the color from 16-bit RGB565 data.
9
+ # With help from:
10
+ # - https://stackoverflow.com/questions/2442576/
11
+ def rgb565=(rgb565_string)
12
+ v = ( rgb565_string.unpack "S<" )[0]
10
13
  self.r = ( ( v & 0xf800 ) >> 11 ) << 3
11
14
  self.g = ( ( v & 0x07e0 ) >> 5 ) << 2
12
15
  self.b = ( ( v & 0x001f ) ) << 3
13
16
  end
14
17
 
18
+ # Returns the color in 16-bit RGB565 format as a string of 0's and 1's
15
19
  def rgb565_binary
16
20
  rgb565.bytes.reverse.map { |b| "%08b" % b }.join
17
21
  end
18
22
 
19
- # factory method
20
- def self.rgb565(s)
23
+ # Creates a new RGB color from 16-bit RGB565 data.
24
+ def self.rgb565(rgb565_string)
21
25
  c = self.new
22
- c.rgb565 = s
26
+ c.rgb565 = rgb565_string
23
27
  c
24
28
  end
25
29
 
@@ -1,3 +1,3 @@
1
1
  class RGB
2
- VERSION = '0.6.0'
2
+ VERSION = '0.7.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redgreenblue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - lllist.eu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-24 00:00:00.000000000 Z
11
+ date: 2019-11-11 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -23,9 +23,11 @@ files:
23
23
  - lib/redgreenblue/bgr24bit.rb
24
24
  - lib/redgreenblue/gif.rb
25
25
  - lib/redgreenblue/hex.rb
26
+ - lib/redgreenblue/hsl_hsv.rb
26
27
  - lib/redgreenblue/lazy.rb
27
28
  - lib/redgreenblue/misc.rb
28
29
  - lib/redgreenblue/nice.rb
30
+ - lib/redgreenblue/opt/philipshue.rb
29
31
  - lib/redgreenblue/os.rb
30
32
  - lib/redgreenblue/os/mac.rb
31
33
  - lib/redgreenblue/random.rb
@@ -53,5 +55,5 @@ requirements: []
53
55
  rubygems_version: 3.0.3
54
56
  signing_key:
55
57
  specification_version: 4
56
- summary: RGB colors for Ruby
58
+ summary: A simple Ruby library for handling RGB colors
57
59
  test_files: []