Module: Textbringer::Color

Defined in:
lib/textbringer/color.rb

Defined Under Namespace

Classes: RGBColor

Constant Summary collapse

BASIC_COLORS =
{
  "default" => -1,
  "black" => Curses::COLOR_BLACK,
  "red" => Curses::COLOR_RED,
  "green" => Curses::COLOR_GREEN,
  "yellow" => Curses::COLOR_YELLOW,
  "blue" => Curses::COLOR_BLUE,
  "magenta" => Curses::COLOR_MAGENTA,
  "cyan" => Curses::COLOR_CYAN,
  "white" => Curses::COLOR_WHITE,
  "brightblack" => 8,
  "brightred" => 9,
  "brightgreen" => 10,
  "brightyellow" => 11,
  "brightblue" => 12,
  "brightmagenta" => 13,
  "brightcyan" => 14,
  "brightwhite" => 15
}
DIRECT_COLOR_THRESHOLD =
256 * 256 * 256
BASIC_COLORS_RGB =

Canonical RGB values for basic ANSI colors (xterm defaults), packed as 0xRRGGBB for use in direct color mode.

{
  "default"       => -1,
  "black"         => 0x000000,
  "red"           => 0xCD0000,
  "green"         => 0x00CD00,
  "yellow"        => 0xCDCD00,
  "blue"          => 0x0000EE,
  "magenta"       => 0xCD00CD,
  "cyan"          => 0x00CDCD,
  "white"         => 0xE5E5E5,
  "brightblack"   => 0x7F7F7F,
  "brightred"     => 0xFF0000,
  "brightgreen"   => 0x00FF00,
  "brightyellow"  => 0xFFFF00,
  "brightblue"    => 0x5C5CFF,
  "brightmagenta" => 0xFF00FF,
  "brightcyan"    => 0x00FFFF,
  "brightwhite"   => 0xFFFFFF
}
ADDITIONAL_COLORS =
[]

Class Method Summary collapse

Class Method Details

.[](name) ⇒ Object



64
65
66
67
68
69
70
71
# File 'lib/textbringer/color.rb', line 64

def self.[](name)
  n = find_color_number(name)
  if n < Window.colors
    n
  else
    -1
  end
end

.direct_color?Boolean

Returns:

  • (Boolean)


73
74
75
# File 'lib/textbringer/color.rb', line 73

def self.direct_color?
  Window.colors >= DIRECT_COLOR_THRESHOLD
end

.find_color_number(name) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/textbringer/color.rb', line 77

def self.find_color_number(name)
  if name.is_a?(Integer)
    return name
  end
  if direct_color?
    return find_direct_color(name)
  end
  case name
  when /\A\#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})\z/
    r = $1.to_i(16)
    g = $2.to_i(16)
    b = $3.to_i(16)
    ADDITIONAL_COLORS.sort_by { |c|
      (r - c.r) ** 2 + (g - c.g) ** 2 + (b - c.b) ** 2
    }.first.number
  else
    unless BASIC_COLORS.key?(name)
      raise EditorError, "No such color: #{name}"
    end
    BASIC_COLORS[name]
  end
end

.find_direct_color(name) ⇒ Object



100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/textbringer/color.rb', line 100

def self.find_direct_color(name)
  case name
  when /\A\#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})\z/
    r = $1.to_i(16)
    g = $2.to_i(16)
    b = $3.to_i(16)
    (r << 16) | (g << 8) | b
  else
    unless BASIC_COLORS_RGB.key?(name)
      raise EditorError, "No such color: #{name}"
    end
    BASIC_COLORS_RGB[name]
  end
end