class Tco::Palette

Attributes

type[R]

Public Class Methods

new(type) click to toggle source
# File lib/tco/palette.rb, line 266
def initialize(type)
  set_type type

  @cache = {}
  @palette = [
    # ANSI colours (the first 16) are configurable by users in most
    # terminals. Therefore, they're not used for colour matching, unless
    # they were explicitly configured in tco.conf.
    #
    # The colour values in comments are the defaults for xterm.
    Unknown.new(0), # [0, 0, 0]
    Unknown.new(1), # [205, 0, 0]
    Unknown.new(2), # [0, 205, 0]
    Unknown.new(3), # [205, 205, 0]
    Unknown.new(4), # [0, 0, 238]
    Unknown.new(5), # [205, 0, 205]
    Unknown.new(6), # [0, 205, 205]
    Unknown.new(7), # [229, 229, 229]
    Unknown.new(8), # [127, 127, 127]
    Unknown.new(9), # [255, 0, 0]
    Unknown.new(10), # [0, 255, 0]
    Unknown.new(11), # [255, 255, 0]
    Unknown.new(12), # [92, 92, 255]
    Unknown.new(13), # [255, 0, 255]
    Unknown.new(14), # [0, 255, 255]
    Unknown.new(15), # [255, 255, 255]

    # The colours bellow are the definitions from xterm extended
    # colour palette. They should be the same across terminals.
    Colour.new([0, 0, 0]),
    Colour.new([0, 0, 95]),
    Colour.new([0, 0, 135]),
    Colour.new([0, 0, 175]),
    Colour.new([0, 0, 215]),
    Colour.new([0, 0, 255]),
    Colour.new([0, 95, 0]),
    Colour.new([0, 95, 95]),
    Colour.new([0, 95, 135]),
    Colour.new([0, 95, 175]),
    Colour.new([0, 95, 215]),
    Colour.new([0, 95, 255]),
    Colour.new([0, 135, 0]),
    Colour.new([0, 135, 95]),
    Colour.new([0, 135, 135]),
    Colour.new([0, 135, 175]),
    Colour.new([0, 135, 215]),
    Colour.new([0, 135, 255]),
    Colour.new([0, 175, 0]),
    Colour.new([0, 175, 95]),
    Colour.new([0, 175, 135]),
    Colour.new([0, 175, 175]),
    Colour.new([0, 175, 215]),
    Colour.new([0, 175, 255]),
    Colour.new([0, 215, 0]),
    Colour.new([0, 215, 95]),
    Colour.new([0, 215, 135]),
    Colour.new([0, 215, 175]),
    Colour.new([0, 215, 215]),
    Colour.new([0, 215, 255]),
    Colour.new([0, 255, 0]),
    Colour.new([0, 255, 95]),
    Colour.new([0, 255, 135]),
    Colour.new([0, 255, 175]),
    Colour.new([0, 255, 215]),
    Colour.new([0, 255, 255]),
    Colour.new([95, 0, 0]),
    Colour.new([95, 0, 95]),
    Colour.new([95, 0, 135]),
    Colour.new([95, 0, 175]),
    Colour.new([95, 0, 215]),
    Colour.new([95, 0, 255]),
    Colour.new([95, 95, 0]),
    Colour.new([95, 95, 95]),
    Colour.new([95, 95, 135]),
    Colour.new([95, 95, 175]),
    Colour.new([95, 95, 215]),
    Colour.new([95, 95, 255]),
    Colour.new([95, 135, 0]),
    Colour.new([95, 135, 95]),
    Colour.new([95, 135, 135]),
    Colour.new([95, 135, 175]),
    Colour.new([95, 135, 215]),
    Colour.new([95, 135, 255]),
    Colour.new([95, 175, 0]),
    Colour.new([95, 175, 95]),
    Colour.new([95, 175, 135]),
    Colour.new([95, 175, 175]),
    Colour.new([95, 175, 215]),
    Colour.new([95, 175, 255]),
    Colour.new([95, 215, 0]),
    Colour.new([95, 215, 95]),
    Colour.new([95, 215, 135]),
    Colour.new([95, 215, 175]),
    Colour.new([95, 215, 215]),
    Colour.new([95, 215, 255]),
    Colour.new([95, 255, 0]),
    Colour.new([95, 255, 95]),
    Colour.new([95, 255, 135]),
    Colour.new([95, 255, 175]),
    Colour.new([95, 255, 215]),
    Colour.new([95, 255, 255]),
    Colour.new([135, 0, 0]),
    Colour.new([135, 0, 95]),
    Colour.new([135, 0, 135]),
    Colour.new([135, 0, 175]),
    Colour.new([135, 0, 215]),
    Colour.new([135, 0, 255]),
    Colour.new([135, 95, 0]),
    Colour.new([135, 95, 95]),
    Colour.new([135, 95, 135]),
    Colour.new([135, 95, 175]),
    Colour.new([135, 95, 215]),
    Colour.new([135, 95, 255]),
    Colour.new([135, 135, 0]),
    Colour.new([135, 135, 95]),
    Colour.new([135, 135, 135]),
    Colour.new([135, 135, 175]),
    Colour.new([135, 135, 215]),
    Colour.new([135, 135, 255]),
    Colour.new([135, 175, 0]),
    Colour.new([135, 175, 95]),
    Colour.new([135, 175, 135]),
    Colour.new([135, 175, 175]),
    Colour.new([135, 175, 215]),
    Colour.new([135, 175, 255]),
    Colour.new([135, 215, 0]),
    Colour.new([135, 215, 95]),
    Colour.new([135, 215, 135]),
    Colour.new([135, 215, 175]),
    Colour.new([135, 215, 215]),
    Colour.new([135, 215, 255]),
    Colour.new([135, 255, 0]),
    Colour.new([135, 255, 95]),
    Colour.new([135, 255, 135]),
    Colour.new([135, 255, 175]),
    Colour.new([135, 255, 215]),
    Colour.new([135, 255, 255]),
    Colour.new([175, 0, 0]),
    Colour.new([175, 0, 95]),
    Colour.new([175, 0, 135]),
    Colour.new([175, 0, 175]),
    Colour.new([175, 0, 215]),
    Colour.new([175, 0, 255]),
    Colour.new([175, 95, 0]),
    Colour.new([175, 95, 95]),
    Colour.new([175, 95, 135]),
    Colour.new([175, 95, 175]),
    Colour.new([175, 95, 215]),
    Colour.new([175, 95, 255]),
    Colour.new([175, 135, 0]),
    Colour.new([175, 135, 95]),
    Colour.new([175, 135, 135]),
    Colour.new([175, 135, 175]),
    Colour.new([175, 135, 215]),
    Colour.new([175, 135, 255]),
    Colour.new([175, 175, 0]),
    Colour.new([175, 175, 95]),
    Colour.new([175, 175, 135]),
    Colour.new([175, 175, 175]),
    Colour.new([175, 175, 215]),
    Colour.new([175, 175, 255]),
    Colour.new([175, 215, 0]),
    Colour.new([175, 215, 95]),
    Colour.new([175, 215, 135]),
    Colour.new([175, 215, 175]),
    Colour.new([175, 215, 215]),
    Colour.new([175, 215, 255]),
    Colour.new([175, 255, 0]),
    Colour.new([175, 255, 95]),
    Colour.new([175, 255, 135]),
    Colour.new([175, 255, 175]),
    Colour.new([175, 255, 215]),
    Colour.new([175, 255, 255]),
    Colour.new([215, 0, 0]),
    Colour.new([215, 0, 95]),
    Colour.new([215, 0, 135]),
    Colour.new([215, 0, 175]),
    Colour.new([215, 0, 215]),
    Colour.new([215, 0, 255]),
    Colour.new([215, 95, 0]),
    Colour.new([215, 95, 95]),
    Colour.new([215, 95, 135]),
    Colour.new([215, 95, 175]),
    Colour.new([215, 95, 215]),
    Colour.new([215, 95, 255]),
    Colour.new([215, 135, 0]),
    Colour.new([215, 135, 95]),
    Colour.new([215, 135, 135]),
    Colour.new([215, 135, 175]),
    Colour.new([215, 135, 215]),
    Colour.new([215, 135, 255]),
    Colour.new([215, 175, 0]),
    Colour.new([215, 175, 95]),
    Colour.new([215, 175, 135]),
    Colour.new([215, 175, 175]),
    Colour.new([215, 175, 215]),
    Colour.new([215, 175, 255]),
    Colour.new([215, 215, 0]),
    Colour.new([215, 215, 95]),
    Colour.new([215, 215, 135]),
    Colour.new([215, 215, 175]),
    Colour.new([215, 215, 215]),
    Colour.new([215, 215, 255]),
    Colour.new([215, 255, 0]),
    Colour.new([215, 255, 95]),
    Colour.new([215, 255, 135]),
    Colour.new([215, 255, 175]),
    Colour.new([215, 255, 215]),
    Colour.new([215, 255, 255]),
    Colour.new([255, 0, 0]),
    Colour.new([255, 0, 95]),
    Colour.new([255, 0, 135]),
    Colour.new([255, 0, 175]),
    Colour.new([255, 0, 215]),
    Colour.new([255, 0, 255]),
    Colour.new([255, 95, 0]),
    Colour.new([255, 95, 95]),
    Colour.new([255, 95, 135]),
    Colour.new([255, 95, 175]),
    Colour.new([255, 95, 215]),
    Colour.new([255, 95, 255]),
    Colour.new([255, 135, 0]),
    Colour.new([255, 135, 95]),
    Colour.new([255, 135, 135]),
    Colour.new([255, 135, 175]),
    Colour.new([255, 135, 215]),
    Colour.new([255, 135, 255]),
    Colour.new([255, 175, 0]),
    Colour.new([255, 175, 95]),
    Colour.new([255, 175, 135]),
    Colour.new([255, 175, 175]),
    Colour.new([255, 175, 215]),
    Colour.new([255, 175, 255]),
    Colour.new([255, 215, 0]),
    Colour.new([255, 215, 95]),
    Colour.new([255, 215, 135]),
    Colour.new([255, 215, 175]),
    Colour.new([255, 215, 215]),
    Colour.new([255, 215, 255]),
    Colour.new([255, 255, 0]),
    Colour.new([255, 255, 95]),
    Colour.new([255, 255, 135]),
    Colour.new([255, 255, 175]),
    Colour.new([255, 255, 215]),
    Colour.new([255, 255, 255]),
    Colour.new([8, 8, 8]),
    Colour.new([18, 18, 18]),
    Colour.new([28, 28, 28]),
    Colour.new([38, 38, 38]),
    Colour.new([48, 48, 48]),
    Colour.new([58, 58, 58]),
    Colour.new([68, 68, 68]),
    Colour.new([78, 78, 78]),
    Colour.new([88, 88, 88]),
    Colour.new([98, 98, 98]),
    Colour.new([108, 108, 108]),
    Colour.new([118, 118, 118]),
    Colour.new([128, 128, 128]),
    Colour.new([138, 138, 138]),
    Colour.new([148, 148, 148]),
    Colour.new([158, 158, 158]),
    Colour.new([168, 168, 168]),
    Colour.new([178, 178, 178]),
    Colour.new([188, 188, 188]),
    Colour.new([198, 198, 198]),
    Colour.new([208, 208, 208]),
    Colour.new([218, 218, 218]),
    Colour.new([228, 228, 228]),
    Colour.new([238, 238, 238])
  ]
