Class: Color::HSL

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

Overview

An HSL colour object. Internally, the hue (#h), saturation (#s), and luminosity/lightness (#l) values are dealt with as fractional values in the range 0..1.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(h = 0, s = 0, l = 0) ⇒ HSL

Creates an HSL colour object from the standard values of degrees and percentages (e.g., 145 deg, 30%, 50%).



47
48
49
50
51
# File 'lib/color/hsl.rb', line 47

def initialize(h = 0, s = 0, l = 0)
  @h = h / 360.0
  @s = s / 100.0
  @l = l / 100.0
end

Class Method Details

.from_fraction(h = 0.0, s = 0.0, l = 0.0) ⇒ Object

Creates an HSL colour object from fractional values 0..1.



21
22
23
24
25
26
27
# File 'lib/color/hsl.rb', line 21

def from_fraction(h = 0.0, s = 0.0, l = 0.0)
  colour = Color::HSL.new
  colour.h = h
  colour.s = s
  colour.l = l
  colour
end

Instance Method Details

#==(other) ⇒ Object

Compares the other colour to this one. The other colour will be converted to HSL before comparison, so the comparison between a HSL colour and a non-HSL colour will be approximate and based on the other colour’s #to_hsl conversion. If there is no #to_hsl conversion, this will raise an exception. This will report that two HSL values are equivalent if all component values are within Color::COLOR_TOLERANCE of each other.



37
38
39
40
41
42
43
# File 'lib/color/hsl.rb', line 37

def ==(other)
  other = other.to_hsl
  other.kind_of?(Color::HSL) and
  ((@h - other.h).abs <= Color::COLOR_TOLERANCE) and
  ((@s - other.s).abs <= Color::COLOR_TOLERANCE) and
  ((@l - other.l).abs <= Color::COLOR_TOLERANCE)
end

#brightnessObject

Returns the luminosity (#l) of the colour.



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

def brightness
  @l
end

#css_hslObject

Present the colour as an HSL HTML/CSS colour string (e.g., “hsl(180, 25%, 35%)”).



74
75
76
# File 'lib/color/hsl.rb', line 74

def css_hsl
  "hsl(%3.2f, %3.2f%%, %3.2f%%)" % [ hue, saturation, luminosity ]
end

#css_hslaObject

Present the colour as an HSLA (with alpha) HTML/CSS colour string (e.g., “hsla(180, 25%, 35%, 1)”).



80
81
82
# File 'lib/color/hsl.rb', line 80

def css_hsla
  "hsla(%3.2f, %3.2f%%, %3.2f%%, %3.2f)" % [ hue, saturation, luminosity, 1 ]
end

#css_rgbObject

Present the colour as an RGB HTML/CSS colour string (e.g., “rgb(0%, 50%, 100%)”). Note that this will perform a #to_rgb operation using the default conversion formula.



61
62
63
# File 'lib/color/hsl.rb', line 61

def css_rgb
  to_rgb.css_rgb
end

#css_rgbaObject

Present the colour as an RGBA (with alpha) HTML/CSS colour string (e.g., “rgb(0%, 50%, 100%, 1)”). Note that this will perform a #to_rgb operation using the default conversion formula.



68
69
70
# File 'lib/color/hsl.rb', line 68

def css_rgba
  to_rgb.css_rgba
end

#hObject

Returns the hue of the colour in the range 0.0 .. 1.0.



150
151
152
# File 'lib/color/hsl.rb', line 150

def h
  @h
end

#h=(hh) ⇒ Object

Sets the hue of the colour in the range 0.0 .. 1.0.



164
165
166
# File 'lib/color/hsl.rb', line 164

def h=(hh)
  @h = Color.normalize(hh)
end

#htmlObject

Present the colour as an HTML/CSS colour string.



54
55
56
# File 'lib/color/hsl.rb', line 54

def html
  to_rgb.html
end

#hueObject

Returns the hue of the colour in degrees.



146
147
148
# File 'lib/color/hsl.rb', line 146

def hue
  @h * 360.0
end

#hue=(hh) ⇒ Object

Sets the hue of the colour in degrees. Colour is perceived as a wheel, so values should be set properly even with negative degree values.



155
156
157
158
159
160
161
162
# File 'lib/color/hsl.rb', line 155

def hue=(hh)
  hh = hh / 360.0

  hh += 1.0 if hh < 0.0
  hh -= 1.0 if hh > 1.0

  @h = Color.normalize(hh)
end

#inspectObject



207
208
209
# File 'lib/color/hsl.rb', line 207

def inspect
  "HSL [%.2f deg, %.2f%%, %.2f%%]" % [ hue, saturation, luminosity ]
end

#lObject

Returns the luminosity of the colour in the range 0.0 .. 1.0.



190
191
192
# File 'lib/color/hsl.rb', line 190

def l
  @l
end

#l=(ll) ⇒ Object

Sets the luminosity of the colour in the ragne 0.0 .. 1.0.



199
200
201
# File 'lib/color/hsl.rb', line 199

def l=(ll)
  @l = Color.normalize(ll)
end

#luminosityObject Also known as: lightness

Returns the percentage of luminosity of the colour.



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

def luminosity
  @l * 100.0
end

#luminosity=(ll) ⇒ Object Also known as: lightness=

Sets the percentage of luminosity of the colour.



194
195
196
# File 'lib/color/hsl.rb', line 194

def luminosity=(ll)
  @l = Color.normalize(ll / 100.0)
end

#mix_with(color, mix_percent = 0.5) ⇒ Object

Mix the mask colour (which will be converted to an HSL colour) with the current colour at the stated mix percentage as a decimal value.

NOTE

This differs from Color::RGB#mix_with.



215
216
217
218
219
220
221
222
# File 'lib/color/hsl.rb', line 215

def mix_with(color, mix_percent = 0.5)
  color   = color.to_hsl
  _h = ((color.h - self.h) * mix_percent) + self.h
  _s = ((color.s - self.s) * mix_percent) + self.s
  _l = ((color.l - self.l) * mix_percent) + self.l

  self.class.from_fraction(_h, _s, _l)
end

#sObject

Returns the saturation of the colour in the range 0.0 .. 1.0.



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

def s
  @s
end

#s=(ss) ⇒ Object

Sets the saturation of the colour in the ragne 0.0 .. 1.0.



180
181
182
# File 'lib/color/hsl.rb', line 180

def s=(ss)
  @s = Color.normalize(ss)
end

#saturationObject

Returns the percentage of saturation of the colour.



168
169
170
# File 'lib/color/hsl.rb', line 168

def saturation
  @s * 100.0
end

#saturation=(ss) ⇒ Object

Sets the percentage of saturation of the colour.



176
177
178
# File 'lib/color/hsl.rb', line 176

def saturation=(ss)
  @s = Color.normalize(ss / 100.0)
end

#to_cmykObject

Converts to RGB then CMYK.



132
133
134
# File 'lib/color/hsl.rb', line 132

def to_cmyk
  to_rgb.to_cmyk
end

#to_greyscaleObject Also known as: to_grayscale



140
141
142
# File 'lib/color/hsl.rb', line 140

def to_greyscale
  Color::GrayScale.from_fraction(@l)
end

#to_hslObject



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

def to_hsl
  self
end

#to_rgb(ignored = nil) ⇒ Object

Converting to HSL as adapted from Foley and Van-Dam from www.bobpowell.net/RGBHSB.htm.

NOTE:

  • If the colour’s luminosity is near zero, the colour is always black.

  • If the colour’s luminosity is near one, the colour is always white.

  • If the colour’s saturation is near zero, the colour is always a shade of grey and is based only on the luminosity of the colour.



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/color/hsl.rb', line 93

def to_rgb(ignored = nil)
  return Color::RGB.new if Color.near_zero_or_less?(@l)
  return Color::RGB.new(0xff, 0xff, 0xff) if Color.near_one_or_more?(@l)
  return Color::RGB.from_fraction(@l, @l, @l) if Color.near_zero?(@s)

  # Is the value less than 0.5?
  if Color.near_zero_or_less?(@l - 0.5)
    tmp2 = @l * (1.0 + @s.to_f)
  else
    tmp2 = @l + @s - (@l * @s.to_f)
  end
  tmp1 = 2.0 * @l - tmp2

  tmp3  = [ @h + (1.0 / 3.0), @h, @h - (1.0 / 3.0) ]

  rgb = tmp3.map { |hue|
    hue += 1.0 if Color.near_zero_or_less?(hue)
    hue -= 1.0 if Color.near_one_or_more?(hue)

    if Color.near_zero_or_less?((6.0 * hue) - 1.0)
      tmp1 + ((tmp2 - tmp1) * hue * 6.0)
    elsif Color.near_zero_or_less?((2.0 * hue) - 1.0)
      tmp2
    elsif Color.near_zero_or_less?((3.0 * hue) - 2.0)
      tmp1 + (tmp2 - tmp1) * ((2 / 3.0) - hue) * 6.0
    else
      tmp1
    end
  }

   Color::RGB.from_fraction(*rgb)
end

#to_yiqObject

Converts to RGB then YIQ.



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

def to_yiq
  to_rgb.to_yiq
end