Class: Backlogs::Color

Inherits:
Object
  • Object
show all
Defined in:
lib/color.rb

Constant Summary

HEXVAL =

Table for conversion to hex

(('0'..'9').to_a).concat(('A'..'F').to_a).freeze
BRIGHTNESS_DEFAULT =

Default value for #darken, #lighten etc.

0.2
WHITE =

Some constants for general use

Color.new(255,255,255).freeze
BLACK =
Color.new(0,0,0).freeze

Instance Attribute Summary (collapse)

Class Method Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (Color) initialize(*args)

Constructor. Inits to white (#FFFFFF) by default, or accepts any params supported by #parse.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/color.rb', line 36

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

Instance Attribute Details

- (Object) a

Returns the value of attribute a



27
28
29
# File 'lib/color.rb', line 27

def a
  @a
end

- (Object) b

Returns the value of attribute b



27
28
29
# File 'lib/color.rb', line 27

def b
  @b
end

- (Object) g

Returns the value of attribute g



27
28
29
# File 'lib/color.rb', line 27

def g
  @g
end

- (Object) r

Returns the value of attribute r



27
28
29
# File 'lib/color.rb', line 27

def r
  @r
end

Class Method Details

+ (Object) blend(col1, col2, amt)

Class-level version for explicit blends of two values, useful with constants



209
210
211
212
213
# File 'lib/color.rb', line 209

def self.blend(col1, col2, amt)
  col1 = Color.parse(col1)
  col2 = Color.parse(col2)
  col1.blend(col2, amt)
end

+ (Object) parse(*args)

Attempt to read in a string and parse it into values



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/color.rb', line 78

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)
  
    # 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
  
    return Color.new(r,g,b,a || 255)
  
  when 3,4 then
    return Color.new(*args)
  
  end
  nil
end

Instance Method Details

- (Object) ==(val)

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



65
66
67
68
69
# File 'lib/color.rb', line 65

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

- (Object) blend(other, amt)

Blend to a color amt % towards another color value, eg red.blend(blue, 0.5) will be purple, white.blend(black, 0.5) will be gray, etc.



191
192
193
194
195
196
197
198
199
200
# File 'lib/color.rb', line 191

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

- (Object) blend!(other, amt)

In place version of #blend



203
204
205
206
# File 'lib/color.rb', line 203

def blend!(other, amt)
  set(blend(other, amt))
  self
end

- (Object) darken(amt = BRIGHTNESS_DEFAULT)

Darken a color towards full black. 0.0 is a no-op, 1.0 will return #000000



160
161
162
163
164
165
166
167
168
# File 'lib/color.rb', line 160

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

- (Object) darken!(amt = BRIGHTNESS_DEFAULT)

In place version of #darken



171
172
173
174
# File 'lib/color.rb', line 171

def darken!(amt = BRIGHTNESS_DEFAULT)
  set(darken(amt))
  self
end

- (Object) grayscale

Convert to grayscale, using perception-based weighting



177
178
179
180
181
# File 'lib/color.rb', line 177

def grayscale
  val = Color.new(self)
  val.r = val.g = val.b = (0.2126 * val.r + 0.7152 * val.g + 0.0722 * val.b)
  val
end

- (Object) grayscale!

In place version of #grayscale



184
185
186
187
# File 'lib/color.rb', line 184

def grayscale!
  set(grayscale)
  self
end

- (Boolean) grayscale?

Returns:

  • (Boolean)


138
139
140
# File 'lib/color.rb', line 138

def grayscale?
  @r == @g && @g == @b
end

- (Object) inspect



114
115
116
# File 'lib/color.rb', line 114

def inspect
  to_s(true)
end

- (Object) lighten(amt = BRIGHTNESS_DEFAULT)

Lighten color towards white. 0.0 is a no-op, 1.0 will return #FFFFFF



143
144
145
146
147
148
149
150
151
# File 'lib/color.rb', line 143

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

- (Object) lighten!(amt = BRIGHTNESS_DEFAULT)

In place version of #lighten



154
155
156
157
# File 'lib/color.rb', line 154

def lighten!(amt = BRIGHTNESS_DEFAULT)
  set(lighten(amt))
  self
end

- (Boolean) opaque?

Returns:

  • (Boolean)


130
131
132
# File 'lib/color.rb', line 130

def opaque?
  @a == 255
end

- (Object) set(*args)

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



53
54
55
56
57
58
59
60
61
62
# File 'lib/color.rb', line 53

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

- (Object) to_rgb(add_hash = true)



122
123
124
# File 'lib/color.rb', line 122

def to_rgb(add_hash = true)
  (add_hash ? '#' : '') + to_hex(r) + to_hex(g) + to_hex(b)
end

- (Object) to_rgba(add_hash = true)



126
127
128
# File 'lib/color.rb', line 126

def to_rgba(add_hash = true)
  to_rgb(add_hash) + to_hex(a)
end

- (Object) to_s(add_hash = true)



118
119
120
# File 'lib/color.rb', line 118

def to_s(add_hash = true)
  trans? ? to_rgba(add_hash) : to_rgb(add_hash)
end

- (Boolean) trans?

Returns:

  • (Boolean)


134
135
136
# File 'lib/color.rb', line 134

def trans?
  @a != 255
end