end

Public Instance Methods

colours() click to toggle source
# File lib/tco/palette.rb, line 578
def colours
  if @type == "extended"
    @palette
  else
    @palette[0,8]
  end
end
get_colour_value(id) click to toggle source
# File lib/tco/palette.rb, line 543
def get_colour_value(id)
  raise "Id '#{id}' out of range." unless id.between?(0, @palette.length-1)
  raise "Value of colour '#{id}' is unknown" if @palette[id].is_a? Unknown
  @palette[id].rgb if @palette[id]
end
is_known?(id) click to toggle source
# File lib/tco/palette.rb, line 549
def is_known?(id)
  raise "Id '#{id}' out of range." unless id.between?(0, @palette.length-1)
  !@palette[id].is_a? Unknown
end
match_colour(colour) click to toggle source
# File lib/tco/palette.rb, line 554
def match_colour(colour)
  unless colour.is_a? Colour
    msg = "Unsupported argument type '#{colour.class}', must be 'Colour'."
    raise ArgumentError.new msg
  end

  colours = case @type
            when "extended" then @palette
            when "ansi" then @palette[0,8]
            end

  if @cache.has_key? colour.to_s
    @cache[colour.to_s]
  else
    distances = colours.map { |c| c.is_a?(Colour) ? c - colour : Float::INFINITY }
    colour_index = distances.each_with_index.min[1]

    # TODO: No cache eviction is currently in place
    # We assume that applications won't use milions of different colours.
    @cache[colour.to_s] = colour_index
    colour_index
  end
end
set_colour_value(id, rgb_colour) click to toggle source
# File lib/tco/palette.rb, line 538
def set_colour_value(id, rgb_colour)
  raise "Id '#{id}' out of range." unless id.between?(0, @palette.length-1)
  @palette[id] = Colour.new(rgb_colour)
end
type=(type) click to toggle source
# File lib/tco/palette.rb, line 586
def type=(type)
  set_type type
end

Private Instance Methods

set_type(type) click to toggle source
# File lib/tco/palette.rb, line 591
def set_type(type)
  @type = case type
          when "auto"[0, type.length]
            if ENV.has_key? "TERM" and ENV["TERM"] == "xterm-256color"
              "extended"
            else
              "ansi"
            end
          when "ansi"[0, type.length]
            "ansi"
          when "extended"[0, type.length]
            "extended"
          else
            raise "Unknown palette type '#{type}'."
          end
end