// File: kebwi[P]Trifid/src/ImageProcs.cpp
// Function: xyz2cielab(double, double, double, double&, double&, double&)
void xyz2cielab(Float_t x, Float_t y, Float_t z,
				Float_t &l, Float_t &a, Float_t &b)
{
	//assert(x >= 0 && x <= 1);
	//assert(y >= 0 && y <= 1);
	//assert(z >= 0 && z <= 1);
	
	//----------------------------------------------------------------------
	
	//Taken from http://www.easyrgb.com/math.php
	//and http://en.wikipedia.org/wiki/SRGB_color_space
	//and http://www.mediamacros.com/item/item-1006687658/
	//and http://www.cs.rit.edu/~ncs/color/t_convert.html
	
	//Two degree D65 white point tristimulus values
	x /= 95.047;
	y /= 100.0;
	z /= 108.883;
	
	if (x > 0.008856)
		x = pow(x, 1.0 / 3.0);
	else x = (7.787 * x) + (16.0 / 116.0);
	if (y > 0.008856)
		y = pow(y, 1.0 / 3.0);
	else y = (7.787 * y) + (16.0 / 116.0);
	if (z > 0.008856)
		z = pow(z, 1.0 / 3.0);
	else z = (7.787 * z) + (16.0 / 116.0);
	
	//This resource ( http://www.cs.rit.edu/~ncs/color/t_convert.html ) computes l like this:
	if (y > 0.008856)
		l = (116.0 * y) - 16.0;
	else l = 903.3 * y;
	//l = (116 * y) - 16;
	a = 500.0 * (x - y);
	b = 200.0 * (y - z);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movsd %xmm0, -0x8(%rbp)
movsd %xmm1, -0x10(%rbp)
movsd %xmm2, -0x18(%rbp)
movq %rdi, -0x20(%rbp)
movq %rsi, -0x28(%rbp)
movq %rdx, -0x30(%rbp)
movsd -0x8(%rbp), %xmm0
movsd 0x2c960(%rip), %xmm1    # 0x4ac40
divsd %xmm1, %xmm0
movsd %xmm0, -0x8(%rbp)
movsd -0x10(%rbp), %xmm0
movsd 0x2c942(%rip), %xmm1    # 0x4ac38
divsd %xmm1, %xmm0
movsd %xmm0, -0x10(%rbp)
movsd -0x18(%rbp), %xmm0
movsd 0x2c924(%rip), %xmm1    # 0x4ac30
divsd %xmm1, %xmm0
movsd %xmm0, -0x18(%rbp)
movsd -0x8(%rbp), %xmm0
movsd 0x2c906(%rip), %xmm1    # 0x4ac28
ucomisd %xmm1, %xmm0
jbe 0x1e341
movsd -0x8(%rbp), %xmm0
movsd 0x2c923(%rip), %xmm1    # 0x4ac58
callq 0x4610
movsd %xmm0, -0x8(%rbp)
jmp 0x1e363
movsd -0x8(%rbp), %xmm0
movsd 0x2c8fa(%rip), %xmm1    # 0x4ac48
mulsd %xmm1, %xmm0
movsd 0x2c8f6(%rip), %xmm1    # 0x4ac50
addsd %xmm1, %xmm0
movsd %xmm0, -0x8(%rbp)
movsd -0x10(%rbp), %xmm0
movsd 0x2c8b8(%rip), %xmm1    # 0x4ac28
ucomisd %xmm1, %xmm0
jbe 0x1e38f
movsd -0x10(%rbp), %xmm0
movsd 0x2c8d5(%rip), %xmm1    # 0x4ac58
callq 0x4610
movsd %xmm0, -0x10(%rbp)
jmp 0x1e3b1
movsd -0x10(%rbp), %xmm0
movsd 0x2c8ac(%rip), %xmm1    # 0x4ac48
mulsd %xmm1, %xmm0
movsd 0x2c8a8(%rip), %xmm1    # 0x4ac50
addsd %xmm1, %xmm0
movsd %xmm0, -0x10(%rbp)
movsd -0x18(%rbp), %xmm0
movsd 0x2c86a(%rip), %xmm1    # 0x4ac28
ucomisd %xmm1, %xmm0
jbe 0x1e3dd
movsd -0x18(%rbp), %xmm0
movsd 0x2c887(%rip), %xmm1    # 0x4ac58
callq 0x4610
movsd %xmm0, -0x18(%rbp)
jmp 0x1e3ff
movsd -0x18(%rbp), %xmm0
movsd 0x2c85e(%rip), %xmm1    # 0x4ac48
mulsd %xmm1, %xmm0
movsd 0x2c85a(%rip), %xmm1    # 0x4ac50
addsd %xmm1, %xmm0
movsd %xmm0, -0x18(%rbp)
movsd -0x10(%rbp), %xmm0
movsd 0x2c81c(%rip), %xmm1    # 0x4ac28
ucomisd %xmm1, %xmm0
jbe 0x1e439
movsd -0x10(%rbp), %xmm0
movsd 0x2c849(%rip), %xmm1    # 0x4ac68
mulsd %xmm1, %xmm0
movsd 0x2c845(%rip), %xmm1    # 0x4ac70
addsd %xmm1, %xmm0
movq -0x20(%rbp), %rax
movsd %xmm0, (%rax)
jmp 0x1e44e
movsd 0x2c81f(%rip), %xmm0    # 0x4ac60
mulsd -0x10(%rbp), %xmm0
movq -0x20(%rbp), %rax
movsd %xmm0, (%rax)
movsd -0x8(%rbp), %xmm1
subsd -0x10(%rbp), %xmm1
movsd 0x2c820(%rip), %xmm0    # 0x4ac80
mulsd %xmm1, %xmm0
movq -0x28(%rbp), %rax
movsd %xmm0, (%rax)
movsd -0x10(%rbp), %xmm1
subsd -0x18(%rbp), %xmm1
movsd 0x2c7fa(%rip), %xmm0    # 0x4ac78
mulsd %xmm1, %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, (%rax)
addq $0x30, %rsp
popq %rbp
retq