redgreenblue 0.10.0 → 0.11.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: bb9542466d29c9ddcec8d53f6a374c228cc39f22b8d17e4c7c5b93f4f6095821
4
- data.tar.gz: 53b0e22ef0143e5110fc33d6f0cd68615a5b9931c1cd31a790dfc08adc9f2198
3
+ metadata.gz: dc4e866d75637857fb5a4b27b77829e20f488e321fa287b73a5d6d9c21d194a9
4
+ data.tar.gz: e3f9e875b0a8893bd21a6cd503702881833f54873557f84c4cf4776338294668
5
5
  SHA512:
6
- metadata.gz: dd97d2edb6a6503c99aa1ee055297d2dcfa21a330234b3c6fb01cf2551cad6ca5c7796103c94d99a7ba51ee33547f508551e3e4376029243eccbd77199b5ddde
7
- data.tar.gz: 3b7e6ca19d6c3ee4aafda566cd4187c735e4af0d59f2a2ee09f7e7602a7efb2359c8adaed08eb14c2af9e36c254e299bcbb253cea8755b5b8ead7f8dc7816541
6
+ metadata.gz: 94b96125e65443d7ceb66cfabf9ba6b0681bfc51046b8d308e86d0904a58a7f745f6ea159a040ee79dcb9713ace9adbc416a5705c4b2ebb85333bf09f0dd9a43
7
+ data.tar.gz: f3e0bd4c0cdcd432dd50fc518f1d2062c66ac907f55b3235405589b2d797791c48b3d62284ae665a8fc4d60c4209ce0b3d46d07a459e15d2fa261d9b1aa8df1d
@@ -1,33 +1,26 @@
1
1
  class RGB
2
2
  end
3
3
 
4
- require 'redgreenblue/version'
4
+ %w(
5
5
 
6
- require 'redgreenblue/base'
6
+ version
7
7
 
8
- require 'redgreenblue/24bit'
9
- require 'redgreenblue/48bit'
10
- require 'redgreenblue/hex'
11
- require 'redgreenblue/int'
8
+ base
12
9
 
13
- require 'redgreenblue/hsl'
14
- require 'redgreenblue/hsv'
15
- require 'redgreenblue/hsb'
10
+ 24bit 48bit hex int
16
11
 
17
- require 'redgreenblue/gamma'
18
- require 'redgreenblue/cie'
12
+ hsl hsv hsb
19
13
 
20
- require 'redgreenblue/inspect'
21
- require 'redgreenblue/lazy'
14
+ ostwald
22
15
 
23
- require 'redgreenblue/rgb565'
24
- require 'redgreenblue/bgr24bit'
25
- require 'redgreenblue/gif'
26
- require 'redgreenblue/terminal'
27
- require 'redgreenblue/web'
16
+ gamma cie
28
17
 
29
- require 'redgreenblue/mix'
30
- require 'redgreenblue/misc'
31
- require 'redgreenblue/random'
18
+ inspect lazy
32
19
 
33
- require 'redgreenblue/os'
20
+ rgb565 bgr24bit gif terminal web gpl
21
+
22
+ mix misc random
23
+
24
+ os
25
+
26
+ ).each { |m| require "redgreenblue/#{m}" }
@@ -51,6 +51,17 @@ class RGB
51
51
  c
52
52
  end
53
53
 
54
+ # Sets the red, green, and blue values to those of the nearest 24-bit color.
55
+ def snap!
56
+ self.rgb = rgb
57
+ self
58
+ end
59
+
60
+ # Creates a new RGB object containing the nearest 24-bit color.
61
+ def snap
62
+ RGB.rgb rgb
63
+ end
64
+
54
65
  # Calls the given block for each 24-bit RGB color (from black to white), passing the color as an RGB object.
55
66
  #
56
67
  # Returns the number of iterations.
@@ -0,0 +1,30 @@
1
+ class RGB
2
+
3
+ ########################################################################
4
+ # Class methods #
5
+ ########################################################################
6
+
7
+ class << self
8
+
9
+ private
10
+
11
+ # Reverse-engineered from:
12
+ # - https://github.com/GNOME/gimp/blob/5d79fba8238a27b8691556489898d33b3fa0dda0/app/core/gimppalette-load.c
13
+ def gpl_header(name, columns=nil)
14
+ "GIMP Palette\n" +
15
+ "Name: #{name}\n" +
16
+ ( columns ? "Columns: #{columns}\n" : '' )
17
+ end
18
+
19
+ end
20
+
21
+ ########################################################################
22
+ # Instance methods #
23
+ ########################################################################
24
+
25
+ # Returns the color in the format used in .gpl files (Gimp color palettes). A name for the color is optional.
26
+ def gpl(name=nil)
27
+ ( "%3d %3d %3d" % rgb ) + ( name ? "\t#{name}" : '' )
28
+ end
29
+
30
+ end
@@ -8,6 +8,7 @@ class RGB
8
8
 
