// File: /workspace/github_c_makefile_star2_O1/eitijupaenoithoowohd[P]TBezierInterpolation/TBezierInterpolation.c
// Function: CalculateSpline
bool CalculateSpline( Point2D values[], int valuesSize, Segment bezier[])
{
	if (valuesSize < 3) {
		return false;
	}

	int n = valuesSize - 1;

	Point2D tgL= {0.0,0.0};
	Point2D tgR= {0.0,0.0};
	Point2D cur= {0.0,0.0};
	Point2D next = Point2DSubtract(&values[1] ,&values[0]);
	Point2D tmpPoint= {0.0,0.0};
	Point2DNormalize(&next);

	double l1 = 0.0, l2= 0.0, tmp= 0.0, x= 0.0;

	for (int i = 0; i < n; ++i) {
		bezier[i].points[0] = bezier[i].points[1] = values[i];
		bezier[i].points[2] = bezier[i].points[3] = values[i + 1];

		cur = next;
		tgL = tgR;

		if(i+1 < n){
			next = Point2DSubtract(&values[i + 2],&values[i + 1]);
			Point2DNormalize(&next);

			tgR = Point2DAdd(&cur,&next);
			Point2DNormalize(&tgR);
		}else{
			tgR.x= 0.0;
			tgR.y= 0.0;
		}

		if (fabs(values[i + 1].y - values[i].y) < EPSILON) {
			l1 = l2 = 0.0;
		} else {
			tmp = values[i + 1].x - values[i].x;
			l1 = fabs(tgL.x) > EPSILON ? tmp / (2.0 * tgL.x) : 1.0;
			l2 = fabs(tgR.x) > EPSILON ? tmp / (2.0 * tgR.x) : 1.0;
		}

		if (fabs(tgL.x) > EPSILON && fabs(tgR.x) > EPSILON) {
			tmp = tgL.y / tgL.x - tgR.y / tgR.x;
			if (fabs(tmp) > EPSILON) {
				x = (values[i + 1].y - tgR.y / tgR.x * values[i + 1].x - values[i].y + tgL.y / tgL.x * values[i].x) / tmp;
				if (x > values[i].x && x < values[i + 1].x) {
					if (tgL.y > 0.0) {
						if (l1 > l2)
							l1 = 0.0;
						else
							l2 = 0.0;
					} else {
						if (l1 < l2)
							l1 = 0.0;
						else
							l2 = 0.0;
					}
				}
			}
		}
		tmpPoint = Point2DMultiply(&tgL , l1);
		bezier[i].points[1] = Point2DAdd(&bezier[i].points[1],&tmpPoint);
		tmpPoint = Point2DMultiply(&tgR , l2);
		bezier[i].points[2] = Point2DSubtract(&bezier[i].points[2],&tmpPoint);
	}

	return true;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x48, %rsp
movq %rsi, 0x28(%rsp)
cmpl $0x3, %esi
jl 0x1696
movq %rdx, %r14
movq %rdi, %r15
movsd 0x10(%rdi), %xmm10
movsd 0x18(%rdi), %xmm9
subsd (%rdi), %xmm10
subsd 0x8(%rdi), %xmm9
movapd %xmm9, %xmm1
mulsd %xmm9, %xmm1
movapd %xmm10, %xmm0
mulsd %xmm10, %xmm0
addsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x12c8
sqrtsd %xmm0, %xmm0
jmp 0x12e7
movsd %xmm9, 0x8(%rsp)
movsd %xmm10, (%rsp)
callq 0x1040
movsd (%rsp), %xmm10
movsd 0x8(%rsp), %xmm9
divsd %xmm0, %xmm9
divsd %xmm0, %xmm10
movq 0x28(%rsp), %rax
leal -0x1(%rax), %r12d
movslq %r12d, %r13
addq $0x30, %r14
shlq $0x4, %r12
movl $0x1, %ebp
xorl %ebx, %ebx
movapd 0xd2b(%rip), %xmm12     # 0x2040
movsd 0xcfa(%rip), %xmm13     # 0x2018
movapd 0xd19(%rip), %xmm14     # 0x2040
xorpd %xmm0, %xmm0
xorpd %xmm1, %xmm1
movapd %xmm1, %xmm15
movsd %xmm0, 0x20(%rsp)
movups (%r15,%rbx), %xmm0
movups %xmm0, -0x20(%r14,%rbx,4)
movups (%r15,%rbx), %xmm0
movups %xmm0, -0x30(%r14,%rbx,4)
movups 0x10(%r15,%rbx), %xmm0
movups %xmm0, (%r14,%rbx,4)
movupd 0x10(%r15,%rbx), %xmm0
movupd %xmm0, -0x10(%r14,%rbx,4)
xorpd %xmm11, %xmm11
cmpq %r13, %rbp
jge 0x13ba
movsd 0x20(%r15,%rbx), %xmm2
movsd 0x28(%r15,%rbx), %xmm3
subsd 0x10(%r15,%rbx), %xmm2
subsd 0x18(%r15,%rbx), %xmm3
movapd %xmm3, %xmm1
mulsd %xmm3, %xmm1
movapd %xmm2, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
ucomisd 0xc75(%rip), %xmm0      # 0x2020
movapd %xmm15, 0x30(%rsp)
jb 0x13c7
sqrtsd %xmm0, %xmm0
jmp 0x13fe
xorpd %xmm1, %xmm1
xorpd %xmm0, %xmm0
jmp 0x14b4
movsd %xmm9, 0x8(%rsp)
movsd %xmm10, (%rsp)
movsd %xmm2, 0x18(%rsp)
movsd %xmm3, 0x10(%rsp)
callq 0x1040
movsd 0x10(%rsp), %xmm3
movsd 0x18(%rsp), %xmm2
movsd (%rsp), %xmm10
movsd 0x8(%rsp), %xmm9
divsd %xmm0, %xmm2
divsd %xmm0, %xmm3
addsd %xmm2, %xmm10
addsd %xmm3, %xmm9
movapd %xmm9, %xmm1
mulsd %xmm9, %xmm1
movapd %xmm10, %xmm0
mulsd %xmm10, %xmm0
addsd %xmm1, %xmm0
ucomisd 0xbf0(%rip), %xmm0      # 0x2020
jb 0x1438
sqrtsd %xmm0, %xmm0
jmp 0x146f
movsd %xmm9, 0x8(%rsp)
movsd %xmm10, (%rsp)
movsd %xmm2, 0x18(%rsp)
movsd %xmm3, 0x10(%rsp)
callq 0x1040
movsd 0x10(%rsp), %xmm3
movsd 0x18(%rsp), %xmm2
movsd (%rsp), %xmm10
movsd 0x8(%rsp), %xmm9
movapd 0xbc8(%rip), %xmm12     # 0x2040
movsd 0xb97(%rip), %xmm13     # 0x2018
movapd 0xbb6(%rip), %xmm14     # 0x2040
movapd 0x30(%rsp), %xmm15
xorpd %xmm11, %xmm11
divsd %xmm0, %xmm10
divsd %xmm0, %xmm9
movapd %xmm10, %xmm1
movapd %xmm9, %xmm0
movapd %xmm3, %xmm9
movapd %xmm2, %xmm10
leaq (%r15,%rbx), %rax
leaq (%r15,%rbx), %rcx
addq $0x10, %rcx
movsd -0x8(%rcx), %xmm4
movsd 0x8(%rcx), %xmm3
movapd %xmm3, %xmm2
subsd %xmm4, %xmm2
andpd %xmm12, %xmm2
ucomisd %xmm2, %xmm13
xorpd %xmm2, %xmm2
ja 0x1555
movsd (%rcx), %xmm5
subsd (%rax), %xmm5
movapd %xmm15, %xmm6
andpd %xmm14, %xmm6
movapd %xmm15, %xmm2
addsd %xmm15, %xmm2
movapd %xmm5, %xmm7
divsd %xmm2, %xmm7
movapd %xmm13, %xmm2
cmpltsd %xmm6, %xmm2
andpd %xmm2, %xmm7
movsd 0xaeb(%rip), %xmm8      # 0x2008
andnpd %xmm8, %xmm2
orpd %xmm7, %xmm2
movapd %xmm1, %xmm6
andpd %xmm14, %xmm6
movapd %xmm1, %xmm7
addsd %xmm1, %xmm7
divsd %xmm7, %xmm5
movapd %xmm13, %xmm11
cmpltsd %xmm6, %xmm11
andpd %xmm11, %xmm5
andnpd %xmm8, %xmm11
orpd %xmm5, %xmm11
movapd %xmm15, %xmm5
andpd %xmm14, %xmm5
ucomisd %xmm13, %xmm5
jbe 0x1628
movapd %xmm1, %xmm5
andpd %xmm14, %xmm5
ucomisd %xmm13, %xmm5
jbe 0x1628
movsd 0x20(%rsp), %xmm5
divsd %xmm15, %xmm5
movapd %xmm0, %xmm8
divsd %xmm1, %xmm8
movapd %xmm5, %xmm6
subsd %xmm8, %xmm6
movapd %xmm6, %xmm7
andpd %xmm12, %xmm7
ucomisd %xmm13, %xmm7
jbe 0x1628
movsd (%rcx), %xmm7
mulsd %xmm7, %xmm8
subsd %xmm8, %xmm3
subsd %xmm4, %xmm3
movsd (%rax), %xmm4
mulsd %xmm4, %xmm5
addsd %xmm3, %xmm5
divsd %xmm6, %xmm5
ucomisd %xmm4, %xmm5
jbe 0x1628
ucomisd %xmm5, %xmm7
jbe 0x1628
movsd 0x20(%rsp), %xmm3
ucomisd 0xa38(%rip), %xmm3      # 0x2020
jbe 0x160a
ucomisd %xmm11, %xmm2
xorpd %xmm3, %xmm3
ja 0x15f9
movapd %xmm2, %xmm3
movapd %xmm11, %xmm4
cmpltsd %xmm2, %xmm4
andpd %xmm4, %xmm11
jmp 0x1624
ucomisd %xmm2, %xmm11
xorpd %xmm3, %xmm3
ja 0x1619
movapd %xmm2, %xmm3
cmpltsd %xmm11, %xmm2
andpd %xmm2, %xmm11
movapd %xmm3, %xmm2
mulsd %xmm2, %xmm15
movsd 0x20(%rsp), %xmm3
mulsd %xmm2, %xmm3
addsd -0x20(%r14,%rbx,4), %xmm15
addsd -0x18(%r14,%rbx,4), %xmm3
movsd %xmm15, -0x20(%r14,%rbx,4)
movsd %xmm3, -0x18(%r14,%rbx,4)
movapd %xmm1, %xmm2
mulsd %xmm11, %xmm2
mulsd %xmm0, %xmm11
movsd -0x10(%r14,%rbx,4), %xmm3
subsd %xmm2, %xmm3
movsd -0x8(%r14,%rbx,4), %xmm2
subsd %xmm11, %xmm2
movsd %xmm3, -0x10(%r14,%rbx,4)
movsd %xmm2, -0x8(%r14,%rbx,4)
addq $0x10, %rbx
incq %rbp
cmpq %rbx, %r12
jne 0x132f
cmpl $0x3, 0x28(%rsp)
setge %al
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq