Class: Termin::ANSIColor::RGBTriple
Class Method Summary
collapse
Instance Method Summary
collapse
#weighted_euclidean_distance_to
Constructor Details
#initialize(red, green, blue) ⇒ RGBTriple
Returns a new instance of RGBTriple.
49
50
51
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 49
def initialize(red, green, blue)
@values = [ red, green, blue ]
end
|
Class Method Details
.[](thing) ⇒ Object
39
40
41
42
43
44
45
46
47
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 39
def self.[](thing)
case
when thing.respond_to?(:to_rgb_triple) then thing
when thing.respond_to?(:to_ary) then RGBTriple.from_array(thing.to_ary)
when thing.respond_to?(:to_str) then RGBTriple.from_html(thing.to_str.sub(/\Aon_/, '')) when thing.respond_to?(:to_hash) then RGBTriple.from_hash(thing.to_hash)
else raise ArgumentError, "cannot convert #{thing.inspect} into #{self}"
end
end
|
.from_array(array) ⇒ Object
35
36
37
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 35
def self.from_array(array)
new(*array)
end
|
.from_hash(options) ⇒ Object
27
28
29
30
31
32
33
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 27
def self.from_hash(options)
new(
convert_value(options[:red]),
convert_value(options[:green]),
convert_value(options[:blue])
)
end
|
.from_html(html) ⇒ Object
18
19
20
21
22
23
24
25
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 18
def self.from_html(html)
case html
when /\A#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\z/i
new(*$~.captures.map { |c| convert_value(c.to_i(16)) })
when /\A#([0-9a-f])([0-9a-f])([0-9a-f])\z/i
new(*$~.captures.map { |c| convert_value(c.to_i(16) << 4) })
end
end
|
Instance Method Details
#==(other) ⇒ Object
86
87
88
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 86
def ==(other)
@values == other.values
end
|
#blue ⇒ Object
61
62
63
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 61
def blue
@values[2]
end
|
#distance_to(other, options = {}) ⇒ Object
90
91
92
93
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 90
def distance_to(other, options = {})
options[:metric] ||= RGBColorMetrics::CIELab
options[:metric].distance(self, other)
end
|
#gradient_to(other, options = {}) ⇒ Object
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 101
def gradient_to(other, options = {})
options[:steps] ||= 16
steps = options[:steps].to_i
steps < 2 and raise ArgumentError, 'at least 2 steps are required'
changes = other.values.zip(@values).map { |x, y| x - y }
current = self
gradient = [ current.dup ]
s = steps - 1
while s > 1
current = current.dup
gradient << current
3.times do |i|
current.values[i] += changes[i] / (steps - 1)
end
s -= 1
end
gradient << other
end
|
#gray? ⇒ Boolean
65
66
67
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 65
def gray?
red != 0 && red != 0xff && red == green && green == blue && blue == red
end
|
#green ⇒ Object
57
58
59
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 57
def green
@values[1]
end
|
#html ⇒ Object
69
70
71
72
73
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 69
def html
s = '#'
@values.each { |c| s << '%02x' % c }
s
end
|
#initialize_copy(other) ⇒ Object
95
96
97
98
99
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 95
def initialize_copy(other)
r = super
other.instance_variable_set :@values, @values.dup
r
end
|
#red ⇒ Object
53
54
55
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 53
def red
@values[0]
end
|
#to_a ⇒ Object
82
83
84
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 82
def to_a
@values.dup
end
|
#to_rgb_triple ⇒ Object
75
76
77
|
# File 'lib/termin/ansicolor/rgb_triple.rb', line 75
def to_rgb_triple
self
end
|