Module: Sass::Script::Functions

Defined in:
lib/sass-softlight.rb

Class Method Summary collapse

Instance Method Summary collapse

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