redgreenblue 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/redgreenblue.rb +22 -0
- data/lib/redgreenblue/24bit.rb +47 -0
- data/lib/redgreenblue/48bit.rb +47 -0
- data/lib/redgreenblue/base.rb +38 -0
- data/lib/redgreenblue/bgr24bit.rb +20 -0
- data/lib/redgreenblue/gif.rb +17 -0
- data/lib/redgreenblue/hex.rb +36 -0
- data/lib/redgreenblue/lazy.rb +11 -0
- data/lib/redgreenblue/misc.rb +60 -0
- data/lib/redgreenblue/nice.rb +7 -0
- data/lib/redgreenblue/os.rb +3 -0
- data/lib/redgreenblue/os/mac.rb +50 -0
- data/lib/redgreenblue/random.rb +17 -0
- data/lib/redgreenblue/rgb565.rb +26 -0
- data/lib/redgreenblue/version.rb +3 -0
- metadata +57 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1cac7c885ca1de3e3fe22ebfaf7207dd17b7bd25e8c1dd6f82cfdab0e0b5cee1
|
4
|
+
data.tar.gz: 7ca71212d78ae2a638d8bfb54dcb8a824367eac6e7fe8ca1eaa1e239b22bbaa9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 23316f3526690807fabde09d5a909ae7afe396da7b039baa6352c814ab653d02ee5646aa23ece364748cf090f4b9218a34c0cd19b8a04313086b2c5f9dcadf97
|
7
|
+
data.tar.gz: 19f71a26312a83d845f8ff508758e653b693289be129e02281e65cb8da4b13d32ab5b58282883ea0d0dc4c156ddd775c0179354bea5dccc6065f00ad49b7f66c
|
data/lib/redgreenblue.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
class RGB
|
2
|
+
end
|
3
|
+
|
4
|
+
require 'redgreenblue/version'
|
5
|
+
|
6
|
+
require 'redgreenblue/base'
|
7
|
+
|
8
|
+
require 'redgreenblue/24bit'
|
9
|
+
require 'redgreenblue/48bit'
|
10
|
+
require 'redgreenblue/hex'
|
11
|
+
|
12
|
+
require 'redgreenblue/lazy'
|
13
|
+
require 'redgreenblue/nice'
|
14
|
+
|
15
|
+
require 'redgreenblue/rgb565'
|
16
|
+
require 'redgreenblue/bgr24bit'
|
17
|
+
require 'redgreenblue/gif'
|
18
|
+
|
19
|
+
require 'redgreenblue/misc'
|
20
|
+
require 'redgreenblue/random'
|
21
|
+
|
22
|
+
require 'redgreenblue/os'
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class RGB
|
2
|
+
|
3
|
+
# r, g, b methods
|
4
|
+
|
5
|
+
def r
|
6
|
+
(red * 255).round
|
7
|
+
end
|
8
|
+
|
9
|
+
def g
|
10
|
+
(green * 255).round
|
11
|
+
end
|
12
|
+
|
13
|
+
def b
|
14
|
+
(blue * 255).round
|
15
|
+
end
|
16
|
+
|
17
|
+
def r=(n)
|
18
|
+
self.red = n / 255.0
|
19
|
+
end
|
20
|
+
|
21
|
+
def g=(n)
|
22
|
+
self.green = n / 255.0
|
23
|
+
end
|
24
|
+
|
25
|
+
def b=(n)
|
26
|
+
self.blue = n / 255.0
|
27
|
+
end
|
28
|
+
|
29
|
+
# rgb methods
|
30
|
+
|
31
|
+
def rgb
|
32
|
+
[r,g,b]
|
33
|
+
end
|
34
|
+
|
35
|
+
def rgb=(rgb)
|
36
|
+
self.r, self.g, self.b = rgb
|
37
|
+
end
|
38
|
+
|
39
|
+
# factory method
|
40
|
+
|
41
|
+
def self.rgb(rgb)
|
42
|
+
c = self.new
|
43
|
+
c.rgb = rgb
|
44
|
+
c
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class RGB
|
2
|
+
|
3
|
+
# rr, gg, bb methods
|
4
|
+
|
5
|
+
def rr
|
6
|
+
(red * 65535).round
|
7
|
+
end
|
8
|
+
|
9
|
+
def gg
|
10
|
+
(green * 65535).round
|
11
|
+
end
|
12
|
+
|
13
|
+
def bb
|
14
|
+
(blue * 65535).round
|
15
|
+
end
|
16
|
+
|
17
|
+
def rr=(n)
|
18
|
+
self.red = n / 65535.0
|
19
|
+
end
|
20
|
+
|
21
|
+
def gg=(n)
|
22
|
+
self.green = n / 65535.0
|
23
|
+
end
|
24
|
+
|
25
|
+
def bb=(n)
|
26
|
+
self.blue = n / 65535.0
|
27
|
+
end
|
28
|
+
|
29
|
+
# rrggbb methods
|
30
|
+
|
31
|
+
def rrggbb
|
32
|
+
[rr,gg,bb]
|
33
|
+
end
|
34
|
+
|
35
|
+
def rrggbb=(rrggbb)
|
36
|
+
self.rr, self.gg, self.bb = rrggbb
|
37
|
+
end
|
38
|
+
|
39
|
+
# factory method
|
40
|
+
|
41
|
+
def self.rrggbb(rrggbb)
|
42
|
+
c = self.new
|
43
|
+
c.rrggbb = rrggbb
|
44
|
+
c
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class RGB
|
2
|
+
|
3
|
+
attr_reader :red, :green, :blue
|
4
|
+
|
5
|
+
def initialize(a=[0.5, 0.5, 0.5])
|
6
|
+
self.values = a
|
7
|
+
end
|
8
|
+
|
9
|
+
def red=(n)
|
10
|
+
@red = limit(n)
|
11
|
+
end
|
12
|
+
|
13
|
+
def green=(n)
|
14
|
+
@green = limit(n)
|
15
|
+
end
|
16
|
+
|
17
|
+
def blue=(n)
|
18
|
+
@blue = limit(n)
|
19
|
+
end
|
20
|
+
|
21
|
+
def values
|
22
|
+
[ red, green, blue ]
|
23
|
+
end
|
24
|
+
|
25
|
+
alias to_a values
|
26
|
+
|
27
|
+
def values=(a)
|
28
|
+
self.red, self.green, self.blue = a
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
# limit to 0..1
|
34
|
+
def limit(n)
|
35
|
+
n <= 0 ? 0.0 : n >= 1 ? 1.0 : n
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class RGB
|
2
|
+
|
3
|
+
# bgr 24-bit methods (as used by BMP bitmaps)
|
4
|
+
|
5
|
+
def bgr24
|
6
|
+
[b, g, r].pack('C3')
|
7
|
+
end
|
8
|
+
|
9
|
+
def bgr24=(s)
|
10
|
+
self.b, self.g, self.r = s.unpack('C3')
|
11
|
+
end
|
12
|
+
|
13
|
+
# factory method
|
14
|
+
def self.bgr24(bgr)
|
15
|
+
c = self.new
|
16
|
+
c.bgr24 = bgr
|
17
|
+
c
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class RGB
|
2
|
+
|
3
|
+
# Return a 1-pixel GIF
|
4
|
+
#
|
5
|
+
# With help from:
|
6
|
+
# - http://www.perlmonks.org/?node_id=7974
|
7
|
+
def gif_pixel
|
8
|
+
"GIF89a\1\0\1\0\x90\0\0".b +
|
9
|
+
rgb.pack('C3') +
|
10
|
+
"\0\0\0,\0\0\0\0\1\0\1\0\0\x02\x02\x04\1\0;".b
|
11
|
+
end
|
12
|
+
|
13
|
+
def gif_pixel_write(file_path)
|
14
|
+
File.binwrite(file_path, gif_pixel)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class RGB
|
2
|
+
|
3
|
+
def hex(shorthand=false)
|
4
|
+
if shorthand
|
5
|
+
RGB.hex_shorthand hexadecimal
|
6
|
+
else
|
7
|
+
hexadecimal
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def hex=(s)
|
12
|
+
if ( s =~ /^(#?)(\h\h)(\h\h)(\h\h)$/ ) # 6-digit hex
|
13
|
+
self.rgb = [ $2.to_i(16), $3.to_i(16), $4.to_i(16) ]
|
14
|
+
elsif ( s =~ /^(#?)(\h)(\h)(\h)$/ ) # 3-digit hex
|
15
|
+
self.rgb = [ ($2*2).to_i(16), ($3*2).to_i(16), ($4*2).to_i(16) ]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# factory method
|
20
|
+
def self.hex(s)
|
21
|
+
c = self.new
|
22
|
+
c.hex = s
|
23
|
+
c
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.hex_shorthand(h)
|
27
|
+
h.sub( /^(#?)(\h)\2(\h)\3(\h)\4$/, '\1\2\3\4' )
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def hexadecimal
|
33
|
+
'%02x%02x%02x' % [ r, g, b ]
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
class RGB
|
2
|
+
|
3
|
+
# Mix
|
4
|
+
|
5
|
+
# Mix with second RGB color.
|
6
|
+
# p denotes portion of the mixed-in color to be used.
|
7
|
+
# p=0 delivers pure original color (no change),
|
8
|
+
# p=1 delivers pure mixed-in color.
|
9
|
+
|
10
|
+
def mix!(color,p=0.5)
|
11
|
+
self.values = mix_values(color.values, p)
|
12
|
+
self
|
13
|
+
end
|
14
|
+
|
15
|
+
def mix(color,p=0.5)
|
16
|
+
RGB.new mix_values(color.values, p)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Invert
|
20
|
+
|
21
|
+
def invert!
|
22
|
+
self.values = values.map { |v| 1-v }
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def invert
|
27
|
+
dup.invert!
|
28
|
+
end
|
29
|
+
|
30
|
+
# Mix with white
|
31
|
+
|
32
|
+
def whiten!(p)
|
33
|
+
mix!(RGB.white, p)
|
34
|
+
end
|
35
|
+
|
36
|
+
def whiten(p)
|
37
|
+
mix(RGB.white, p)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Mix with black
|
41
|
+
|
42
|
+
def blacken!(p)
|
43
|
+
mix!(RGB.black, p)
|
44
|
+
end
|
45
|
+
|
46
|
+
def blacken(p)
|
47
|
+
mix(RGB.black, p)
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def mix_values(v, p)
|
53
|
+
raise(ArgumentError, "Portion '#{p}' not in range (0..1)") unless (0..1).include? p
|
54
|
+
[
|
55
|
+
( red * (1-p) ) + ( v[0] * p ),
|
56
|
+
( green * (1-p) ) + ( v[1] * p ),
|
57
|
+
( blue * (1-p) ) + ( v[2] * p )
|
58
|
+
]
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class RGB
|
2
|
+
|
3
|
+
def pick
|
4
|
+
result = RGB.mac_choose(rrggbb)
|
5
|
+
if result
|
6
|
+
self.rrggbb = result
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
# factory method
|
11
|
+
|
12
|
+
def self.pick
|
13
|
+
result = RGB.mac_choose(RGB.new.rrggbb)
|
14
|
+
if result
|
15
|
+
RGB.rrggbb result
|
16
|
+
else
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
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].
|
28
|
+
def self.mac_choose(color)
|
29
|
+
|
30
|
+
script = <<~ENDSCRIPT
|
31
|
+
tell application "Terminal"
|
32
|
+
try
|
33
|
+
return choose color default color { #{color[0]}, #{color[1]}, #{color[2]} }
|
34
|
+
on error
|
35
|
+
return ""
|
36
|
+
end try
|
37
|
+
end tell
|
38
|
+
ENDSCRIPT
|
39
|
+
|
40
|
+
result = `osascript -e '#{script}'`.chomp
|
41
|
+
|
42
|
+
if result.empty?
|
43
|
+
nil
|
44
|
+
else
|
45
|
+
(result.split( /,\w*/ )).map { |s| s.to_i }
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class RGB
|
2
|
+
|
3
|
+
def shuffle!
|
4
|
+
self.red, self.green, self.blue = [red, green, blue].shuffle
|
5
|
+
self
|
6
|
+
end
|
7
|
+
|
8
|
+
def randomize!
|
9
|
+
self.red, self.green, self.blue = Kernel::rand, Kernel::rand, Kernel::rand
|
10
|
+
self
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.rand
|
14
|
+
new([Kernel::rand, Kernel::rand, Kernel::rand])
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class RGB
|
2
|
+
|
3
|
+
def rgb565
|
4
|
+
[((r >> 3) << 11) + ((g >> 2) << 5) + (b >> 3)].pack 'S<'
|
5
|
+
end
|
6
|
+
|
7
|
+
# https://stackoverflow.com/questions/2442576/
|
8
|
+
def rgb565=(s)
|
9
|
+
v = ( s.unpack "S<" )[0]
|
10
|
+
self.r = ( ( v & 0xf800 ) >> 11 ) << 3
|
11
|
+
self.g = ( ( v & 0x07e0 ) >> 5 ) << 2
|
12
|
+
self.b = ( ( v & 0x001f ) ) << 3
|
13
|
+
end
|
14
|
+
|
15
|
+
def rgb565_binary
|
16
|
+
rgb565.bytes.reverse.map { |b| "%08b" % b }.join
|
17
|
+
end
|
18
|
+
|
19
|
+
# factory method
|
20
|
+
def self.rgb565(s)
|
21
|
+
c = self.new
|
22
|
+
c.rgb565 = s
|
23
|
+
c
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: redgreenblue
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.6.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- lllist.eu
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-07-24 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email:
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/redgreenblue.rb
|
20
|
+
- lib/redgreenblue/24bit.rb
|
21
|
+
- lib/redgreenblue/48bit.rb
|
22
|
+
- lib/redgreenblue/base.rb
|
23
|
+
- lib/redgreenblue/bgr24bit.rb
|
24
|
+
- lib/redgreenblue/gif.rb
|
25
|
+
- lib/redgreenblue/hex.rb
|
26
|
+
- lib/redgreenblue/lazy.rb
|
27
|
+
- lib/redgreenblue/misc.rb
|
28
|
+
- lib/redgreenblue/nice.rb
|
29
|
+
- lib/redgreenblue/os.rb
|
30
|
+
- lib/redgreenblue/os/mac.rb
|
31
|
+
- lib/redgreenblue/random.rb
|
32
|
+
- lib/redgreenblue/rgb565.rb
|
33
|
+
- lib/redgreenblue/version.rb
|
34
|
+
homepage: https://github.com/lllisteu/redgreenblue
|
35
|
+
licenses:
|
36
|
+
- MIT
|
37
|
+
metadata: {}
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options: []
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.2.0
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
requirements: []
|
53
|
+
rubygems_version: 3.0.3
|
54
|
+
signing_key:
|
55
|
+
specification_version: 4
|
56
|
+
summary: RGB colors for Ruby
|
57
|
+
test_files: []
|