9
9
  class << self
10
10
 
11
+ # Creates a new RGB object from HSB values: hue (0..360), saturation (0..1), and brightness (0..1).
11
12
  alias hsb hsv
12
13
 
13
14
  end
@@ -16,24 +17,45 @@ class RGB
16
17
  # Instance methods #
17
18
  ########################################################################
18
19
 
20
+ # Returns color as HSB:
21
+ # hue (0..360), saturation (0..1), brightness (0..1).
22
+ # When saturation is 0, hue is nil.
19
23
  alias hsb hsv
20
24
 
25
+ # Returns the object's HSB-hue (0..360).
21
26
  alias hsb_h hsv_h
22
27
 
28
+ # Returns the object's HSB-saturation (0..1).
23
29
  alias hsb_s hsv_s
24
30
 
31
+ # Returns the object's HSB-brightness (0..1).
25
32
  alias hsb_b hsv_v
26
33
 
34
+ # Sets red, green, and blue using HSB values: hue (0..360), saturation (0..1), and brightness (0..1).
27
35
  alias hsb= hsv=
28
36
 
37
+ # Sets HSB-hue to a number of degrees (0..360) or nil.
38
+ #
39
+ # Adjusts red, green, and blue, leaving HSB-saturation and -brightness unchanged.
40
+ # When hue is nil, saturation will be 0.
29
41
  alias hsb_h= hsv_h=
30
42
 
43
+ # Sets HSB-saturation to a number between 0 and 1.
44
+ #
45
+ # Adjusts red, green, and blue, leaving HSB-hue and -brightness unchanged.
46
+ # When saturation is 0, hue will be nil.
31
47
  alias hsb_s= hsv_s=
32
48
 
49
+ # Sets HSB-brightness to a number between 0 and 1.
50
+ #
51
+ # Adjusts red, green, and blue, leaving HSB-hue and -saturation unchanged.
52
+ # When brightness is 0, hue will be nil, and saturation will be 0.
33
53
  alias hsb_b= hsv_v=
34
54
 
55
+ # Sets red, green, and blue by rotating the object's HSB-hue a number of degrees.
35
56
  alias hsb_rotate! hsv_rotate!
36
57
 
58
+ # Creates one or more new RGB objects by rotating this object's HSB-hue a number of degrees.
37
59
  alias hsb_rotate hsv_rotate
38
60
 
39
61
  end
@@ -10,8 +10,6 @@ class RGB
10
10
  class << self
11
11
 
12
12
  # Creates a new RGB object from HSV values: hue (0..360), saturation (0..1), and value (0..1).
13
- #
14
- # ::hsb is an alias for ::hsv.
15
13
  def hsv(*a)
16
14
  new hsv_to_values(*a)
17
15
  end
@@ -32,36 +30,26 @@ class RGB
32
30
  # Returns color as HSV:
33
31
  # hue (0..360), saturation (0..1), value (0..1).
34
32
  # When saturation is 0, hue is nil.
35
- #
36
- # #hsb is an alias for #hsv.
37
33
  def hsv
38
34
  hsl_hsv_c[1]
39
35
  end
40
36
 
41
37
  # Returns the object's HSV-hue (0..360).
42
- #
43
- # #hsb_h is an alias for #hsv_h.
44
38
  def hsv_h
45
39
  hsv[0]
46
40
  end
47
41
 
48
42
  # Returns the object's HSV-saturation (0..1).
49
- #
50
- # #hsb_s is an alias for #hsv_s.
51
43
  def hsv_s
52
44
  hsv[1]
53
45
  end
54
46
 
55
47
  # Returns the object's HSV-value (0..1).
56
- #
57
- # #hsb_b is an alias for #hsv_v.
58
48
  def hsv_v
59
49
  hsv[2]
60
50
  end
61
51
 
62
52
  # Sets red, green, and blue using HSV values: hue (0..360), saturation (0..1), and value (0..1).
63
- #
64
- # #hsb= is an alias for #hsv=.
65
53
  def hsv=(*a)
66
54
  self.values = RGB.hsv_to_values(*a)
67
55
  end
@@ -70,8 +58,6 @@ class RGB
70
58
  #
71
59
  # Adjusts red, green, and blue, leaving HSV-saturation and -value unchanged.
72
60
  # When hue is nil, saturation will be 0.
73
- #
74
- # #hsb_h= is an alias for #hsv_h=.
75
61
  def hsv_h=(degrees)
76
62
  self.hsv = hsv.fill(degrees,0,1)
