redgreenblue 0.10.0 → 0.11.0

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