Class: AutoColors::Color

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

Overview

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(lab, rgb = nil) ⇒ Color

Returns a new instance of Color.



12
13
14
15
16
17
18
19
20
21
22
# File 'lib/autocolors/color.rb', line 12

def initialize(lab,rgb=nil)
  if rgb.nil?
    @cl,@ca,@cb = lab.map{|v| v.to_f}
    @lab_dirty = true
    @rgb_dirty = false
  else
    @r,@g,@b = rgb.map{|v| v.to_f}
    @lab_dirty = false
    @rgb_dirty = true
  end
end

Instance Attribute Details

#rgb_approxObject (readonly)

Returns the value of attribute rgb_approx.



10
11
12
# File 'lib/autocolors/color.rb', line 10

def rgb_approx
  @rgb_approx
end

Instance Method Details

#-(c) ⇒ Object



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

def -(c)
  if c.is_a?(Color)
    # Euclidean distance in 3 dimensions, but emphasize brightness a bit
    # more than the color (which is more how the human eye works)
    ((cl*2.5 - c.cl*2.5)**2 + (ca - c.ca)**2 + (cb - c.cb)**2)**0.5
  end
end

#bObject



46
# File 'lib/autocolors/color.rb', line 46

def b;      lab_propagate if @lab_dirty; @b               end

#b=(v) ⇒ Object



50
# File 'lib/autocolors/color.rb', line 50

def b=(v)   @rgb_dirty=true; @b=v.to_f                    end

#caObject



35
# File 'lib/autocolors/color.rb', line 35

def ca;     rgb_propagate if @rgb_dirty; @ca              end

#ca=(v) ⇒ Object



39
# File 'lib/autocolors/color.rb', line 39

def ca=(v)  @lab_dirty=true; @ca=v.to_f                   end

#cbObject



36
# File 'lib/autocolors/color.rb', line 36

def cb;     rgb_propagate if @rgb_dirty; @cb              end

#cb=(v) ⇒ Object



40
# File 'lib/autocolors/color.rb', line 40

def cb=(v)  @lab_dirty=true; @cb=v.to_f                   end

#clObject



34
# File 'lib/autocolors/color.rb', line 34

def cl;     rgb_propagate if @rgb_dirty; @cl              end

#cl=(v) ⇒ Object



38
# File 'lib/autocolors/color.rb', line 38

def cl=(v)  @lab_dirty=true; @cl=v.to_f                   end

#gObject



45
# File 'lib/autocolors/color.rb', line 45

def g;      lab_propagate if @lab_dirty; @g               end

#g=(v) ⇒ Object



49
# File 'lib/autocolors/color.rb', line 49

def g=(v)   @rgb_dirty=true; @g=v.to_f                    end

#labObject

CIELAB colorspace



33
# File 'lib/autocolors/color.rb', line 33

def lab;    rgb_propagate if @rgb_dirty; [@cl,@ca,@cb]    end

#lab=(v) ⇒ Object



37
# File 'lib/autocolors/color.rb', line 37

def lab=(v) @lab_dirty=true; @cl,@ca,@cb=v.map{|a|a.to_f} end

#lab_propagateObject (protected)



75
76
77
78
79
80
81
82
83
84
# File 'lib/autocolors/color.rb', line 75

def lab_propagate
  p = (@cl + 16.0) / 116.0
  @x = (p + @ca / 500.0) ** 3.0
  @y = p ** 3.0
  @z = (p - @cb / 200.0) ** 3.0
  @lr,@lg,@lb = (XYZ2LRGB*Matrix[[@x],[@y],[@z]]).to_a.flatten
  @rgb_approx = false
  @r,@g,@b = [@lr,@lg,@lb].map{|c|lrgbc_to_rgbc(c)}
  @lab_dirty = false
end

#labf(t) ⇒ Object (protected)



86
87
88
# File 'lib/autocolors/color.rb', line 86

def labf(t)
  t > 0.008856 ? t**(1.0/3.0) : 7.787 * t + (16.0/116.0)
end

#lbObject



27
# File 'lib/autocolors/color.rb', line 27

def lb; rgb_propagate if @rgb_dirty; lab_propagate if @lab_dirty; @lb end

#lgObject



26
# File 'lib/autocolors/color.rb', line 26

def lg; rgb_propagate if @rgb_dirty; lab_propagate if @lab_dirty; @lg end

#lrObject

Intermediate spaces



25
# File 'lib/autocolors/color.rb', line 25

def lr; rgb_propagate if @rgb_dirty; lab_propagate if @lab_dirty; @lr end

#lrgbc_to_rgbc(c) ⇒ Object (protected)



97
98
99
100
101
102
103
# File 'lib/autocolors/color.rb', line 97

def lrgbc_to_rgbc(c)
  if c <= 0.0031308 then v = (12.92 * c * 255.0).round
  else v = ((1.055 * (c ** (1.0/2.4)) - 0.055) * 255.0).round end
  if v < 0 then @rgb_approx = true; 0
  elsif v > 255 then @rgb_approx = true; 255
  else v end
end

#rObject



44
# File 'lib/autocolors/color.rb', line 44

def r;      lab_propagate if @lab_dirty; @r               end

#r=(v) ⇒ Object



48
# File 'lib/autocolors/color.rb', line 48

def r=(v)   @rgb_dirty=true; @r=v.to_f                    end

#rgbObject

RGB colorspace



43
# File 'lib/autocolors/color.rb', line 43

def rgb;    lab_propagate if @lab_dirty; [@r,@g,@b]       end

#rgb=(v) ⇒ Object



47
# File 'lib/autocolors/color.rb', line 47

def rgb=(v) @rgb_dirty=true; @r,@g,@b=v.map{|a|a.to_f}    end

#rgb_propagateObject (protected)



66
67
68
69
70
71
72
73
# File 'lib/autocolors/color.rb', line 66

def rgb_propagate
  @lr,@lg,@lb = [@r,@g,@b].map{|c|rgbc_to_lrgbc(c)}
  @x,@y,@z = (LRGB2XYZ*Matrix[[@lr],[@lg],[@lb]]).to_a.flatten
  @cl = (@y > 0.008856) ? 116.0*(@y ** (1.0/3.0)) - 16.0 : 903.3 * @y
  @ca = 500.0 * (labf(@x) - labf(@y))
  @cb = 200.0 * (labf(@y) - labf(@z))
  @rgb_dirty = false
end

#rgbc_to_lrgbc(c) ⇒ Object (protected)



91
92
93
94
95
# File 'lib/autocolors/color.rb', line 91

def rgbc_to_lrgbc(c)
  cf = c.to_f / 255.0
  if cf <= 0.04045 then cf / 12.92
  else ((cf + 0.055) / 1.055) ** 2.4 end
end

#s_ctermObject



151
152
153
# File 'lib/autocolors/color.rb', line 151

def s_cterm
  'NONE'
end

#s_highObject



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

def s_high
  'NONE'
end

#s_lctermObject



147
148
149
# File 'lib/autocolors/color.rb', line 147

def s_lcterm
  'NONE'
end

#s_termObject



143
144
145
# File 'lib/autocolors/color.rb', line 143

def s_term
  'NONE'
end

#to_16Object



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

def to_16
  CUBE256[0..15].each_with_index.map{|c,i| [i,c-self]}.sort_by{|i,diff| diff}.first[0]
end

#to_256Object



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

def to_256
  CUBE256.each_with_index.map{|c,i| [i,c-self]}.sort_by{|i,diff| diff}.first[0]
  #CUBE256.sort_by{|c| c - self}.first
end

#to_sObject



52
53
54
# File 'lib/autocolors/color.rb', line 52

def to_s
  '#' + rgb.map{|v|v.to_s(16).rjust(2,'0')}.join('')
end

#xObject



28
# File 'lib/autocolors/color.rb', line 28

def x; rgb_propagate if @rgb_dirty; lab_propagate if @lab_dirty; @x end

#yObject



29
# File 'lib/autocolors/color.rb', line 29

def y; rgb_propagate if @rgb_dirty; lab_propagate if @lab_dirty; @y end

#zObject



30
# File 'lib/autocolors/color.rb', line 30

def z; rgb_propagate if @rgb_dirty; lab_propagate if @lab_dirty; @z end