77
63
  end
@@ -80,8 +66,6 @@ class RGB
80
66
  #
81
67
  # Adjusts red, green, and blue, leaving HSV-hue and -value unchanged.
82
68
  # When saturation is 0, hue will be nil.
83
- #
84
- # #hsb_s= is an alias for #hsv_s=.
85
69
  def hsv_s=(value)
86
70
  self.hsv = hsv.fill(value ,1,1)
87
71
  end
@@ -90,23 +74,17 @@ class RGB
90
74
  #
91
75
  # Adjusts red, green, and blue, leaving HSV-hue and -saturation unchanged.
92
76
  # When value is 0, hue will be nil, and saturation will be 0.
93
- #
94
- # #hsb_b= is an alias for #hsv_v=.
95
77
  def hsv_v=(value)
96
78
  self.hsv = hsv.fill(value ,2,1)
97
79
  end
98
80
 
99
81
  # Sets red, green, and blue by rotating the object's HSV-hue a number of degrees.
100
- #
101
- # #hsb_rotate! is an alias for #hsv_rotate!.
102
82
  def hsv_rotate!(degrees)
103
83
  self.hsv = zip_add(hsv, [degrees, 0, 0])
104
84
  self
105
85
  end
106
86
 
107
87
  # Creates one or more new RGB objects by rotating this object's HSV-hue a number of degrees.
108
- #
109
- # #hsb_rotate is an alias for #hsv_rotate.
110
88
  def hsv_rotate(a_degrees, *b_degrees)
111
89
  if a_degrees.class != Array and b_degrees.none?
112
90
  RGB.hsv zip_add(hsv, [a_degrees, 0, 0])
@@ -38,7 +38,15 @@ class RGB
38
38
 
39
39
  # Returns the base inspect style, dependent on the COLORTERM environment variable.
40
40
  def self.base_style
41
- ENV['COLORTERM'] == 'truecolor' ? 'simple' : 'default'
41
+ if styles.include? ENV['REDGREENBLUE_STYLE']
42
+ ENV['REDGREENBLUE_STYLE']
43
+ else
44
+ if ENV['COLORTERM'] == 'truecolor'
45
+ 'simple'
46
+ else
47
+ 'default'
48
+ end
49
+ end
42
50
  end
43
51
 
44
52
  # Returns the current inspect style.
@@ -11,6 +11,12 @@ class RGB
11
11
  dup.invert!
12
12
  end
13
13
 
14
+ # Returns true when this is an achromatic color: red, green, and blue have equal values.
15
+ # Otherwise false.
16
+ def achromatic?
17
+ values.min == values.max
18
+ end
19
+
14
20
  # Returns an array of RGB objects for all possible ways in which the red, green, and blue values of this object can be exchanged.
15
21
  #
16
22
  # Example: RGB.red.permutation returns [ RGB.red, RGB.green, RGB.blue ].
@@ -16,9 +16,13 @@ class RGB
16
16
  mix!(RGB.white, portion)
17
17
  end
18
18
 
19
- # Creates a new RGB object by mixing this object's color with a portion of white.
20
- def whiten(portion=0.5)
21
- mix(RGB.white, portion)
19
+ # Creates one or more new RGB objects by mixing this object's color with a portion of white.
20
+ def whiten(portion=0.5, *portions)
21
+ if (portion.class != Array) and portions.none?
22
+ mix(RGB.white, portion)
23
+ else
24
+ ( [portion].flatten + portions ).map { |p| mix(RGB.white, p) }
25
+ end
22
26
  end
23
27
 
24
28
  # Changes the object's color by mixing it with a portion of black.
@@ -26,9 +30,13 @@ class RGB
26
30
  mix!(RGB.black, portion)
27
31
  end
28
32
 
29
- # Creates a new RGB object by mixing this object's color with a portion of black.
30
- def blacken(portion=0.5)
31
- mix(RGB.black, portion)
33
+ # Creates one or more new RGB objects by mixing this object's color with a portion of black.
34
+ def blacken(portion=0.5, *portions)
35
+ if (portion.class != Array) and portions.none?
36
+ mix(RGB.black, portion)
37
+ else
38
+ ( [portion].flatten + portions ).map { |p| mix(RGB.black, p) }
39
+ end
32
40
  end
33
41
 
34
42
  # Returns a set of colors between this color and another. That other color is included.
@@ -1,18 +1,28 @@
1
1
  # Optional support for Philips Hue lights.
2
2
  #
3
3
  # Conforms to Bridge API 1.35 for Philips Hue, published 20-Nov-2019.
4
- # See (regrettably requires registration):
5
- # - https://developers.meethue.com/develop/hue-api/
6
4
 
7
5
  # Automatically load core RGB class before loading options.
8
6
  require 'redgreenblue'
9
7
 
10
8
  class RGB
11
9
 
12
- # Returns the arguments required by the Philips Hue API to set a light to this RGB object's hue, saturation and brightness (HSB).
10
+ # Only available when optional support for Philips Hue lights is loaded.
13
11
  #
14
- # When formatted as JSON, this hash can be used directly to set a light's state.
15
- # Only available when optional support for Philips Hue lights is loaded (require 'redgreenblue/opt/philipshue').
12
+ # Returns a hash with the arguments required by the Philips Hue API,
13
+ # to set a light to this RGB object's hue, saturation and brightness.
14
+ #
15
+ # Formatted as JSON, this hash can be sent to a bridge to set a light's state.
16
+ #
17
+ # See (regrettably requires registration):
18
+ # - https://developers.meethue.com/develop/hue-api/
19
+ #
20
+ # @example Load
21
+ # require 'redgreenblue/opt/philipshue'
22
+ # @example Use
23
+ # RGB.magenta.to_philips_hue_api_hsb_arguments
24
+ # => {"on"=>true, "bri"=>254, "hue"=>54613, "sat"=>254}
25
+ # @return [Hash] API arguments
16
26
  def to_philips_hue_api_hsb_arguments(black_off=true)
17
27
  my_hsb = hsb
18
28
 
@@ -0,0 +1,45 @@
1
+ class RGB
2
+
3
+ # Returns a new RGB object with this color's Ostwald full-color,
4
+ # or nil for achromatic colors (white, greys, and black).
5
+ #
6
+ # The resulting color contains no white or black,
7
+ # i.e. it has at least one RGB component set to 0, and at least one set to maximum.
8
+ #
9
+ # This is identical (barring very small rounding errors)
10
+ # to setting HSL-saturation to 1, and -lightness to 0.5
11
+ #
12
+ # Based on:
13
+ # - Color for the Sciences, pp. 575–591
14
+ # - https://lirias.kuleuven.be/retrieve/306124 (PDF)
15
+ def ostwald_color
16
+ white_portion = values.min
17
+ color_portion = values.max - white_portion
18
+
19
+ if color_portion == 0
20
+ nil
21
+ else
22
+ RGB.new( values.map { |v| ( ( v - white_portion ) / color_portion ).round(6) } )
23
+ end
24
+ end
25
+
26
+ # Returns the portions of Ostwald full-color, white, and black, which constitute this color.
27
+ #
28
+ # The sum of these three numbers equals 1.
29
+ #
30
+ # #cwk is an alias for #ostwald_cwk.
31
+ #
32
+ # Based on:
33
+ # - Color for the Sciences, pp. 575–591
34
+ # - https://lirias.kuleuven.be/retrieve/306124 (PDF)
35
+ def ostwald_cwk
36
+ [
37
+ color_portion = values.max - values.min,
38
+ white_portion = values.min,
39
+ 1 - color_portion - white_portion
40
+ ]
41
+ end
42
+
43
+ alias cwk ostwald_cwk
44
+
45
+ end
@@ -1,7 +1,7 @@
1
1
  class RGB
2
2
 
3
3
  # redgreenblue version.
4
- VERSION = '0.10.0'
4
+ VERSION = '0.11.0'
5
5
 
6
6
  # Returns RGB::VERSION.
7
7
  def self.version
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.10.0
4
+ version: 0.11.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: 2020-04-16 00:00:00.000000000 Z
11
+ date: 2020-06-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -24,6 +24,7 @@ files:
24
24
  - lib/redgreenblue/cie.rb
25
25
  - lib/redgreenblue/gamma.rb
26
26
  - lib/redgreenblue/gif.rb
27
+ - lib/redgreenblue/gpl.rb
27
28
  - lib/redgreenblue/hex.rb
28
29
  - lib/redgreenblue/hsb.rb
29
30
  - lib/redgreenblue/hsl.rb
@@ -38,6 +39,7 @@ files:
38
39
  - lib/redgreenblue/opt/philipshue.rb
39
40
  - lib/redgreenblue/os.rb
40
41
  - lib/redgreenblue/os/mac.rb
42
+ - lib/redgreenblue/ostwald.rb
41
43
  - lib/redgreenblue/random.rb
42
44
  - lib/redgreenblue/rgb565.rb
43
45
  - lib/redgreenblue/terminal.rb
@@ -65,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
67
  - !ruby/object:Gem::Version
66
68
  version: '0'
67
69
  requirements: []
68
- rubygems_version: 3.0.6
70
+ rubygems_version: 3.1.2
69
71
  signing_key:
70
72
  specification_version: 4
71
73
  summary: A simple Ruby library for handling RGB colors.