Class: Spectrum::HSL

Inherits:
Object
  • Object
show all
Defined in:
lib/spectrum/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%).



45
46
47
48
49
# File 'lib/spectrum/hsl.rb', line 45

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.



19
20
21
22
23
24
25
# File 'lib/spectrum/hsl.rb', line 19

def from_fraction(h = 0.0, s = 0.0, l = 0.0)
  colour = Spectrum::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 Spectrum::COLOR_TOLERANCE of each other.



35
36
37
38
39
40
41
# File 'lib/spectrum/hsl.rb', line 35

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

#brightnessObject

Returns the luminosity (#l) of the colour.



135
136
137
# File 'lib/spectrum/hsl.rb', line 135

def brightness
  @l
end

#css_hslObject

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



72
73
74
# File 'lib/spectrum/hsl.rb', line 72

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)”).



78
79
80
# File 'lib/spectrum/hsl.rb', line 78

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.



59
60
61
# File 'lib/spectrum/hsl.rb', line 59

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.



66
67
68
# File 'lib/spectrum/hsl.rb', line 66

def css_rgba
  to_rgb.css_rgba
end

#hObject

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



148
149
150
# File 'lib/spectrum/hsl.rb', line 148

def h
  @h
end

#h=(hh) ⇒ Object

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



162
163
164
# File 'lib/spectrum/hsl.rb', line 162

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

#htmlObject

Present the colour as an HTML/CSS colour string.



52
53
54
# File 'lib/spectrum/hsl.rb', line 52

def html
  to_rgb.html
end

#hueObject

Returns the hue of the colour in degrees.



144
145
146
# File 'lib/spectrum/hsl.rb', line 144

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.



153
154
155
156
157
158
159
160
# File 'lib/spectrum/hsl.rb', line 153

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



205
206
207
# File 'lib/spectrum/hsl.rb', line 205

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.



188
189
190
# File 'lib/spectrum/hsl.rb', line 188

def l
  @l
end

#l=(ll) ⇒ Object

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



197
198
199
# File 'lib/spectrum/hsl.rb', line 197

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

#luminosityObject Also known as: lightness

Returns the percentage of luminosity of the colour.



183
184
185
# File 'lib/spectrum/hsl.rb', line 183

def luminosity
  @l * 100.0
end

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

Sets the percentage of luminosity of the colour.



192
193
194
# File 'lib/spectrum/hsl.rb', line 192

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 Spectrum::RGB#mix_with.



213
214
215
216
217
218
219
220
# File 'lib/spectrum/hsl.rb', line 213

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.



170
171
172
# File 'lib/spectrum/hsl.rb', line 170

def s
  @s
end

#s=(ss) ⇒ Object

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



178
179
180
# File 'lib/spectrum/hsl.rb', line 178

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

#saturationObject

Returns the percentage of saturation of the colour.



166
167
168
# File 'lib/spectrum/hsl.rb', line 166

def saturation
  @s * 100.0
end

#saturation=(ss) ⇒ Object

Sets the percentage of saturation of the colour.



174
175
176
# File 'lib/spectrum/hsl.rb', line 174

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

#to_cmykObject

Converts to RGB then CMYK.



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

def to_cmyk
  to_rgb.to_cmyk
end

#to_greyscaleObject Also known as: to_grayscale



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

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

#to_hslObject



201
202
203
# File 'lib/spectrum/hsl.rb', line 201

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.



91
92
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
# File 'lib/spectrum/hsl.rb', line 91

def to_rgb(ignored = nil)
  return Spectrum::RGB.new if Color.near_zero_or_less?(@l)
  return Spectrum::RGB.new(0xff, 0xff, 0xff) if Color.near_one_or_more?(@l)
  return Spectrum::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
  }

   Spectrum::RGB.from_fraction(*rgb)
end

#to_yiqObject

Converts to RGB then YIQ.



125
126
127
# File 'lib/spectrum/hsl.rb', line 125

def to_yiq
  to_rgb.to_yiq
end