// File: srajangarg[P]raytracer/src/core/stb_image.hpp
// Function: stbi__convert_format(unsigned char*, int, int, unsigned int, unsigned int)
static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)
{
   int i,j;
   unsigned char *good;

   if (req_comp == img_n) return data;
   STBI_ASSERT(req_comp >= 1 && req_comp <= 4);

   good = (unsigned char *) stbi__malloc(req_comp * x * y);
   if (good == NULL) {
      STBI_FREE(data);
      return stbi__errpuc("outofmem", "Out of memory");
   }

   for (j=0; j < (int) y; ++j) {
      unsigned char *src  = data + j * x * img_n   ;
      unsigned char *dest = good + j * x * req_comp;

      #define COMBO(a,b)  ((a)*8+(b))
      #define CASE(a,b)   case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
      // convert source image with img_n components to one with req_comp components;
      // avoid switch per pixel, so use switch per scanline and massive macros
      switch (COMBO(img_n, req_comp)) {
         CASE(1,2) dest[0]=src[0], dest[1]=255; break;
         CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break;
         CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break;
         CASE(2,1) dest[0]=src[0]; break;
         CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break;
         CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break;
         CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break;
         CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
         CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break;
         CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
         CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break;
         CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break;
         default: STBI_ASSERT(0);
      }
      #undef CASE
   }

   STBI_FREE(data);
   return good;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x10(%rbp)
movl %esi, -0x14(%rbp)
movl %edx, -0x18(%rbp)
movl %ecx, -0x1c(%rbp)
movl %r8d, -0x20(%rbp)
movl -0x18(%rbp), %eax
cmpl -0x14(%rbp), %eax
jne 0x30f5e
movq -0x10(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x314c7
xorl %eax, %eax
cmpl $0x1, -0x18(%rbp)
movb %al, -0x41(%rbp)
jl 0x30f73
cmpl $0x4, -0x18(%rbp)
setle %al
movb %al, -0x41(%rbp)
movb -0x41(%rbp), %al
testb $0x1, %al
jne 0x30f7c
jmp 0x30f7e
jmp 0x30f9d
leaq 0x17471(%rip), %rdi     # 0x483f6
leaq 0x17129(%rip), %rsi     # 0x480b5
movl $0x542, %edx            # imm = 0x542
leaq 0x1747d(%rip), %rcx     # 0x48415
callq 0x52c0
movl -0x18(%rbp), %eax
imull -0x1c(%rbp), %eax
imull -0x20(%rbp), %eax
movl %eax, %eax
movl %eax, %edi
callq 0x27f20
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
jne 0x30fe5
movq -0x10(%rbp), %rdi
callq 0x54c0
leaq 0x17019(%rip), %rdi     # 0x47fe5
callq 0x275b0
movl %eax, %ecx
xorl %eax, %eax
cmpl $0x0, %ecx
cmovneq %rax, %rax
movq %rax, -0x8(%rbp)
jmp 0x314c7
movl $0x0, -0x28(%rbp)
movl -0x28(%rbp), %eax
cmpl -0x20(%rbp), %eax
jge 0x314b6
movq -0x10(%rbp), %rax
movl -0x28(%rbp), %ecx
movl -0x1c(%rbp), %edx
imull %edx, %ecx
movl -0x14(%rbp), %edx
imull %edx, %ecx
addq %rcx, %rax
movq %rax, -0x38(%rbp)
movq -0x30(%rbp), %rax
movl -0x28(%rbp), %ecx
movl -0x1c(%rbp), %edx
imull %edx, %ecx
movl -0x18(%rbp), %edx
imull %edx, %ecx
addq %rcx, %rax
movq %rax, -0x40(%rbp)
movl -0x14(%rbp), %eax
movl -0x18(%rbp), %edx
movl %eax, %ecx
movl %edx, %eax
leal -0xa(%rax,%rcx,8), %eax
movl %eax, %ecx
movq %rcx, -0x50(%rbp)
subl $0x19, %eax
ja 0x31487
movq -0x50(%rbp), %rax
leaq 0x16c9c(%rip), %rcx     # 0x47cf0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movl -0x1c(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x24(%rbp)
cmpl $0x0, -0x24(%rbp)
jl 0x310a3
movq -0x38(%rbp), %rax
movb (%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, (%rax)
movq -0x40(%rbp), %rax
movb $-0x1, 0x1(%rax)
movl -0x24(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x24(%rbp)
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x40(%rbp)
jmp 0x31066
jmp 0x314a6
movl -0x1c(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x24(%rbp)
cmpl $0x0, -0x24(%rbp)
jl 0x310f4
movq -0x38(%rbp), %rax
movb (%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, 0x2(%rax)
movq -0x40(%rbp), %rax
movb %cl, 0x1(%rax)
movq -0x40(%rbp), %rax
movb %cl, (%rax)
movl -0x24(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x24(%rbp)
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rax
addq $0x3, %rax
movq %rax, -0x40(%rbp)
jmp 0x310b1
jmp 0x314a6
movl -0x1c(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x24(%rbp)
cmpl $0x0, -0x24(%rbp)
jl 0x3114d
movq -0x38(%rbp), %rax
movb (%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, 0x2(%rax)
movq -0x40(%rbp), %rax
movb %cl, 0x1(%rax)
movq -0x40(%rbp), %rax
movb %cl, (%rax)
movq -0x40(%rbp), %rax
movb $-0x1, 0x3(%rax)
movl -0x24(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x24(%rbp)
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x40(%rbp)
jmp 0x31102
jmp 0x314a6
movl -0x1c(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x24(%rbp)
cmpl $0x0, -0x24(%rbp)
jl 0x31190
movq -0x38(%rbp), %rax
movb (%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, (%rax)
movl -0x24(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x24(%rbp)
movq -0x38(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x3115b
jmp 0x314a6
movl -0x1c(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x24(%rbp)
cmpl $0x0, -0x24(%rbp)
jl 0x311e1
movq -0x38(%rbp), %rax
movb (%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, 0x2(%rax)
movq -0x40(%rbp), %rax
movb %cl, 0x1(%rax)
movq -0x40(%rbp), %rax
movb %cl, (%rax)
movl -0x24(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x24(%rbp)
movq -0x38(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rax
addq $0x3, %rax
movq %rax, -0x40(%rbp)
jmp 0x3119e
jmp 0x314a6
movl -0x1c(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x24(%rbp)
cmpl $0x0, -0x24(%rbp)
jl 0x31240
movq -0x38(%rbp), %rax
movb (%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, 0x2(%rax)
movq -0x40(%rbp), %rax
movb %cl, 0x1(%rax)
movq -0x40(%rbp), %rax
movb %cl, (%rax)
movq -0x38(%rbp), %rax
movb 0x1(%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, 0x3(%rax)
movl -0x24(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x24(%rbp)
movq -0x38(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x40(%rbp)
jmp 0x311ef
jmp 0x314a6
movl -0x1c(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x24(%rbp)
cmpl $0x0, -0x24(%rbp)
jl 0x312a7
movq -0x38(%rbp), %rax
movb (%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, (%rax)
movq -0x38(%rbp), %rax
movb 0x1(%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, 0x1(%rax)
movq -0x38(%rbp), %rax
movb 0x2(%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, 0x2(%rax)
movq -0x40(%rbp), %rax
movb $-0x1, 0x3(%rax)
movl -0x24(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x24(%rbp)
movq -0x38(%rbp), %rax
addq $0x3, %rax
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x40(%rbp)
jmp 0x3124e
jmp 0x314a6
movl -0x1c(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x24(%rbp)
cmpl $0x0, -0x24(%rbp)
jl 0x31302
movq -0x38(%rbp), %rax
movzbl (%rax), %edi
movq -0x38(%rbp), %rax
movzbl 0x1(%rax), %esi
movq -0x38(%rbp), %rax
movzbl 0x2(%rax), %edx
callq 0x332c0
movb %al, %cl
movq -0x40(%rbp), %rax
movb %cl, (%rax)
movl -0x24(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x24(%rbp)
movq -0x38(%rbp), %rax
addq $0x3, %rax
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x312b5
jmp 0x314a6
movl -0x1c(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x24(%rbp)
cmpl $0x0, -0x24(%rbp)
jl 0x31365
movq -0x38(%rbp), %rax
movzbl (%rax), %edi
movq -0x38(%rbp), %rax
movzbl 0x1(%rax), %esi
movq -0x38(%rbp), %rax
movzbl 0x2(%rax), %edx
callq 0x332c0
movb %al, %cl
movq -0x40(%rbp), %rax
movb %cl, (%rax)
movq -0x40(%rbp), %rax
movb $-0x1, 0x1(%rax)
movl -0x24(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x24(%rbp)
movq -0x38(%rbp), %rax
addq $0x3, %rax
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x40(%rbp)
jmp 0x31310
jmp 0x314a6
movl -0x1c(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x24(%rbp)
cmpl $0x0, -0x24(%rbp)
jl 0x313c0
movq -0x38(%rbp), %rax
movzbl (%rax), %edi
movq -0x38(%rbp), %rax
movzbl 0x1(%rax), %esi
movq -0x38(%rbp), %rax
movzbl 0x2(%rax), %edx
callq 0x332c0
movb %al, %cl
movq -0x40(%rbp), %rax
movb %cl, (%rax)
movl -0x24(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x24(%rbp)
movq -0x38(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x31373
jmp 0x314a6
movl -0x1c(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x24(%rbp)
cmpl $0x0, -0x24(%rbp)
jl 0x31429
movq -0x38(%rbp), %rax
movzbl (%rax), %edi
movq -0x38(%rbp), %rax
movzbl 0x1(%rax), %esi
movq -0x38(%rbp), %rax
movzbl 0x2(%rax), %edx
callq 0x332c0
movb %al, %cl
movq -0x40(%rbp), %rax
movb %cl, (%rax)
movq -0x38(%rbp), %rax
movb 0x3(%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, 0x1(%rax)
movl -0x24(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x24(%rbp)
movq -0x38(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x40(%rbp)
jmp 0x313ce
jmp 0x314a6
movl -0x1c(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x24(%rbp)
cmpl $0x0, -0x24(%rbp)
jl 0x31485
movq -0x38(%rbp), %rax
movb (%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, (%rax)
movq -0x38(%rbp), %rax
movb 0x1(%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, 0x1(%rax)
movq -0x38(%rbp), %rax
movb 0x2(%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, 0x2(%rax)
movl -0x24(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x24(%rbp)
movq -0x38(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rax
addq $0x3, %rax
movq %rax, -0x40(%rbp)
jmp 0x31434
jmp 0x314a6
leaq 0x17285(%rip), %rdi     # 0x48713
leaq 0x16c20(%rip), %rsi     # 0x480b5
movl $0x55f, %edx            # imm = 0x55F
leaq 0x16f74(%rip), %rcx     # 0x48415
callq 0x52c0
jmp 0x314a8
movl -0x28(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x28(%rbp)
jmp 0x30fec
movq -0x10(%rbp), %rdi
callq 0x54c0
movq -0x30(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)