// File: /workspace/github_cpp_makefile_star2_O1/wcochran[P]pano_to_cube/pano2cube.cpp
// Function: cylindricalPanoramaToCube(PPM const&, PPM&)
void cylindricalPanoramaToCube(const PPM& inImage, PPM& outImage) {
  for (int row = 0; row < outImage.H; row++) {
    for (int col = 0; col < outImage.W; col++) {
      const double s = 4.0*col/outImage.W;
      const int face = static_cast<int>(floorf(s));
      const double f = s - face;
      float u,v,w;
      switch(face) {
      case 0:
	u = 1;
	v = 2*f - 1;
	break;
      case 1:
	u = 1 - 2*f;
	v = 1;
	break;
      case 2:
	u = -1;
	v = 1 - 2*f;
	break;
      default:
	u = 2*f - 1;
	v = -1;
      }
      w = 2.0*row/outImage.H - 1;
      const float a = 1/sqrtf(u*u + v*v);
      const float x = a*u;
      const float y = a*v;
      const float z = a*w;
      float theta = atan2(y,x) + M_PI/4;
      if (theta < 0) theta += 2*M_PI;
      const float r = inImage.H*(z + 1)/2.0;
      const float c = inImage.W*theta/(2*M_PI);
      float inpix[3];
      inImage.bilerp(r,c,inpix);
      unsigned char *outpix = outImage(row,col);
      for (int i = 0; i < 3; i++)
	outpix[i] = static_cast<unsigned char>(inpix[i] + 0.5);
    }
  }
}

// Assembly:
cmpl $0x0, 0x4(%rsi)
jle 0x2698
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x30, %rsp
movq %rsi, %rbx
movq %rdi, %r14
xorl %r12d, %r12d
leaq 0x24(%rsp), %r15
movl (%rbx), %eax
testl %eax, %eax
jle 0x267f
leal (%r12,%r12), %ecx
xorps %xmm0, %xmm0
cvtsi2sd %rcx, %xmm0
movsd %xmm0, 0x18(%rsp)
xorl %ebp, %ebp
xorps %xmm1, %xmm1
cvtsi2sd %ebp, %xmm1
xorps %xmm0, %xmm0
cvtsi2sd %eax, %xmm0
mulsd 0x1b94(%rip), %xmm1     # 0x4008
divsd %xmm0, %xmm1
movsd %xmm1, (%rsp)
xorps %xmm0, %xmm0
cvtsd2ss %xmm1, %xmm0
callq 0x2090
movsd (%rsp), %xmm2
cvttss2si %xmm0, %eax
cvttps2dq %xmm0, %xmm0
cvtdq2pd %xmm0, %xmm0
subsd %xmm0, %xmm2
addsd %xmm2, %xmm2
cmpl $0x2, %eax
je 0x24ea
cmpl $0x1, %eax
movsd 0x1b66(%rip), %xmm1     # 0x4018
je 0x24cd
testl %eax, %eax
jne 0x250f
addsd %xmm1, %xmm2
xorps %xmm3, %xmm3
cvtsd2ss %xmm2, %xmm3
movss 0x1b71(%rip), %xmm4     # 0x403c
jmp 0x2522
movsd 0x1b3b(%rip), %xmm0     # 0x4010
subsd %xmm2, %xmm0
xorps %xmm4, %xmm4
cvtsd2ss %xmm0, %xmm4
movss 0x1b54(%rip), %xmm3     # 0x403c
jmp 0x2522
movsd 0x1b1e(%rip), %xmm0     # 0x4010
subsd %xmm2, %xmm0
xorps %xmm3, %xmm3
cvtsd2ss %xmm0, %xmm3
movss 0x1b33(%rip), %xmm4     # 0x4038
movsd 0x1b0b(%rip), %xmm1     # 0x4018
jmp 0x2522
addsd %xmm1, %xmm2
xorps %xmm4, %xmm4
cvtsd2ss %xmm2, %xmm4
movss 0x1b16(%rip), %xmm3     # 0x4038
xorps %xmm0, %xmm0
cvtsi2sdl 0x4(%rbx), %xmm0
movsd 0x18(%rsp), %xmm2
divsd %xmm0, %xmm2
addsd %xmm1, %xmm2
movaps %xmm3, %xmm1
mulss %xmm3, %xmm1
movaps %xmm4, %xmm0
mulss %xmm4, %xmm0
addss %xmm1, %xmm0
ucomiss 0x1af3(%rip), %xmm0     # 0x4044
jb 0x2559
sqrtss %xmm0, %xmm0
jmp 0x2580
movss %xmm3, (%rsp)
movss %xmm4, 0xc(%rsp)
movsd %xmm2, 0x10(%rsp)
callq 0x2290
movsd 0x10(%rsp), %xmm2
movss 0xc(%rsp), %xmm4
movss (%rsp), %xmm3
xorps %xmm1, %xmm1
cvtsd2ss %xmm2, %xmm1
movss 0x1aad(%rip), %xmm2     # 0x403c
divss %xmm0, %xmm2
mulss %xmm2, %xmm4
mulss %xmm2, %xmm3
mulss %xmm1, %xmm2
movss %xmm2, (%rsp)
xorps %xmm0, %xmm0
cvtss2sd %xmm3, %xmm0
xorps %xmm1, %xmm1
cvtss2sd %xmm4, %xmm1
callq 0x2040
addsd 0x1a61(%rip), %xmm0     # 0x4020
cvtsd2ss %xmm0, %xmm0
xorps %xmm1, %xmm1
cvtss2sd %xmm0, %xmm1
movsd 0x1a56(%rip), %xmm4     # 0x4028
addsd %xmm4, %xmm1
cvtsd2ss %xmm1, %xmm1
movaps %xmm0, %xmm2
cmpltss 0x1a5e(%rip), %xmm2     # 0x4044
movaps %xmm2, %xmm3
andnps %xmm0, %xmm3
andps %xmm1, %xmm2
xorps %xmm0, %xmm0
cvtsi2ssl 0x4(%r14), %xmm0
orps %xmm3, %xmm2
movss (%rsp), %xmm1
addss 0x1a34(%rip), %xmm1     # 0x403c
mulss %xmm0, %xmm1
mulss 0x1a2c(%rip), %xmm1     # 0x4040
movaps %xmm1, %xmm0
xorps %xmm1, %xmm1
cvtsi2ssl (%r14), %xmm1
mulss %xmm2, %xmm1
cvtss2sd %xmm1, %xmm1
divsd %xmm4, %xmm1
cvtsd2ss %xmm1, %xmm1
movq %r14, %rdi
movq %r15, %rsi
callq 0x3202
movl (%rbx), %eax
imull %r12d, %eax
addl %ebp, %eax
cltq
leaq (%rax,%rax,2), %rax
addq 0x8(%rbx), %rax
xorl %ecx, %ecx
movsd 0x19da(%rip), %xmm1     # 0x4030
xorps %xmm0, %xmm0
cvtss2sd 0x24(%rsp,%rcx,4), %xmm0
addsd %xmm1, %xmm0
cvttsd2si %xmm0, %edx
movb %dl, (%rax,%rcx)
incq %rcx
cmpq $0x3, %rcx
jne 0x2656
incl %ebp
movl (%rbx), %eax
cmpl %eax, %ebp
jl 0x245e
incl %r12d
cmpl 0x4(%rbx), %r12d
jl 0x2440
addq $0x30, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq