// File: /workspace/github_cpp_makefile_star2_O2/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
movq %rsi, %r14
movq %rdi, %rbp
movl %r9d, %r13d
movl %r8d, %r12d
movq %rcx, %r15
movq %rdx, %rbx
movq %rdx, %rdi
movq %rcx, %rsi
callq 0x6b38
testl %eax, %eax
je 0x6769
movl %r12d, %edi
movl %r13d, %esi
movq %r15, %rdx
callq 0x5fee
xorl %r15d, %r15d
xorl %ecx, %ecx
cmpq %rcx, %rax
je 0x6b1d
movb (%r14,%rcx), %dl
movb %dl, (%rbp,%rcx)
incq %rcx
jmp 0x6753
imull %r12d, %r13d
cmpl $0x3, (%rbx)
movq %r15, 0x20(%rsp)
movq %rbx, 0x28(%rsp)
movq %r13, 0x18(%rsp)
jne 0x67ed
movq 0x28(%rsp), %rsi
movq 0x10(%rsi), %rax
movb 0x4(%rsi), %cl
pushq $0x1
popq %rdx
shlxq %rcx, %rdx, %rbx
movq %rsi, %rcx
testq %rax, %rax
jne 0x67a6
movq 0x20(%rsp), %rcx
movq 0x10(%rcx), %rax
movq 0x8(%rcx), %r15
cmpq %rbx, %rax
leaq 0x30(%rsp), %r13
movq %r13, %rdi
cmovbq %rax, %rbx
callq 0x6ba4
xorl %r12d, %r12d
cmpq %r12, %rbx
je 0x67ed
movzbl (%r15,%r12,4), %esi
movzbl 0x1(%r15,%r12,4), %edx
movzbl 0x2(%r15,%r12,4), %ecx
movzbl 0x3(%r15,%r12,4), %r8d
movq %r13, %rdi
movl %r12d, %r9d
callq 0x6bbe
incq %r12
jmp 0x67c1
movq 0x20(%rsp), %r8
movq 0x28(%rsp), %rbx
movl 0x4(%r8), %ecx
movl 0x4(%rbx), %eax
movl %eax, %edx
xorl $0x10, %ecx
xorl $0x10, %edx
orl %ecx, %edx
jne 0x690c
movq %rbp, %r12
pushq $0x5
popq %rdi
leaq 0x7b51(%rip), %r15      # 0xe36c
xorl %ebp, %ebp
cmpq %rbp, 0x18(%rsp)
je 0x6b0b
movq 0x20(%rsp), %rax
andw $0x0, 0x16(%rsp)
andw $0x0, 0x14(%rsp)
andw $0x0, 0x12(%rsp)
andw $0x0, 0x10(%rsp)
movq %rdi, %r13
leaq 0x16(%rsp), %rdi
leaq 0x14(%rsp), %rsi
leaq 0x12(%rsp), %rdx
leaq 0x10(%rsp), %rcx
movq %r14, %r8
movq %rbp, %r9
movq %rax, (%rsp)
callq 0x6c5d
movl (%rbx), %esi
movq %r13, %rdi
cmpq $0x6, %rsi
ja 0x68fb
movslq (%r15,%rsi,4), %rsi
movzwl 0x16(%rsp), %ebx
movzwl 0x14(%rsp), %edx
movzwl 0x12(%rsp), %eax
movzwl 0x10(%rsp), %ecx
addq %r15, %rsi
jmpq *%rsi
movbew %bx, (%r12,%rbp,2)
jmp 0x68fb
movq %r12, %rax
movb %bh, (%rax,%rbp,4)
movb %bl, 0x1(%r12,%rbp,4)
movb %ch, 0x2(%rax,%rbp,4)
movb %cl, 0x3(%r12,%rbp,4)
jmp 0x68fb
movq %r12, %rcx
movb %bh, -0x5(%rcx,%rdi)
movb %bl, -0x4(%r12,%rdi)
movb %dh, -0x3(%rcx,%rdi)
movb %dl, -0x2(%r12,%rdi)
movb %ah, -0x1(%rcx,%rdi)
movb %al, (%r12,%rdi)
jmp 0x68fb
movq %r12, %rsi
movb %bh, (%rsi,%rbp,8)
movb %bl, 0x1(%r12,%rbp,8)
movb %dh, 0x2(%rsi,%rbp,8)
movb %dl, 0x3(%r12,%rbp,8)
movb %ah, 0x4(%rsi,%rbp,8)
movb %al, 0x5(%r12,%rbp,8)
movb %ch, 0x6(%rsi,%rbp,8)
movb %cl, 0x7(%r12,%rbp,8)
movq 0x28(%rsp), %rbx
incq %rbp
addq $0x6, %rdi
jmp 0x681d
cmpl $0x8, %eax
jne 0x6931
movl (%rbx), %eax
cmpl $0x2, %eax
je 0x6af9
cmpl $0x6, %eax
jne 0x6931
pushq $0x1
popq %rdx
movq 0x18(%rsp), %rsi
movq %rbp, %rdi
jmp 0x6b03
leaq 0x14(%rsp), %rcx
xorl %r13d, %r13d
leaq 0x16(%rsp), %rax
leaq 0x12(%rsp), %rdx
movb %r13b, (%rcx)
leaq 0x10(%rsp), %rcx
movb %r13b, (%rax)
movb %r13b, (%rdx)
movb %r13b, (%rcx)
pushq $0x2
popq %r12
pushq $0x5
popq %r15
cmpq %r13, 0x18(%rsp)
je 0x6b0b
movq 0x20(%rsp), %rax
leaq 0x16(%rsp), %rdi
leaq 0x14(%rsp), %rsi
leaq 0x12(%rsp), %rdx
leaq 0x10(%rsp), %rcx
movq %r14, %r8
movq %r13, %r9
movq %rax, (%rsp)
callq 0x717c
movl (%rbx), %r8d
cmpq $0x6, %r8
ja 0x6ae9
leaq 0x79ad(%rip), %r9       # 0xe350
movb 0x16(%rsp), %al
movb 0x14(%rsp), %dl
movb 0x12(%rsp), %cl
movb 0x10(%rsp), %dil
movslq (%r9,%r8,4), %r8
movzbl %al, %esi
addq %r9, %r8
jmpq *%r8
movl 0x4(%rbx), %edx
cmpl $0x10, %edx
je 0x6ac9
cmpl $0x8, %edx
je 0x6a13
movb $0x8, %al
movq %rbp, %rdi
subb %dl, %al
shrxl %eax, %esi, %eax
movq %r13, %rsi
bzhil %edx, %eax, %ecx
jmp 0x6ac2
movzbl %dil, %r8d
movzbl %dl, %edx
movzbl %cl, %ecx
leaq 0x30(%rsp), %rdi
callq 0xbeb7
testl %eax, %eax
js 0x6b32
movl 0x4(%rbx), %edx
cmpl $0x8, %edx
jne 0x6aba
movb %al, (%rbp,%r13)
jmp 0x6ae9
cmpl $0x8, 0x4(%rbx)
jne 0x6a77
movb %al, -0x2(%rbp,%r12)
movb %dl, -0x1(%rbp,%r12)
movb %cl, (%rbp,%r12)
jmp 0x6ae9
movl 0x4(%rbx), %ecx
cmpl $0x10, %ecx
je 0x6ad5
cmpl $0x8, %ecx
jne 0x6ae9
movb %al, (%rbp,%r13,2)
movb %dil, 0x1(%rbp,%r13,2)
jmp 0x6ae9
cmpl $0x8, 0x4(%rbx)
jne 0x6a97
movb %al, (%rbp,%r13,4)
movb %dl, 0x1(%rbp,%r13,4)
movb %cl, 0x2(%rbp,%r13,4)
movb %dil, 0x3(%rbp,%r13,4)
jmp 0x6ae9
movb %al, -0x4(%rbp,%r15)
movb %al, -0x5(%rbp,%r15)
movb %dl, -0x2(%rbp,%r15)
movb %dl, -0x3(%rbp,%r15)
movb %cl, (%rbp,%r15)
movb %cl, -0x1(%rbp,%r15)
jmp 0x6ae9
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]
vmovq %xmm0, (%rbp,%r13,8)
jmp 0x6ae9
movq %rbp, %rdi
movq %r13, %rsi
movl %eax, %ecx
callq 0xbe72
jmp 0x6ae9
movb %al, 0x1(%rbp,%r13,2)
movb %al, (%rbp,%r13,2)
jmp 0x6ae9
movb %al, 0x1(%rbp,%r13,4)
movb %al, (%rbp,%r13,4)
movb %dil, 0x3(%rbp,%r13,4)
movb %dil, 0x2(%rbp,%r13,4)
incq %r13
addq $0x3, %r12
addq $0x6, %r15
jmp 0x695c
movq 0x18(%rsp), %rsi
movq %rbp, %rdi
xorl %edx, %edx
movq %r14, %rcx
callq 0x6d94
xorl %r15d, %r15d
cmpl $0x3, (%rbx)
jne 0x6b1d
leaq 0x30(%rsp), %rdi
callq 0x743d
movl %r15d, %eax
addq $0xb8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
pushq $0x52
popq %r15
jmp 0x6b1d