class LIFX::LAN::Color

LIFX::Color represents a color intervally by HSBK (Hue, Saturation, Brightness/Value, Kelvin). It has methods to construct a LIFX::Color instance from various color representations.

Constants

DEFAULT_SIMILAR_THRESHOLD
KELVIN_MAX
KELVIN_MIN
UINT16_MAX

Public Class Methods

from_struct(hsbk) click to toggle source

Creates an instance from a {Protocol::Light::Hsbk} struct @api private @param hsbk [Protocol::Light::Hsbk] @return [Color]

# File lib/lifx/lan/color.rb, line 117
def from_struct(hsbk)
  new(
    (hsbk.hue.to_f / UINT16_MAX) * 360,
    (hsbk.saturation.to_f / UINT16_MAX),
    (hsbk.brightness.to_f / UINT16_MAX),
    hsbk.kelvin
  )
end
hsb(hue, saturation, brightness) click to toggle source

Helper method to create from HSB/HSV @param hue [Float] Valid range: `0..360` @param saturation [Float] Valid range: `0..1` @param brightness [Float] Valid range: `0..1` @return [Color]

# File lib/lifx/lan/color.rb, line 49
def hsb(hue, saturation, brightness)
  new(hue, saturation, brightness, DEFAULT_KELVIN)
end
Also aliased as: hsv
hsbk(hue, saturation, brightness, kelvin) click to toggle source

Helper method to create from HSBK/HSVK @param hue [Float] Valid range: `0..360` @param saturation [Float] Valid range: `0..1` @param brightness [Float] Valid range: `0..1` @param kelvin [Integer] Valid range: `2500..9000` @return [Color]

# File lib/lifx/lan/color.rb, line 60
def hsbk(hue, saturation, brightness, kelvin)
  new(hue, saturation, brightness, kelvin)
end
hsl(hue, saturation, luminance) click to toggle source

Helper method to create from HSL @param hue [Float] Valid range: `0..360` @param saturation [Float] Valid range: `0..1` @param luminance [Float] Valid range: `0..1` @return [Color]

# File lib/lifx/lan/color.rb, line 69
def hsl(hue, saturation, luminance)
  # From: http://ariya.blogspot.com.au/2008/07/converting-between-hsl-and-hsv.html
  l = luminance * 2
  saturation *= (l <= 1) ? l : 2 - l
  brightness = (l + saturation) / 2
  saturation = (2 * saturation) / (l + saturation)
  new(hue, saturation, brightness, DEFAULT_KELVIN)
end
hsv(hue, saturation, brightness)
Alias for: hsb
new(hue, saturation, brightness, kelvin) click to toggle source
Calls superclass method
# File lib/lifx/lan/color.rb, line 127
def initialize(hue, saturation, brightness, kelvin)
  hue = hue % 360
  super(hue, saturation, brightness, kelvin)
end
rgb(r, g, b) click to toggle source

Helper method to create from RGB. @note RGB is not the recommended way to create colors @param r [Integer] Red. Valid range: `0..255` @param g [Integer] Green. Valid range: `0..255` @param b [Integer] Blue. Valid range: `0..255` @return [Color]

# File lib/lifx/lan/color.rb, line 84
def rgb(r, g, b)
  r = r / 255.0
  g = g / 255.0
  b = b / 255.0

  max = [r, g, b].max
  min = [r, g, b].min

  h = s = v = max
  d = max - min
  s = max.zero? ? 0 : d / max

  if max == min
    h = 0
  else
    case max
    when r
      h = (g - b) / d + (g < b ? 6 : 0)
    when g
      h = (b - r) / d + 2
    when b
      h = (r - g) / d + 4
    end
    h = h * 60
  end

  new(h, s, v, DEFAULT_KELVIN)
end

Public Instance Methods

similar_to?(other, threshold: DEFAULT_SIMILAR_THRESHOLD) click to toggle source

@param other [Color] Color to compare to @param threshold: [Float] 0..1. Threshold to consider it similar @return [Boolean]

# File lib/lifx/lan/color.rb, line 183
def similar_to?(other, threshold: DEFAULT_SIMILAR_THRESHOLD)
  return false unless other.is_a?(Color)
  conditions = []

  conditions << (((hue - other.hue).abs < (threshold * 360)) || begin
    # FIXME: Surely there's a better way.
    hues = [hue, other.hue].sort
    hues[0] += 360
    (hues[0] - hues[1]).abs < (threshold * 360)
  end)
  conditions << ((saturation - other.saturation).abs < threshold)
  conditions << ((brightness - other.brightness).abs < threshold)
  conditions.all?
end
to_a() click to toggle source

Returns hue, saturation, brightness and kelvin in an array @return [Array<Float, Float, Float, Integer>]

# File lib/lifx/lan/color.rb, line 174
def to_a
  [hue, saturation, brightness, kelvin]
end
to_hsbk() click to toggle source

Returns a struct for use by the protocol @api private @return [Protocol::Light::Hsbk]

# File lib/lifx/lan/color.rb, line 163
def to_hsbk
  Protocol::Light::Hsbk.new(
    hue: (hue / 360.0 * UINT16_MAX).to_i,
    saturation: (saturation * UINT16_MAX).to_i,
    brightness: (brightness * UINT16_MAX).to_i,
    kelvin: [KELVIN_MIN, kelvin.to_i, KELVIN_MAX].sort[1]
  )
end
with_brightness(brightness) click to toggle source

Returns a new Color with the brightness changed while keeping other attributes @param brightness [Float] Brightness as float. `0..1` @return [Color]

# File lib/lifx/lan/color.rb, line 149
def with_brightness(brightness)
  Color.new(hue, saturation, brightness, kelvin)
end
with_hue(hue) click to toggle source

Returns a new Color with the hue changed while keeping other attributes @param hue [Float] Hue in degrees. `0..360` @return [Color]

# File lib/lifx/lan/color.rb, line 135
def with_hue(hue)
  Color.new(hue, saturation, brightness, kelvin)
end
with_kelvin(kelvin) click to toggle source

Returns a new Color with the kelvin changed while keeping other attributes @param kelvin [Integer] Kelvin. `2500..9000` @return [Color]

# File lib/lifx/lan/color.rb, line 156
def with_kelvin(kelvin)
  Color.new(hue, saturation, brightness, kelvin)
end
with_saturation(saturation) click to toggle source

Returns a new Color with the saturaiton changed while keeping other attributes @param saturaiton [Float] Saturation as float. `0..1` @return [Color]

# File lib/lifx/lan/color.rb, line 142
def with_saturation(saturation)
  Color.new(hue, saturation, brightness, kelvin)
end