// File: /workspace/github_cpp_makefile_star2_O1/phillip-h[P]fractal-gen/lodepng.cpp
// Function: lodepng_convert(unsigned char*, unsigned char const*, LodePNGColorMode const*, LodePNGColorMode const*, unsigned int, unsigned int)
unsigned lodepng_convert(unsigned char* out, const unsigned char* in,
                         const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in,
                         unsigned w, unsigned h)
{
  size_t i;
  ColorTree tree;
  size_t numpixels = w * h;

  if(lodepng_color_mode_equal(mode_out, mode_in))
  {
    size_t numbytes = lodepng_get_raw_size(w, h, mode_in);
    for(i = 0; i != numbytes; ++i) out[i] = in[i];
    return 0;
  }

  if(mode_out->colortype == LCT_PALETTE)
  {
    size_t palettesize = mode_out->palettesize;
    const unsigned char* palette = mode_out->palette;
    size_t palsize = 1u << mode_out->bitdepth;
    /*if the user specified output palette but did not give the values, assume
    they want the values of the input color type (assuming that one is palette).
    Note that we never create a new palette ourselves.*/
    if(palettesize == 0)
    {
      palettesize = mode_in->palettesize;
      palette = mode_in->palette;
    }
    if(palettesize < palsize) palsize = palettesize;
    color_tree_init(&tree);
    for(i = 0; i != palsize; ++i)
    {
      const unsigned char* p = &palette[i * 4];
      color_tree_add(&tree, p[0], p[1], p[2], p[3], i);
    }
  }

  if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16)
  {
    for(i = 0; i != numpixels; ++i)
    {
      unsigned short r = 0, g = 0, b = 0, a = 0;
      getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in);
      rgba16ToPixel(out, i, mode_out, r, g, b, a);
    }
  }
  else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA)
  {
    getPixelColorsRGBA8(out, numpixels, 1, in, mode_in);
  }
  else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB)
  {
    getPixelColorsRGBA8(out, numpixels, 0, in, mode_in);
  }
  else
  {
    unsigned char r = 0, g = 0, b = 0, a = 0;
    for(i = 0; i != numpixels; ++i)
    {
      getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in);
      CERROR_TRY_RETURN(rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a));
    }
  }

  if(mode_out->colortype == LCT_PALETTE)
  {
    color_tree_cleanup(&tree);
  }

  return 0; /*no error*/
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xb8, %rsp
movl %r9d, %r13d
movl %r8d, %r12d
movq %rcx, %r14
movq %rdx, %rbp
movq %rsi, %r15
movq %rdi, %rbx
movq %rdx, %rdi
movq %rcx, %rsi
callq 0x8496
testl %eax, %eax
je 0x8037
movl %r12d, %edi
movl %r13d, %esi
movq %r14, %rdx
callq 0x77ae
xorl %r13d, %r13d
testq %rax, %rax
je 0x847e
xorl %ecx, %ecx
movb (%r15,%rcx), %dl
movb %dl, (%rbx,%rcx)
incq %rcx
cmpq %rcx, %rax
jne 0x8023
jmp 0x847e
movq %r14, 0x28(%rsp)
movq %rbx, 0x18(%rsp)
imull %r12d, %r13d
movq %r13, 0x20(%rsp)
cmpl $0x3, (%rbp)
jne 0x80e0
movq 0x10(%rbp), %rax
movb 0x4(%rbp), %cl
movl $0x1, %edx
shlxq %rcx, %rdx, %rbx
movq %rbp, %rcx
testq %rax, %rax
jne 0x8076
movq 0x28(%rsp), %rcx
movq 0x10(%rcx), %rax
movq 0x8(%rcx), %r14
cmpq %rbx, %rax
cmovbq %rax, %rbx
vpxor %xmm0, %xmm0, %xmm0
vmovdqu64 %zmm0, 0x70(%rsp)
vmovdqu64 %zmm0, 0x30(%rsp)
movl $0xffffffff, 0xb0(%rsp) # imm = 0xFFFFFFFF
testq %rax, %rax
je 0x80e0
xorl %r12d, %r12d
leaq 0x30(%rsp), %r13
movzbl (%r14,%r12,4), %esi
movzbl 0x1(%r14,%r12,4), %edx
movzbl 0x2(%r14,%r12,4), %ecx
movzbl 0x3(%r14,%r12,4), %r8d
movq %r13, %rdi
movl %r12d, %r9d
vzeroupper
callq 0x8503
incq %r12
cmpq %r12, %rbx
jne 0x80b3
movq 0x28(%rsp), %r8
cmpl $0x10, 0x4(%r8)
jne 0x8206
cmpl $0x10, 0x4(%rbp)
jne 0x8206
movq %rbp, %r12
cmpq $0x0, 0x20(%rsp)
je 0x8467
xorl %r14d, %r14d
leaq 0x944d(%rip), %r13      # 0x11560
xorl %ebx, %ebx
xorl %ebp, %ebp
movw %r14w, 0x16(%rsp)
movw %r14w, 0x14(%rsp)
movw %r14w, 0x12(%rsp)
movw %r14w, 0x10(%rsp)
movq 0x28(%rsp), %rax
movq %rax, (%rsp)
leaq 0x16(%rsp), %rdi
leaq 0x14(%rsp), %rsi
leaq 0x12(%rsp), %rdx
leaq 0x10(%rsp), %rcx
movq %r15, %r8
movq %rbp, %r9
vzeroupper
callq 0x85b2
movl (%r12), %esi
cmpq $0x6, %rsi
ja 0x81ef
movzwl 0x16(%rsp), %eax
movzwl 0x14(%rsp), %edx
movzwl 0x12(%rsp), %edi
movzwl 0x10(%rsp), %ecx
movslq (%r13,%rsi,4), %rsi
addq %r13, %rsi
jmpq *%rsi
movq 0x18(%rsp), %rcx
movbew %ax, (%rcx,%rbp,2)
jmp 0x81ef
movq 0x18(%rsp), %rdx
movb %ah, (%rdx,%rbp,4)
movb %al, 0x1(%rdx,%rbp,4)
movb %ch, 0x2(%rdx,%rbp,4)
movb %cl, 0x3(%rdx,%rbp,4)
jmp 0x81ef
movq 0x18(%rsp), %rcx
movb %ah, (%rcx,%rbx)
movb %al, 0x1(%rcx,%rbx)
movb %dh, 0x2(%rcx,%rbx)
movb %dl, 0x3(%rcx,%rbx)
movl %edi, %eax
movb %ah, 0x4(%rcx,%rbx)
movb %al, 0x5(%rcx,%rbx)
jmp 0x81ef
movq 0x18(%rsp), %rsi
movb %ah, (%rsi,%rbp,8)
movb %al, 0x1(%rsi,%rbp,8)
movb %dh, 0x2(%rsi,%rbp,8)
movb %dl, 0x3(%rsi,%rbp,8)
movl %edi, %eax
movb %ah, 0x4(%rsi,%rbp,8)
movb %al, 0x5(%rsi,%rbp,8)
movb %ch, 0x6(%rsi,%rbp,8)
movb %cl, 0x7(%rsi,%rbp,8)
incq %rbp
addq $0x6, %rbx
cmpq %rbp, 0x20(%rsp)
jne 0x8117
jmp 0x8467
movl 0x4(%rbp), %eax
cmpl $0x8, %eax
movq 0x20(%rsp), %rsi
jne 0x8243
movl $0x1, %edx
cmpl $0x6, (%rbp)
jne 0x8236
movq %rbp, %r12
movq 0x18(%rsp), %rdi
movq %r15, %rcx
vzeroupper
callq 0x86ee
jmp 0x8467
cmpl $0x8, %eax
jne 0x8243
xorl %edx, %edx
cmpl $0x2, (%rbp)
je 0x821e
xorl %eax, %eax
movb %al, 0x16(%rsp)
movb %al, 0x14(%rsp)
movb %al, 0x12(%rsp)
movb %al, 0x10(%rsp)
testq %rsi, %rsi
sete %bl
je 0x845f
xorl %r14d, %r14d
xorl %r12d, %r12d
movq 0x28(%rsp), %rax
movq %rax, (%rsp)
leaq 0x16(%rsp), %rdi
leaq 0x14(%rsp), %rsi
leaq 0x12(%rsp), %rdx
leaq 0x10(%rsp), %rcx
movq %r15, %r8
movq %r12, %r9
vzeroupper
callq 0x8b64
movl (%rbp), %r8d
movb $0x1, %r10b
cmpq $0x6, %r8
ja 0x8427
movb 0x16(%rsp), %al
movzbl %al, %esi
movb 0x14(%rsp), %dl
movb 0x12(%rsp), %cl
movb 0x10(%rsp), %dil
leaq 0x9286(%rip), %r9       # 0x11544
movslq (%r9,%r8,4), %r8
addq %r9, %r8
jmpq *%r8
movl 0x4(%rbp), %edx
cmpl $0x10, %edx
je 0x83df
cmpl $0x8, %edx
jne 0x8409
movq 0x18(%rsp), %rcx
movb %al, (%rcx,%r12)
jmp 0x8427
movzbl %dl, %edx
movzbl %cl, %ecx
movzbl %dil, %r8d
leaq 0x30(%rsp), %rdi
callq 0xeb70
testl %eax, %eax
js 0x83d5
movl 0x4(%rbp), %edx
cmpl $0x8, %edx
jne 0x8449
movq 0x18(%rsp), %rcx
movb %al, (%rcx,%r12)
jmp 0x8458
cmpl $0x8, 0x4(%rbp)
jne 0x838a
movq 0x18(%rsp), %rsi
movb %al, (%rsi,%r14)
movb %dl, 0x1(%rsi,%r14)
movb %cl, 0x2(%rsi,%r14)
jmp 0x8427
movl 0x4(%rbp), %ecx
cmpl $0x10, %ecx
je 0x83ef
cmpl $0x8, %ecx
jne 0x8427
movq 0x18(%rsp), %rcx
movb %al, (%rcx,%r12,2)
movb %dil, 0x1(%rcx,%r12,2)
jmp 0x8427
cmpl $0x8, 0x4(%rbp)
jne 0x83ae
movq 0x18(%rsp), %rsi
movb %al, (%rsi,%r12,4)
movb %dl, 0x1(%rsi,%r12,4)
movb %cl, 0x2(%rsi,%r12,4)
movb %dil, 0x3(%rsi,%r12,4)
jmp 0x8427
movq 0x18(%rsp), %rsi
movb %al, 0x1(%rsi,%r14,2)
movb %al, (%rsi,%r14,2)
movb %dl, 0x3(%rsi,%r14,2)
movb %dl, 0x2(%rsi,%r14,2)
movb %cl, 0x5(%rsi,%r14,2)
movb %cl, 0x4(%rsi,%r14,2)
jmp 0x8427
vmovd %eax, %xmm0
vpinsrb $0x1, %edx, %xmm0, %xmm0
vpinsrb $0x2, %ecx, %xmm0, %xmm0
vpinsrb $0x3, %edi, %xmm0, %xmm0
vpunpcklbw %xmm0, %xmm0, %xmm0 # xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
movq 0x18(%rsp), %rax
vmovq %xmm0, (%rax,%r12,8)
jmp 0x8427
movl $0x52, %eax
xorl %r10d, %r10d
jmp 0x8429
movq 0x18(%rsp), %rcx
movb %al, 0x1(%rcx,%r12,2)
movb %al, (%rcx,%r12,2)
jmp 0x8427
movq 0x18(%rsp), %rcx
movb %al, 0x1(%rcx,%r12,4)
movb %al, (%rcx,%r12,4)
movb %dil, 0x3(%rcx,%r12,4)
movb %dil, 0x2(%rcx,%r12,4)
jmp 0x8427
movb $0x8, %al
subb %dl, %al
shrxl %eax, %esi, %eax
bzhil %edx, %eax, %ecx
movq 0x18(%rsp), %rdi
movq %r12, %rsi
callq 0xeb29
movb $0x1, %r10b
xorl %eax, %eax
testb %r10b, %r10b
cmovel %eax, %r13d
je 0x845f
incq %r12
addq $0x3, %r14
cmpq %r12, 0x20(%rsp)
sete %bl
jne 0x8267
jmp 0x845f
movq 0x18(%rsp), %rdi
movq %r12, %rsi
movl %eax, %ecx
callq 0xeb29
xorl %eax, %eax
movb $0x1, %r10b
jmp 0x8429
movq %rbp, %r12
testb $0x1, %bl
je 0x847e
xorl %r13d, %r13d
cmpl $0x3, (%r12)
jne 0x847e
leaq 0x30(%rsp), %rdi
vzeroupper
callq 0x8e44
movl %r13d, %eax
addq $0xb8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
vzeroupper
retq