module Sass::Extras::YUV::Functions

Public Class Methods

included(base) click to toggle source
# File lib/sass/extras/yuv.rb, line 27
def self.included(base)
  base.declare :yuv, [:y, :u, :v]
  base.declare :yuva, [:y, :u, :v, :alpha]
  base.declare :set_brightness, [:color, :amount]
  base.declare :increase_brightness, [:color, :amount]
  base.declare :reduce_brightness, [:color, :amount]
  base.declare :add_brightness, [:color, :amount]
  base.declare :detract_brightness, [:color, :amount]
end

Public Instance Methods

add_brightness(color, amount) click to toggle source

@param color [Color] @param amount [Number] between 0 and 1.0, or 0% and 100%

# File lib/sass/extras/yuv.rb, line 94
def add_brightness(color, amount)
  adjust_brightness(color, amount) { |c, y| [y + c, 1.0].min }
end
detract_brightness(color, amount) click to toggle source

@param color [Color] @param amount [Number] between 0 and 1.0, or 0% and 100%

# File lib/sass/extras/yuv.rb, line 100
def detract_brightness(color, amount)
  adjust_brightness(color, amount) { |c, y| [y - c, 0.0].max }
end
increase_brightness(color, amount) click to toggle source

@param color [Color] @param amount [Number] between 0 and 1.0, or 0% and 100%

# File lib/sass/extras/yuv.rb, line 82
def increase_brightness(color, amount)
  adjust_brightness(color, amount) { |c, y| [(1 + c) * y, 1.0].min }
end
reduce_brightness(color, amount) click to toggle source

@param color [Color] @param amount [Number] between 0 and 1.0, or 0% and 100%

# File lib/sass/extras/yuv.rb, line 88
def reduce_brightness(color, amount)
  adjust_brightness(color, amount) { |c, y| [(1 - c) * y, 0.0].max }
end
set_brightness(color, amount) click to toggle source

@param color [Color] @param amount [Number] between 0 and 1.0, or 0% and 100%

# File lib/sass/extras/yuv.rb, line 76
def set_brightness(color, amount)
  adjust_brightness(color, amount) { |c, _| c }
end
yuv(y, u, v) click to toggle source

Creates a {Color} object from luma (Y), and two chrominance (UV) values.

@param y [Number]

A number between 0 and 1.0 inclusive

@param u [Number]

A number between -{U_MAX} and +{U_MAX} inclusive

@param v [Number]

A number between -{V_MAX} and +{V_MAX} inclusive

@return [Color]

# File lib/sass/extras/yuv.rb, line 46
def yuv(y, u, v)
  assert_type y, :Number, :y
  assert_type u, :Number, :u
  assert_type v, :Number, :v

  yv = y.value
  if y.numerator_units == ["%"] && y.denominator_units.empty?
    fail ArgumentError, "Brightness (Y') value #{y} must be between 0% and 100% inclusive" unless (0..100).include?(y.value)
    yv /= 100.0
  else
    fail ArgumentError, "Brightness (Y') value #{y} must be between 0 and 1.0 inclusive" unless (0..1.0).include?(y.value)
  end
  fail ArgumentError, "Chrominance (U) value #{u} must be between -#{U_MAX} and #{U_MAX} inclusive" unless (-U_MAX..U_MAX).include?(u.value)
  fail ArgumentError, "Chrominance (V) value #{v} must be between -#{V_MAX} and #{V_MAX} inclusive" unless (-V_MAX..V_MAX).include?(v.value)

  r = yv + v.value * (1 - WR) / (V_MAX)
  g = yv - u.value * (WB * (1 - WB)) / (V_MAX * WG) - v.value * (WR * (1 - WR)) / (V_MAX * WG)
  b = yv + u.value * (1 - WB) / U_MAX

  rgb = [r, g, b].map { |c| [0, [255, c * 255].min].max }
  Sass::Script::Color.new(rgb)
end
yuva(y, u, v, a) click to toggle source
# File lib/sass/extras/yuv.rb, line 69
def yuva(y, u, v, a)
  assert_type a, :Number, :a
  yuv(y, u, v).with(alpha: a.value)
end

Protected Instance Methods

adjust_brightness(color, amount) { |c, value| ... } click to toggle source
# File lib/sass/extras/yuv.rb, line 106
def adjust_brightness(color, amount)
  y, u, v, a = color.yuva.map { |x| Sass::Script::Number.new x }
  c = amount.value
  if amount.numerator_units == ["%"] && amount.denominator_units.empty?
    fail ArgumentError, "Amount value #{amount} must be between 0% and 100% inclusive" unless (0..100).include?(c)
    c /= 100.0
  else
    fail ArgumentError, "Amount value #{amount} must be between 0 and 1.0 inclusive" unless (0..1.0).include?(c)
  end
  y = Sass::Script::Number.new yield(c, y.value)
  yuva(y, u, v, a)
end