class Color

Implements a color (r,g,b + a) with conversion to/from web format (eg aabbcc), and with a number of utilities to lighten, darken and blend values.

Constants

BLACK
BRIGHTNESS_DEFAULT

Default value for darken, lighten etc.

HEXVAL

Table for conversion to hex

WHITE

Some constants for general use

Attributes

a[R]

Basic attributes - holds each channel as 0-255 fixnum

b[R]

Basic attributes - holds each channel as 0-255 fixnum

g[R]

Basic attributes - holds each channel as 0-255 fixnum

r[R]

Basic attributes - holds each channel as 0-255 fixnum

Public Class Methods

average(col1, col2) click to toggle source
# File lib/iron/web/color.rb, line 229
def self.average(col1, col2)
  self.blend(col1, col2, 0.5)
end
blend(col1, col2, amt) click to toggle source
# File lib/iron/web/color.rb, line 223
def self.blend(col1, col2, amt)
  col1 = Color.parse(col1)
  col2 = Color.parse(col2)
  col1.blend(col2, amt)
end
lookup_callback() click to toggle source

Get the lookup callback, if any

# File lib/iron/web/color.rb, line 65
def self.lookup_callback
  @lookup_callback
end
lookup_callback=(callback) click to toggle source

Assigns a callback lambda to convert symbols into parse-able values. Sample usage:

Color.lookup_callback = lambda {|val| Settings[:site][:colors].get!(val) }
rgb(:off_white)  # => '#f8f0ee'
# File lib/iron/web/color.rb, line 60
def self.lookup_callback=(callback)
  @lookup_callback = callback
end
new(*args) click to toggle source

Construct ourselves from whatever is passed in

# File lib/iron/web/color.rb, line 15
def initialize(*args)
  @r = 255
  @g = 255
  @b = 255
  @a = 255

  if args.size.between?(3,4)
    self.r = args[0]
    self.g = args[1]
    self.b = args[2]
    self.a = args[3] if args[3]
  else
    set(*args)
  end
end
parse(*args) click to toggle source

Attempt to read in a string and parse it into values

# File lib/iron/web/color.rb, line 70
def self.parse(*args)
  case args.size

  when 0 then
    return nil

  when 1 then
    val = args[0]

    # Trivial parse... :-)
    return val if val.is_a?(Color)

    # Lookup site settings if symbol
    if val.is_a?(Symbol)
      callback = Color.lookup_callback
      return callback.nil? ? nil : self.parse(callback.call(val))
    end

    # Single value, assume grayscale
    return Color.new(val, val, val) if val.is_a?(Fixnum)

    # Assume string
    str = val.to_s.upcase
    str = str[/[0-9A-F]{3,8}/] || ''
    case str.size
    when 3, 4 then
      r, g, b, a = str.scan(/[0-9A-F]/)
    when 6, 8 then
      r, g, b, a = str.scan(/[0-9A-F]{2}/)
    else
      return nil
    end
    a = 255 if a.nil?

    return Color.new(r,g,b,a)

  when 3,4 then
    return Color.new(*args)

  end
  nil
end

Public Instance Methods

==(val) click to toggle source

Test for equality, accepts string vals as well, eg Color.new('aaa') == '#AAAAAA' => true

# File lib/iron/web/color.rb, line 44
def ==(val)
  val = Color.parse(val)
  return false if val.nil?
  return r == val.r && g == val.g && b == val.b && a == val.a
end
a=(val) click to toggle source
# File lib/iron/web/color.rb, line 54
def a=(val); @a = from_hex(val); end
b=(val) click to toggle source
# File lib/iron/web/color.rb, line 53
def b=(val); @b = from_hex(val); end
blend(other, amt) click to toggle source

Blend to a color amt % towards another color value

# File lib/iron/web/color.rb, line 207
def blend(other, amt)
  other = Color.parse(other)
  return Color.new(self) if amt <= 0 || other.nil?
  return Color.new(other) if amt >= 1.0
  val = Color.new(self)
  val.r += ((other.r - val.r)*amt).to_i
  val.g += ((other.g - val.g)*amt).to_i
  val.b += ((other.b - val.b)*amt).to_i
  val
end
blend!(other, amt) click to toggle source
# File lib/iron/web/color.rb, line 218
def blend!(other, amt)
  set(blend(other, amt))
  self
end
brightness() click to toggle source

Compute our overall brightness, using perception-based weighting, from 0.0 to 1.0

# File lib/iron/web/color.rb, line 189
def brightness
  (0.2126 * self.r + 0.7152 * self.g + 0.0722 * self.b) / 255.0
end
contrast(amt = BRIGHTNESS_DEFAULT) click to toggle source

Go towards middle of brightness scale, based on whether color is dark or light.

