// File: matthewarcus[P]mmps/transform.cpp
// Function: Transform::TransformImage(Image const&, Image&, TransformParams const&)
void Transform::TransformImage(const Image& inImage, Image& outImage,
			       const TransformParams& params)
{
  int ow = outImage.Width();
  int oh = outImage.Height();
  double orgx = 0.5 * ow;
  double orgy = 0.5 * oh;
  // Scale so that half width is 1
  double scaleFactor = BasicScale(ow,oh) / params.scale;
  int ox, oy; int outIndex = 0;
  //fprintf(stderr,"Rotation %g %g %g %g\n",
  //        params.rotate, params.xoff, params.yoff, scaleFactor);
  for (oy = 0; oy < oh; oy++) {
    double y = scaleFactor * (orgy - oy - 0.5) + params.yoff;
    if (params.rotate == 0) SetY(y);
    for (ox = 0; ox < ow; ox++, outIndex++) {
      // Really ought to just apply a 3x2 matrix to the point
      double x = scaleFactor * (ox + 0.5 - orgx) + params.xoff;
      double x1 = x;
      double y1 = y;
      if (params.rotate != 0) {
	applyRotation(-params.rotate,x1,y1);
	SetY(y1);
      }
      double x0 = 0.0, y0 = 0.0, z0 = 0.0;
      double phi = 0.0, lambda = 0.0;
      if (Project(params, x1, y1, x0, y0, z0, phi, lambda) &&
	  CheckPoint(params,phi, lambda)) {
	SetData(inImage, outImage, params, x0, y0, z0, phi, lambda, outIndex);
      } else if (!params.noback) {
	outImage.SetRgb(outIndex, params.background);
      }
    }
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xb0, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0x18(%rbp), %rdi
callq 0x74e0
movl %eax, -0x24(%rbp)
movq -0x18(%rbp), %rdi
callq 0x7500
movq -0xa0(%rbp), %rdi
movl %eax, -0x28(%rbp)
cvtsi2sdl -0x24(%rbp), %xmm1
movsd 0xc586(%rip), %xmm0     # 0x15408
mulsd %xmm1, %xmm0
movsd %xmm0, -0x30(%rbp)
cvtsi2sdl -0x28(%rbp), %xmm1
movsd 0xc570(%rip), %xmm0     # 0x15408
mulsd %xmm1, %xmm0
movsd %xmm0, -0x38(%rbp)
movl -0x24(%rbp), %esi
movl -0x28(%rbp), %edx
movq (%rdi), %rax
callq *0x18(%rax)
movq -0x20(%rbp), %rax
divsd 0x28(%rax), %xmm0
movsd %xmm0, -0x40(%rbp)
movl $0x0, -0x4c(%rbp)
movl $0x0, -0x48(%rbp)
movl -0x48(%rbp), %eax
cmpl -0x28(%rbp), %eax
jge 0x910b
movsd -0x40(%rbp), %xmm0
movsd -0x38(%rbp), %xmm2
cvtsi2sdl -0x48(%rbp), %xmm1
subsd %xmm1, %xmm2
movsd 0xc518(%rip), %xmm1     # 0x15408
subsd %xmm1, %xmm2
movq -0x20(%rbp), %rax
movsd 0xb8(%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x58(%rbp)
movq -0x20(%rbp), %rax
movsd 0x10(%rax), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x8f32
jp 0x8f32
movq -0xa0(%rbp), %rdi
movsd -0x58(%rbp), %xmm0
movq (%rdi), %rax
callq *(%rax)
movl $0x0, -0x44(%rbp)
movl -0x44(%rbp), %eax
cmpl -0x24(%rbp), %eax
jge 0x90fb
movsd -0x40(%rbp), %xmm0
cvtsi2sdl -0x44(%rbp), %xmm2
movsd 0xc4b1(%rip), %xmm1     # 0x15408
addsd %xmm1, %xmm2
subsd -0x30(%rbp), %xmm2
movq -0x20(%rbp), %rax
movsd 0xb0(%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x60(%rbp)
movsd -0x60(%rbp), %xmm0
movsd %xmm0, -0x68(%rbp)
movsd -0x58(%rbp), %xmm0
movsd %xmm0, -0x70(%rbp)
movq -0x20(%rbp), %rax
movsd 0x10(%rax), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x8fa3
jp 0x8fa3
jmp 0x8fe1
movq -0x20(%rbp), %rax
movsd 0x10(%rax), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
leaq -0x68(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x8d30
movq -0xa0(%rbp), %rdi
movsd -0x70(%rbp), %xmm0
movq (%rdi), %rax
callq *(%rax)
movq -0xa0(%rbp), %rdi
xorps %xmm0, %xmm0
movsd %xmm0, -0x78(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x80(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x88(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x90(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x98(%rbp)
movq -0x20(%rbp), %rsi
movsd -0x68(%rbp), %xmm0
movsd -0x70(%rbp), %xmm1
movq (%rdi), %rax
leaq -0x78(%rbp), %rdx
leaq -0x80(%rbp), %rcx
leaq -0x88(%rbp), %r8
leaq -0x90(%rbp), %r9
leaq -0x98(%rbp), %r10
movq %r10, (%rsp)
callq *0x20(%rax)
testb $0x1, %al
jne 0x9054
jmp 0x90bb
movq -0xa0(%rbp), %rdi
movq -0x20(%rbp), %rsi
movsd -0x90(%rbp), %xmm0
movsd -0x98(%rbp), %xmm1
movq (%rdi), %rax
callq *0x30(%rax)
testb $0x1, %al
jne 0x907b
jmp 0x90bb
movq -0xa0(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movsd -0x78(%rbp), %xmm0
movsd -0x80(%rbp), %xmm1
movsd -0x88(%rbp), %xmm2
movsd -0x90(%rbp), %xmm3
movsd -0x98(%rbp), %xmm4
movl -0x4c(%rbp), %r8d
callq 0x8a80
jmp 0x90e2
movq -0x20(%rbp), %rax
testb $0x1, 0x98(%rax)
jne 0x90e0
movq -0x18(%rbp), %rdi
movslq -0x4c(%rbp), %rsi
movq -0x20(%rbp), %rdx
addq $0xc0, %rdx
callq 0x7590
jmp 0x90e2
jmp 0x90e4
movl -0x44(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x44(%rbp)
movl -0x4c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x4c(%rbp)
jmp 0x8f39
jmp 0x90fd
movl -0x48(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x48(%rbp)
jmp 0x8ec9
addq $0xb0, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)