redgreenblue 0.9.0 → 0.10.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 +4 -4
- data/lib/redgreenblue.rb +4 -1
- data/lib/redgreenblue/hsb.rb +39 -0
- data/lib/redgreenblue/hsl.rb +96 -0
- data/lib/redgreenblue/hsv.rb +118 -0
- data/lib/redgreenblue/hsx_shared.rb +94 -0
- data/lib/redgreenblue/math.rb +9 -0
- data/lib/redgreenblue/rgb565.rb +0 -10
- data/lib/redgreenblue/version.rb +1 -1
- metadata +9 -3
- data/lib/redgreenblue/hsl_hsv.rb +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb9542466d29c9ddcec8d53f6a374c228cc39f22b8d17e4c7c5b93f4f6095821
|
4
|
+
data.tar.gz: 53b0e22ef0143e5110fc33d6f0cd68615a5b9931c1cd31a790dfc08adc9f2198
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd97d2edb6a6503c99aa1ee055297d2dcfa21a330234b3c6fb01cf2551cad6ca5c7796103c94d99a7ba51ee33547f508551e3e4376029243eccbd77199b5ddde
|
7
|
+
data.tar.gz: 3b7e6ca19d6c3ee4aafda566cd4187c735e4af0d59f2a2ee09f7e7602a7efb2359c8adaed08eb14c2af9e36c254e299bcbb253cea8755b5b8ead7f8dc7816541
|
data/lib/redgreenblue.rb
CHANGED
@@ -10,8 +10,11 @@ require 'redgreenblue/48bit'
|
|
10
10
|
require 'redgreenblue/hex'
|
11
11
|
require 'redgreenblue/int'
|
12
12
|
|
13
|
+
require 'redgreenblue/hsl'
|
14
|
+
require 'redgreenblue/hsv'
|
15
|
+
require 'redgreenblue/hsb'
|
16
|
+
|
13
17
|
require 'redgreenblue/gamma'
|
14
|
-
require 'redgreenblue/hsl_hsv'
|
15
18
|
require 'redgreenblue/cie'
|
16
19
|
|
17
20
|
require 'redgreenblue/inspect'
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'redgreenblue/hsv'
|
2
|
+
|
3
|
+
class RGB
|
4
|
+
|
5
|
+
########################################################################
|
6
|
+
# Class methods #
|
7
|
+
########################################################################
|
8
|
+
|
9
|
+
class << self
|
10
|
+
|
11
|
+
alias hsb hsv
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
########################################################################
|
16
|
+
# Instance methods #
|
17
|
+
########################################################################
|
18
|
+
|
19
|
+
alias hsb hsv
|
20
|
+
|
21
|
+
alias hsb_h hsv_h
|
22
|
+
|
23
|
+
alias hsb_s hsv_s
|
24
|
+
|
25
|
+
alias hsb_b hsv_v
|
26
|
+
|
27
|
+
alias hsb= hsv=
|
28
|
+
|
29
|
+
alias hsb_h= hsv_h=
|
30
|
+
|
31
|
+
alias hsb_s= hsv_s=
|
32
|
+
|
33
|
+
alias hsb_b= hsv_v=
|
34
|
+
|
35
|
+
alias hsb_rotate! hsv_rotate!
|
36
|
+
|
37
|
+
alias hsb_rotate hsv_rotate
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'redgreenblue/hsx_shared'
|
2
|
+
require 'redgreenblue/math'
|
3
|
+
|
4
|
+
class RGB
|
5
|
+
|
6
|
+
########################################################################
|
7
|
+
# Class methods #
|
8
|
+
########################################################################
|
9
|
+
|
10
|
+
class << self
|
11
|
+
|
12
|
+
# Creates a new RGB object from HSL values: hue (0..360), saturation (0..1), and lightness (0..1).
|
13
|
+
def hsl(*a)
|
14
|
+
new hsl_to_values(*a)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Calculates RGB values from HSL.
|
18
|
+
# Given hue (0..360), saturation (0..1), and lightness (0..1),
|
19
|
+
# returns red, green, and blue as three values between 0 and 1.
|
20
|
+
def hsl_to_values(*a)
|
21
|
+
hsm_to_values(:hsl, a)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
########################################################################
|
27
|
+
# Instance methods #
|
28
|
+
########################################################################
|
29
|
+
|
30
|
+
# Returns color as HSL:
|
31
|
+
# hue (0..360), saturation (0..1), lightness (0..1).
|
32
|
+
# When saturation is 0, hue is nil.
|
33
|
+
def hsl
|
34
|
+
hsl_hsv_c[0]
|
35
|
+
end
|
36
|
+
|
37
|
+
# Returns the object's HSL-hue (0..360).
|
38
|
+
def hsl_h
|
39
|
+
hsl[0]
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns the object's HSL-saturation (0..1).
|
43
|
+
def hsl_s
|
44
|
+
hsl[1]
|
45
|
+
end
|
46
|
+
|
47
|
+
# Returns the object's HSL-lightness (0..1).
|
48
|
+
def hsl_l
|
49
|
+
hsl[2]
|
50
|
+
end
|
51
|
+
|
52
|
+
# Sets red, green, and blue using HSL values: hue (0..360), saturation (0..1), and lightness (0..1).
|
53
|
+
def hsl=(*a)
|
54
|
+
self.values = RGB.hsl_to_values(*a)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Sets HSL-hue to a number of degrees (0..360) or nil.
|
58
|
+
#
|
59
|
+
# Adjusts red, green, and blue, leaving saturation and lightness unchanged.
|
60
|
+
# When hue is nil, saturation will be 0.
|
61
|
+
def hsl_h=(degrees)
|
62
|
+
self.hsl = hsl.fill(degrees,0,1)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Sets HSL-saturation to a value between 0 and 1.
|
66
|
+
#
|
67
|
+
# Adjusts red, green, and blue, leaving hue and lightness unchanged.
|
68
|
+
# When saturation is 0, hue will be nil.
|
69
|
+
def hsl_s=(value)
|
70
|
+
self.hsl = hsl.fill(value ,1,1)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Sets HSL-lightness to a value between 0 and 1.
|
74
|
+
#
|
75
|
+
# Adjusts red, green, and blue, leaving hue and saturation unchanged.
|
76
|
+
# When lightness is 0 or 1, hue will be nil, and saturation will be 0.
|
77
|
+
def hsl_l=(value)
|
78
|
+
self.hsl = hsl.fill(value ,2,1)
|
79
|
+
end
|
80
|
+
|
81
|
+
# Sets red, green, and blue by rotating the object's HSL-hue a number of degrees.
|
82
|
+
def hsl_rotate!(degrees)
|
83
|
+
self.hsl = zip_add(hsl, [degrees, 0, 0])
|
84
|
+
self
|
85
|
+
end
|
86
|
+
|
87
|
+
# Creates one or more new RGB objects by rotating this object's HSL-hue a number of degrees.
|
88
|
+
def hsl_rotate(a_degrees, *b_degrees)
|
89
|
+
if a_degrees.class != Array and b_degrees.none?
|
90
|
+
RGB.hsl zip_add(hsl, [a_degrees, 0, 0])
|
91
|
+
else
|
92
|
+
( [a_degrees] + b_degrees ).flatten.map { |degrees| RGB.hsl zip_add(hsl, [degrees, 0, 0]) }
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'redgreenblue/hsx_shared'
|
2
|
+
require 'redgreenblue/math'
|
3
|
+
|
4
|
+
class RGB
|
5
|
+
|
6
|
+
########################################################################
|
7
|
+
# Class methods #
|
8
|
+
########################################################################
|
9
|
+
|
10
|
+
class << self
|
11
|
+
|
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
|
+
def hsv(*a)
|
16
|
+
new hsv_to_values(*a)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Calculates RGB values from HSV.
|
20
|
+
# Given hue (0..360), saturation (0..1), and value (0..1),
|
21
|
+
# returns red, green, and blue as three values between 0 and 1.
|
22
|
+
def hsv_to_values(*a)
|
23
|
+
hsm_to_values(:hsv, a)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
########################################################################
|
29
|
+
# Instance methods #
|
30
|
+
########################################################################
|
31
|
+
|
32
|
+
# Returns color as HSV:
|
33
|
+
# hue (0..360), saturation (0..1), value (0..1).
|
34
|
+
# When saturation is 0, hue is nil.
|
35
|
+
#
|
36
|
+
# #hsb is an alias for #hsv.
|
37
|
+
def hsv
|
38
|
+
hsl_hsv_c[1]
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns the object's HSV-hue (0..360).
|
42
|
+
#
|
43
|
+
# #hsb_h is an alias for #hsv_h.
|
44
|
+
def hsv_h
|
45
|
+
hsv[0]
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns the object's HSV-saturation (0..1).
|
49
|
+
#
|
50
|
+
# #hsb_s is an alias for #hsv_s.
|
51
|
+
def hsv_s
|
52
|
+
hsv[1]
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns the object's HSV-value (0..1).
|
56
|
+
#
|
57
|
+
# #hsb_b is an alias for #hsv_v.
|
58
|
+
def hsv_v
|
59
|
+
hsv[2]
|
60
|
+
end
|
61
|
+
|
62
|
+
# 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
|
+
def hsv=(*a)
|
66
|
+
self.values = RGB.hsv_to_values(*a)
|
67
|
+
end
|
68
|
+
|
69
|
+
# Sets HSV-hue to a number of degrees (0..360) or nil.
|
70
|
+
#
|
71
|
+
# Adjusts red, green, and blue, leaving HSV-saturation and -value unchanged.
|
72
|
+
# When hue is nil, saturation will be 0.
|
73
|
+
#
|
74
|
+
# #hsb_h= is an alias for #hsv_h=.
|
75
|
+
def hsv_h=(degrees)
|
76
|
+
self.hsv = hsv.fill(degrees,0,1)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Sets HSV-saturation to a number between 0 and 1.
|
80
|
+
#
|
81
|
+
# Adjusts red, green, and blue, leaving HSV-hue and -value unchanged.
|
82
|
+
# When saturation is 0, hue will be nil.
|
83
|
+
#
|
84
|
+
# #hsb_s= is an alias for #hsv_s=.
|
85
|
+
def hsv_s=(value)
|
86
|
+
self.hsv = hsv.fill(value ,1,1)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Sets HSV-value to a number between 0 and 1.
|
90
|
+
#
|
91
|
+
# Adjusts red, green, and blue, leaving HSV-hue and -saturation unchanged.
|
92
|
+
# When value is 0, hue will be nil, and saturation will be 0.
|
93
|
+
#
|
94
|
+
# #hsb_b= is an alias for #hsv_v=.
|
95
|
+
def hsv_v=(value)
|
96
|
+
self.hsv = hsv.fill(value ,2,1)
|
97
|
+
end
|
98
|
+
|
99
|
+
# 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
|
+
def hsv_rotate!(degrees)
|
103
|
+
self.hsv = zip_add(hsv, [degrees, 0, 0])
|
104
|
+
self
|
105
|
+
end
|
106
|
+
|
107
|
+
# 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
|
+
def hsv_rotate(a_degrees, *b_degrees)
|
111
|
+
if a_degrees.class != Array and b_degrees.none?
|
112
|
+
RGB.hsv zip_add(hsv, [a_degrees, 0, 0])
|
113
|
+
else
|
114
|
+
( [a_degrees] + b_degrees ).flatten.map { |degrees| RGB.hsv zip_add(hsv, [degrees, 0, 0]) }
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
class RGB
|
2
|
+
|
3
|
+
########################################################################
|
4
|
+
# Class methods #
|
5
|
+
########################################################################
|
6
|
+
|
7
|
+
class << self
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
# Calculates RGB values from HSL or HSV.
|
12
|
+
# With help from:
|
13
|
+
# - https://en.wikipedia.org/wiki/HSL_and_HSV
|
14
|
+
def hsm_to_values(type, *a)
|
15
|
+
raise NotImplementedError unless [:hsl, :hsv].include? type
|
16
|
+
|
17
|
+
hue, saturation, magnitude = a.flatten
|
18
|
+
|
19
|
+
if ( saturation == 0 ) or ( ! hue )
|
20
|
+
return Array.new(3) { magnitude }
|
21
|
+
end
|
22
|
+
|
23
|
+
hue = hue.modulo 360
|
24
|
+
|
25
|
+
chroma = case type
|
26
|
+
when :hsl
|
27
|
+
( 1 - ( 2 * magnitude - 1 ).abs ) * saturation
|
28
|
+
when :hsv
|
29
|
+
magnitude * saturation
|
30
|
+
end
|
31
|
+
|
32
|
+
values = [
|
33
|
+
chroma,
|
34
|
+
( 1 - ( ( hue / 60.0 ).modulo(2) - 1 ).abs ) * chroma,
|
35
|
+
0
|
36
|
+
]
|
37
|
+
|
38
|
+
values = case type
|
39
|
+
when :hsl
|
40
|
+
values.map { |v| ( v + magnitude - chroma / 2.0 ).round(9) }
|
41
|
+
when :hsv
|
42
|
+
values.map { |v| ( v + magnitude - chroma ).round(9) }
|
43
|
+
end
|
44
|
+
|
45
|
+
# order values according to hue sextant
|
46
|
+
[ [0,1,2], [1,0,2], [2,0,1], [2,1,0], [1,2,0], [0,2,1] ][hue.div 60].map { |i| values[i]}
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
########################################################################
|
52
|
+
# Instance methods #
|
53
|
+
########################################################################
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
# Compute HSL, HSV, and chroma.
|
58
|
+
# With help from:
|
59
|
+
# - https://en.wikipedia.org/wiki/HSL_and_HSV
|
60
|
+
def hsl_hsv_c
|
61
|
+
sorted_hash = to_h
|
62
|
+
min, max = sorted_hash.values.values_at(2,0)
|
63
|
+
|
64
|
+
chroma = max - min
|
65
|
+
|
66
|
+
hue =
|
67
|
+
if chroma == 0
|
68
|
+
nil
|
69
|
+
else
|
70
|
+
( case sorted_hash.keys.first
|
71
|
+
when :red
|
72
|
+
60 * ( ( ( green - blue ) / chroma ).modulo 6 )
|
73
|
+
when :green
|
74
|
+
60 * ( ( blue - red ) / chroma + 2 )
|
75
|
+
when :blue
|
76
|
+
60 * ( ( red - green ) / chroma + 4 )
|
77
|
+
end
|
78
|
+
).round(6)
|
79
|
+
end
|
80
|
+
|
81
|
+
lightness = ( min + max ) / 2.0
|
82
|
+
|
83
|
+
saturation_hsl =
|
84
|
+
chroma == 0 ? 0.0 : ( chroma / ( 1 - (2 * lightness - 1).abs ) ).round(9)
|
85
|
+
|
86
|
+
value = max
|
87
|
+
|
88
|
+
saturation_hsv =
|
89
|
+
value == 0 ? 0.0 : chroma / value
|
90
|
+
|
91
|
+
[ [hue, saturation_hsl, lightness], [hue, saturation_hsv, value], chroma ]
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
data/lib/redgreenblue/rgb565.rb
CHANGED
@@ -15,16 +15,6 @@ class RGB
|
|
15
15
|
self.b = ( ( v & 0x001f ) ) << 3
|
16
16
|
end
|
17
17
|
|
18
|
-
# Deprecated: this method will be removed in a future version.
|
19
|
-
# Returns the color in 16-bit RGB565 format as a string of 0's and 1's.
|
20
|
-
def rgb565_binary
|
21
|
-
unless defined? @@warned_rgb565_binary_deprecation
|
22
|
-
warn "Warning: 'rgb565_binary' has been deprecated and will be removed in a future version of redgreenblue."
|
23
|
-
@@warned_rgb565_binary_deprecation = true
|
24
|
-
end
|
25
|
-
rgb565.bytes.reverse.map { |b| "%08b" % b }.join
|
26
|
-
end
|
27
|
-
|
28
18
|
# Creates a new RGB color from 16-bit RGB565 data.
|
29
19
|
def self.rgb565(rgb565_string)
|
30
20
|
c = self.new
|
data/lib/redgreenblue/version.rb
CHANGED
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.
|
4
|
+
version: 0.10.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-
|
11
|
+
date: 2020-04-16 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -25,10 +25,14 @@ files:
|
|
25
25
|
- lib/redgreenblue/gamma.rb
|
26
26
|
- lib/redgreenblue/gif.rb
|
27
27
|
- lib/redgreenblue/hex.rb
|
28
|
-
- lib/redgreenblue/
|
28
|
+
- lib/redgreenblue/hsb.rb
|
29
|
+
- lib/redgreenblue/hsl.rb
|
30
|
+
- lib/redgreenblue/hsv.rb
|
31
|
+
- lib/redgreenblue/hsx_shared.rb
|
29
32
|
- lib/redgreenblue/inspect.rb
|
30
33
|
- lib/redgreenblue/int.rb
|
31
34
|
- lib/redgreenblue/lazy.rb
|
35
|
+
- lib/redgreenblue/math.rb
|
32
36
|
- lib/redgreenblue/misc.rb
|
33
37
|
- lib/redgreenblue/mix.rb
|
34
38
|
- lib/redgreenblue/opt/philipshue.rb
|
@@ -43,7 +47,9 @@ homepage: https://github.com/lllisteu/redgreenblue
|
|
43
47
|
licenses:
|
44
48
|
- MIT
|
45
49
|
metadata:
|
50
|
+
homepage_uri: https://github.com/lllisteu/redgreenblue
|
46
51
|
changelog_uri: https://github.com/lllisteu/redgreenblue/blob/master/History.md
|
52
|
+
documentation_uri: https://www.rubydoc.info/gems/redgreenblue/RGB
|
47
53
|
post_install_message:
|
48
54
|
rdoc_options: []
|
49
55
|
require_paths:
|
data/lib/redgreenblue/hsl_hsv.rb
DELETED
@@ -1,59 +0,0 @@
|
|
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
|