Module: Sass::Script::Functions
- Defined in:
- lib/sass-softlight.rb
Class Method Summary collapse
Instance Method Summary collapse
- #blend(s_a, s_ca, d_a, d_ca) ⇒ Object
- #denormalize(x) ⇒ Object
- #normalize(x) ⇒ Object
- #premultiply(arg) ⇒ Object
- #scale(arg) ⇒ Object
- #union(x, y) ⇒ Object
- #unscale(arg) ⇒ Object
Class Method Details
.softlight(source, canvas) ⇒ Object
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/sass-softlight.rb', line 58 def self.softlight( source, canvas ) Sass::Script::assert_type source, :Color Sass::Script::assert_type canvas, :Color src = { :r => source.red, :g => source.green, :b => source.blue, :alpha => source.alpha } dest = { :r => canvas.red, :g => canvas.green, :b => canvas.blue, :alpha => canvas.alpha } alpha_s = src[:alpha] alpha_d = dest[:alpha] composite = {} alpha_r = union( alpha_d, alpha_s ) if alpha_r == 0 then alpha_r = 1e-10 end normal_source = premultiply( scale( src ) ) normal_canvas = premultiply( scale( dest ) ) normal_source.each do | key, val | if key == :alpha then next end composite[ key ] = blend(alpha_s, normal_source[key], alpha_d, normal_canvas[key]) end composite[ :alpha ] = alpha_r c = unscale( composite ) Sass::Script::Color.new( { :red => c[:r], :green => c[:g], :blue => c[:b], :alpha => c[:alpha] } ) end |
Instance Method Details
#blend(s_a, s_ca, d_a, d_ca) ⇒ Object
46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/sass-softlight.rb', line 46 def blend( s_a, s_ca, d_a, d_ca ) m = d_ca / d_a if 2 * s_ca <= s_a d_ca_prime = d_ca * (s_a + (2 * s_ca - s_a) * (1 - m)) + s_ca * (1 - d_a) + d_ca * (1 - s_a) elsif 2 * s_ca > s_a and 4 * d_ca <= d_a d_ca_prime = d_ca * s_a + d_a * (2 * s_ca - s_a) * (4 * m * (4 * m + 1) * (m - 1) + 7 * m) + s_ca * (1 - d_a) + d_ca * (1 - s_a) elsif 2 * s_ca > s_a and 4 * d_ca > d_a d_ca_prime = d_a * (2 * s_ca - s_a) * (m**0.5 - m) + s_ca - s_ca * d_a + d_ca end d_ca_prime end |
#denormalize(x) ⇒ Object
8 9 10 |
# File 'lib/sass-softlight.rb', line 8 def denormalize( x ) x * 255 end |
#normalize(x) ⇒ Object
4 5 6 |
# File 'lib/sass-softlight.rb', line 4 def normalize( x ) x / 255 end |
#premultiply(arg) ⇒ Object
32 33 34 35 36 37 38 39 40 |
# File 'lib/sass-softlight.rb', line 32 def premultiply( arg ) _rgba = {} arg.each do | key, val | if key == :alpha then next end _rgba[ key ] = val * arg[ :alpha ] end _rgba[:alpha] = arg[:alpha] _rgba end |
#scale(arg) ⇒ Object
12 13 14 15 16 17 18 19 20 |
# File 'lib/sass-softlight.rb', line 12 def scale( arg ) _rgba_unscaled = {} arg.each do | key, val | if key == :alpha then next end _rgba_unscaled[ key ] = normalize( val.to_f ) end _rgba_unscaled[ :alpha ] = arg[ :alpha ] _rgba_unscaled end |
#union(x, y) ⇒ Object
42 43 44 |
# File 'lib/sass-softlight.rb', line 42 def union( x, y ) x + y - ( x * y ) end |
#unscale(arg) ⇒ Object
22 23 24 25 26 27 28 29 30 |
# File 'lib/sass-softlight.rb', line 22 def unscale( arg ) _rgba_unscaled = {} arg.each do | key, val | if key == :alpha then next end _rgba_unscaled[ key ] = denormalize( val ).to_i end _rgba_unscaled[ :alpha ] = arg[ :alpha ] _rgba_unscaled end |