Class: Termin::ANSIColor::RGBTriple

Inherits:
Object
  • Object
show all
Includes:
Termin::ANSIColor::RGBColorMetricsHelpers::WeightedEuclideanDistance
Defined in:
lib/termin/ansicolor/rgb_triple.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Termin::ANSIColor::RGBColorMetricsHelpers::WeightedEuclideanDistance

#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_/, '')) # XXX somewhat hacky
  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

#blueObject



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

Returns:

  • (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

#greenObject



57
58
59
# File 'lib/termin/ansicolor/rgb_triple.rb', line 57

def green
  @values[1]
end

#htmlObject



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

#redObject



53
54
55
# File 'lib/termin/ansicolor/rgb_triple.rb', line 53

def red
  @values[0]
end

#to_aObject



82
83
84
# File 'lib/termin/ansicolor/rgb_triple.rb', line 82

def to_a
  @values.dup
end

#to_rgb_tripleObject



75
76
77
# File 'lib/termin/ansicolor/rgb_triple.rb', line 75

def to_rgb_triple
  self
end