class Term::ANSIColor::RGBTriple

Attributes

values[R]

Public Class Methods

[](thing) click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 48
def self.[](thing)
  case
  when thing.respond_to?(:to_rgb_triple) then thing.to_rgb_triple
  when thing.respond_to?(:to_ary)        then from_array(thing.to_ary)
  when thing.respond_to?(:to_str)
    thing = thing.to_str
    from_html(thing.sub(/\Aon_/, '')) || from_css(thing) ||
      Term::ANSIColor::HSLTriple.from_css(thing).full?(:to_rgb_triple)
  when thing.respond_to?(:to_hash)       then from_hash(thing.to_hash)
  else raise ArgumentError, "cannot convert #{thing.inspect} into #{self}"
  end
end
from_array(array) click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 44
def self.from_array(array)
  new(*array)
end
from_css(css) click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 27
def self.from_css(css)
  case css
  when /\A\s*rgb\(\s*([^%\s]+)\s*%\s*,\s*([^%\s]+)\s*%\s*,\s*([^%\s]+)\s*%\s*\)\z/
    new(*$~.captures.map { |c| convert_value(((Float(c) / 100) * 0xff).round) })
  when /\A\s*rgb\(\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^\)\s]+)\s*\)\z/
    new(*$~.captures.map { |c| convert_value((Float(c)).round) })
  end
end
from_hash(options) click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 36
def self.from_hash(options)
  new(
    convert_value(options[:red]),
    convert_value(options[:green]),
    convert_value(options[:blue])
  )
end
from_html(html) click to toggle source
# File lib/term/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 + c).to_i(16)) })
  end
end
new(red, green, blue) click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 61
def initialize(red, green, blue)
  @values = [ red, green, blue ].map { |v|
    [ [ Integer(v), 0 ].max, 0xff ].min
  }
end

Private Class Methods

convert_value(color, max: 255) click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 8
def self.convert_value(color, max: 255)
  color.nil? and raise ArgumentError, "missing color value"
  color = Integer(color)
  (0..max) === color or raise ArgumentError,
    "color value #{color.inspect} not between 0 and #{max}"
  color
end

Public Instance Methods

==(other) click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 132
def ==(other)
  @values == other.to_rgb_triple.values
end
blue() click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 75
def blue
  @values[2]
end
blue_p() click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 91
def blue_p
  percentages[2]
end
color(string) click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 136
def color(string)
  Term::ANSIColor.color(self, string)
end
css(percentage: false) click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 109
def css(percentage: false)
  if percentage
    "rgb(%s%%,%s%%,%s%%)" % @values.map { |v| 100.0 * v / 255 }
  else
    "rgb(%u,%u,%u)" % @values
  end
end
distance_to(other, options = {}) click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 140
def distance_to(other, options = {})
  options[:metric] ||= RGBColorMetrics::CIELab
  options[:metric].distance(self, other)
end
gradient_to(other, options = {}) click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 151
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?() click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 99
def gray?
  red != 0 && red != 0xff && red == green && green == blue && blue == red
end
green() click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 71
def green
  @values[1]
end
green_p() click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 87
def green_p
  percentages[1]
end
html() click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 103
def html
  s = '#'
  @values.each { |c| s << '%02x' % c }
  s
end
initialize_copy(other) click to toggle source
Calls superclass method
# File lib/term/ansicolor/rgb_triple.rb, line 145
def initialize_copy(other)
  r = super
  other.instance_variable_set :@values, @values.dup
  r
end
invert() click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 95
def invert
  self.class.new(255 - red, 255 - green, 255 - blue)
end
method_missing(name, *args, &block) click to toggle source
Calls superclass method
# File lib/term/ansicolor/rgb_triple.rb, line 170
def method_missing(name, *args, &block)
  if Term::ANSIColor::HSLTriple.method_defined?(name)
    to_hsl_triple.send(name, *args, &block)
  else
    super
  end
end
percentages() click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 79
def percentages
  @percentages ||= @values.map { |v| 100 * v / 255.0 }
end
red() click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 67
def red
  @values[0]
end
red_p() click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 83
def red_p
  percentages[0]
end
to_a() click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 128
def to_a
  @values.dup
end
to_hsl_triple() click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 121
def to_hsl_triple
  Term::ANSIColor::HSLTriple.from_rgb_triple(self)
end
to_rgb_triple() click to toggle source
# File lib/term/ansicolor/rgb_triple.rb, line 117
def to_rgb_triple
  self
end