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



33
34
35
36
37
# File 'lib/color/hsl.rb', line 33

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.



7
8
9
10
11
12
13
# File 'lib/color/hsl.rb', line 7

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.



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

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.



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

def brightness
  @l
end

#css_hslObject

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



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

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



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

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.



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

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.



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

def css_rgba
  to_rgb.css_rgba
end

#hObject

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



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

def h
  @h
end

#h=(hh) ⇒ Object

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



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

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

#htmlObject

Present the colour as an HTML/CSS colour string.



40
41
42
# File 'lib/color/hsl.rb', line 40

def html
  to_rgb.html
end

#hueObject

Returns the hue of the colour in degrees.



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

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.



141
142
143
144
145
146
147
148
# File 'lib/color/hsl.rb', line 141

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



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

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.



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

def l
  @l
end

#l=(ll) ⇒ Object

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



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

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

#luminosityObject Also known as: lightness

Returns the percentage of luminosity of the colour.



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

def luminosity
  @l * 100.0
end

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

Sets the percentage of luminosity of the colour.



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

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.



201
202
203
204
205
206
207
208
# File 'lib/color/hsl.rb', line 201

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.



158
159
160
# File 'lib/color/hsl.rb', line 158

def s
  @s
end

#s=(ss) ⇒ Object

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



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

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

#saturationObject

Returns the percentage of saturation of the colour.



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

def saturation
  @s * 100.0
end

#saturation=(ss) ⇒ Object

Sets the percentage of saturation of the colour.



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

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

#to_cmykObject

Converts to RGB then CMYK.



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

def to_cmyk
  to_rgb.to_cmyk
end

#to_greyscaleObject Also known as: to_grayscale



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

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

#to_hslObject



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

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.



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
# File 'lib/color/hsl.rb', line 79

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.



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

def to_yiq
  to_rgb.to_yiq
end