# File lib/iron/web/color.rb, line 174
def contrast(amt = BRIGHTNESS_DEFAULT)
  dark? ? lighten(amt) : darken(amt)
end
contrast!(amt = BRIGHTNESS_DEFAULT) click to toggle source
# File lib/iron/web/color.rb, line 178
def contrast!(amt = BRIGHTNESS_DEFAULT)
  set(contrast(amt))
  self
end
dark?() click to toggle source
# File lib/iron/web/color.rb, line 193
def dark?
  brightness < 0.5
end
darken(amt = BRIGHTNESS_DEFAULT) click to toggle source

Darken color by amt

# File lib/iron/web/color.rb, line 158
def darken(amt = BRIGHTNESS_DEFAULT)
  return self if amt <= 0
  return BLACK if amt >= 1.0
  val = Color.new(self)
  val.r -= (val.r * amt).to_i
  val.g -= (val.g * amt).to_i
  val.b -= (val.b * amt).to_i
  val
end
darken!(amt = BRIGHTNESS_DEFAULT) click to toggle source
# File lib/iron/web/color.rb, line 168
def darken!(amt = BRIGHTNESS_DEFAULT)
  set(darken(amt))
  self
end
g=(val) click to toggle source
# File lib/iron/web/color.rb, line 52
def g=(val); @g = from_hex(val); end
grayscale() click to toggle source

Convert to grayscale

# File lib/iron/web/color.rb, line 184
def grayscale
  Color.new(self.brightness)
end
grayscale!() click to toggle source
# File lib/iron/web/color.rb, line 201
def grayscale!
  set(grayscale)
  self
end
grayscale?() click to toggle source
# File lib/iron/web/color.rb, line 137
def grayscale?
  @r == @g && @g == @b
end
inspect() click to toggle source
# File lib/iron/web/color.rb, line 113
def inspect
  to_s
end
light?() click to toggle source
# File lib/iron/web/color.rb, line 197
def light?
  !dark?
end
lighten(amt = BRIGHTNESS_DEFAULT) click to toggle source

Lighten color by amt

# File lib/iron/web/color.rb, line 142
def lighten(amt = BRIGHTNESS_DEFAULT)
  return self if amt <= 0
  return WHITE if amt >= 1.0
  val = Color.new(self)
  val.r += ((255-val.r) * amt).to_i
  val.g += ((255-val.g) * amt).to_i
  val.b += ((255-val.b) * amt).to_i
  val
end
lighten!(amt = BRIGHTNESS_DEFAULT) click to toggle source
# File lib/iron/web/color.rb, line 152
def lighten!(amt = BRIGHTNESS_DEFAULT)
  set(lighten(amt))
  self
end
opaque?() click to toggle source
# File lib/iron/web/color.rb, line 129
def opaque?
  @a == 255
end
r=(val) click to toggle source

Setters for individual channels - take 0-255 or '00'-'FF' values

# File lib/iron/web/color.rb, line 51
def r=(val); @r = from_hex(val); end
set(*args) click to toggle source

All-purpose setter - pass in another Color, '#000000', rgb vals… whatever

# File lib/iron/web/color.rb, line 32
def set(*args)
  val = Color.parse(*args)
  unless val.nil?
    self.r = val.r
    self.g = val.g
    self.b = val.b
    self.a = val.a
  end
  self
end
to_rgb(add_hash = true) click to toggle source
# File lib/iron/web/color.rb, line 121
def to_rgb(add_hash = true)
  (add_hash ? '#' : '') + to_hex(r) + to_hex(g) + to_hex(b)
end
to_rgba(add_hash = true) click to toggle source
# File lib/iron/web/color.rb, line 125
def to_rgba(add_hash = true)
  to_rgb(add_hash) + to_hex(a)
end
to_s(add_hash = true) click to toggle source
# File lib/iron/web/color.rb, line 117
def to_s(add_hash = true)
  trans? ? to_rgba(add_hash) : to_rgb(add_hash)
end
trans?() click to toggle source
# File lib/iron/web/color.rb, line 133
def trans?
  @a != 255
end

Protected Instance Methods

from_hex(val) click to toggle source

Convert int or string to int, eg 80 => 80, 'FF' => 255, '7' => 119

# File lib/iron/web/color.rb, line 241
def from_hex(val)
  if val.is_a?(String)
    # Double up if single char form
    val = val + val if val.size == 1
    # Convert to integer
    val = val.hex
  end
  # Clamp
  val = 0 if val < 0
  val = 255 if val > 255
  val
end
to_hex(val) click to toggle source

Convert int to string hex, eg 255 => 'FF'

# File lib/iron/web/color.rb, line 236
def to_hex(val)
  HEXVAL[val / 16] + HEXVAL[val % 16]
end