// File: /workspace/github_c_makefile_star2_O3/Joy-Division[P]tools-zoe/lodepng/lodepng.c
// Function: lodepng_convert
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 = (size_t)w * (size_t)h;
  unsigned error = 0;

  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 = (size_t)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 the input was also palette with same bitdepth, then the color types are also
      equal, so copy literally. This to preserve the exact indices that were in the PNG
      even in case there are duplicate colors in the palette.*/
      if (mode_in->colortype == LCT_PALETTE && mode_in->bitdepth == mode_out->bitdepth)
      {
        size_t numbytes = lodepng_get_raw_size(w, h, mode_in);
        for(i = 0; i != numbytes; ++i) out[i] = in[i];
        return 0;
      }
    }
    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], (unsigned)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);
      error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a);
      if (error) break;
    }
  }

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

  return error;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xb8, %rsp
movl %r9d, %ebp
movl %r8d, %r13d
movq %rcx, %r12
movq %rdx, %r14
movq %rsi, %r15
movq %rdi, %rbx
movq %rdx, %rdi
movq %rcx, %rsi
callq 0x58da
testl %eax, %eax
je 0x5411
movl (%r12), %edx
movl 0x4(%r12), %ecx
movl %r13d, %edi
movl %ebp, %esi
callq 0x4c4d
testq %rax, %rax
je 0x54de
xorl %r13d, %r13d
xorl %ecx, %ecx
movb (%r15,%rcx), %dl
movb %dl, (%rbx,%rcx)
incq %rcx
cmpq %rcx, %rax
jne 0x53fd
jmp 0x58a5
movl %r13d, 0x20(%rsp)
movl %ebp, 0x24(%rsp)
movq %r12, 0x28(%rsp)
movq %rbx, 0x18(%rsp)
cmpl $0x3, (%r14)
jne 0x5564
movq 0x10(%r14), %rax
movl 0x4(%r14), %ecx
movl $0x1, %ebx
shlq %cl, %rbx
testq %rax, %rax
je 0x5492
movq 0x8(%r14), %rbp
cmpq %rbx, %rax
cmovbq %rax, %rbx
xorps %xmm0, %xmm0
movaps %xmm0, 0xa0(%rsp)
movaps %xmm0, 0x90(%rsp)
movaps %xmm0, 0x80(%rsp)
movaps %xmm0, 0x70(%rsp)
movaps %xmm0, 0x60(%rsp)
movaps %xmm0, 0x50(%rsp)
movaps %xmm0, 0x40(%rsp)
movaps %xmm0, 0x30(%rsp)
movl $0xffffffff, 0xb0(%rsp) # imm = 0xFFFFFFFF
jmp 0x5531
movq 0x28(%rsp), %rdx
movq 0x10(%rdx), %rax
movq 0x8(%rdx), %rbp
cmpl $0x3, (%rdx)
jne 0x54e6
cmpl %ecx, 0x4(%rdx)
jne 0x54e6
movl 0x20(%rsp), %edi
movl 0x24(%rsp), %esi
movl $0x3, %edx
callq 0x4c4d
testq %rax, %rax
movq 0x18(%rsp), %rsi
je 0x54de
xorl %r13d, %r13d
xorl %ecx, %ecx
movb (%r15,%rcx), %dl
movb %dl, (%rsi,%rcx)
incq %rcx
cmpq %rcx, %rax
jne 0x54ca
jmp 0x58a5
xorl %r13d, %r13d
jmp 0x58a5
cmpq %rbx, %rax
cmovbq %rax, %rbx
xorps %xmm0, %xmm0
movaps %xmm0, 0xa0(%rsp)
movaps %xmm0, 0x90(%rsp)
movaps %xmm0, 0x80(%rsp)
movaps %xmm0, 0x70(%rsp)
movaps %xmm0, 0x60(%rsp)
movaps %xmm0, 0x50(%rsp)
movaps %xmm0, 0x40(%rsp)
movaps %xmm0, 0x30(%rsp)
movl $0xffffffff, 0xb0(%rsp) # imm = 0xFFFFFFFF
testq %rax, %rax
je 0x5564
xorl %r12d, %r12d
leaq 0x30(%rsp), %r13
movzbl (%rbp,%r12,4), %esi
movzbl 0x1(%rbp,%r12,4), %edx
movzbl 0x2(%rbp,%r12,4), %ecx
movzbl 0x3(%rbp,%r12,4), %r8d
movq %r13, %rdi
movl %r12d, %r9d
callq 0x5947
incq %r12
cmpq %r12, %rbx
jne 0x5539
movl 0x20(%rsp), %eax
movl 0x24(%rsp), %ebp
imulq %rax, %rbp
movq 0x28(%rsp), %r12
movl 0x4(%r12), %ecx
xorl $0x10, %ecx
movl 0x4(%r14), %eax
movl %eax, %edx
xorl $0x10, %edx
orl %ecx, %edx
jne 0x5695
testq %rbp, %rbp
je 0x5892
movq %rbp, %r12
xorl %r13d, %r13d
xorl %ebx, %ebx
xorl %ebp, %ebp
movw %r13w, 0x16(%rsp)
movw %r13w, 0x14(%rsp)
movw %r13w, 0x12(%rsp)
movw %r13w, 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
callq 0x5a0e
movl (%r14), %esi
cmpq $0x6, %rsi
ja 0x5680
movzwl 0x16(%rsp), %eax
movzwl 0x14(%rsp), %edx
movzwl 0x12(%rsp), %r8d
movzwl 0x10(%rsp), %ecx
leaq 0x8b42(%rip), %rdi      # 0xe14c
movslq (%rdi,%rsi,4), %rsi
addq %rdi, %rsi
jmpq *%rsi
rolw $0x8, %ax
movq 0x18(%rsp), %rcx
movw %ax, (%rcx,%rbp,2)
jmp 0x5680
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 0x5680
movq 0x18(%rsp), %rcx
movb %ah, (%rcx,%rbx,2)
movb %al, 0x1(%rcx,%rbx,2)
movb %dh, 0x2(%rcx,%rbx,2)
movb %dl, 0x3(%rcx,%rbx,2)
movl %r8d, %eax
movb %ah, 0x4(%rcx,%rbx,2)
movb %al, 0x5(%rcx,%rbx,2)
jmp 0x5680
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 %r8d, %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 $0x3, %rbx
cmpq %rbp, %r12
jne 0x55a1
jmp 0x5892
cmpl $0x8, %eax
movq 0x18(%rsp), %rbx
jne 0x56cb
movl (%r14), %eax
cmpl $0x2, %eax
je 0x58ba
cmpl $0x6, %eax
jne 0x56cb
movq %rbx, %rdi
movq %rbp, %rsi
movl $0x1, %edx
movq %r15, %rcx
movq %r12, %r8
callq 0x5b8d
jmp 0x5892
xorl %r13d, %r13d
movb %r13b, 0x16(%rsp)
movb %r13b, 0x14(%rsp)
movb %r13b, 0x12(%rsp)
movb %r13b, 0x10(%rsp)
testq %rbp, %rbp
je 0x5895
xorl %r13d, %r13d
movq %r12, (%rsp)
leaq 0x16(%rsp), %rdi
leaq 0x14(%rsp), %rsi
leaq 0x12(%rsp), %rdx
leaq 0x10(%rsp), %rcx
movq %r15, %r8
movq %r13, %r9
callq 0x5ffc
movl (%r14), %r8d
cmpq $0x6, %r8
ja 0x5886
movb 0x16(%rsp), %al
movzbl %al, %esi
movb 0x14(%rsp), %dl
movb 0x12(%rsp), %cl
movb 0x10(%rsp), %dil
leaq 0x89f7(%rip), %r9       # 0xe130
movslq (%r9,%r8,4), %r8
addq %r9, %r8
jmpq *%r8
movl 0x4(%r14), %edx
cmpl $0x10, %edx
je 0x5846
cmpl $0x8, %edx
jne 0x5866
movb %al, (%rbx,%r13)
jmp 0x5886
movzbl %dl, %edx
movzbl %cl, %ecx
movzbl %dil, %r8d
leaq 0x30(%rsp), %rdi
callq 0xb62e
testl %eax, %eax
js 0x58d2
movl 0x4(%r14), %edx
cmpl $0x8, %edx
jne 0x5879
movb %al, (%rbx,%r13)
jmp 0x5886
cmpl $0x8, 0x4(%r14)
jne 0x57f9
leaq (,%r13,2), %rsi
addq %r13, %rsi
movb %al, (%rbx,%rsi)
movb %dl, 0x1(%rbx,%rsi)
movb %cl, 0x2(%rbx,%rsi)
jmp 0x5886
movl 0x4(%r14), %ecx
cmpl $0x10, %ecx
je 0x5851
cmpl $0x8, %ecx
jne 0x5886
movb %al, (%rbx,%r13,2)
movb %dil, 0x1(%rbx,%r13,2)
jmp 0x5886
cmpl $0x8, 0x4(%r14)
jne 0x581d
movb %al, (%rbx,%r13,4)
movb %dl, 0x1(%rbx,%r13,4)
movb %cl, 0x2(%rbx,%r13,4)
movb %dil, 0x3(%rbx,%r13,4)
jmp 0x5886
leaq (,%r13,2), %rsi
addq %r13, %rsi
movb %al, 0x1(%rbx,%rsi,2)
movb %al, (%rbx,%rsi,2)
movb %dl, 0x3(%rbx,%rsi,2)
movb %dl, 0x2(%rbx,%rsi,2)
movb %cl, 0x5(%rbx,%rsi,2)
movb %cl, 0x4(%rbx,%rsi,2)
jmp 0x5886
movb %al, 0x1(%rbx,%r13,8)
movb %al, (%rbx,%r13,8)
movb %dl, 0x3(%rbx,%r13,8)
movb %dl, 0x2(%rbx,%r13,8)
movb %cl, 0x5(%rbx,%r13,8)
movb %cl, 0x4(%rbx,%r13,8)
movb %dil, 0x7(%rbx,%r13,8)
movb %dil, 0x6(%rbx,%r13,8)
jmp 0x5886
movb %al, 0x1(%rbx,%r13,2)
movb %al, (%rbx,%r13,2)
jmp 0x5886
movb %al, 0x1(%rbx,%r13,4)
movb %al, (%rbx,%r13,4)
movb %dil, 0x3(%rbx,%r13,4)
movb %dil, 0x2(%rbx,%r13,4)
jmp 0x5886
movb $0x8, %cl
subb %dl, %cl
shrl %cl, %esi
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %edx, %ecx
shll %cl, %eax
notl %eax
andl %esi, %eax
movq %rbx, %rdi
movq %r13, %rsi
movl %eax, %ecx
callq 0xb5d6
incq %r13
cmpq %rbp, %r13
jne 0x56ee
xorl %r13d, %r13d
cmpl $0x3, (%r14)
jne 0x58a5
leaq 0x30(%rsp), %rdi
callq 0x62e3
movl %r13d, %eax
addq $0xb8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
xorl %r13d, %r13d
movq %rbx, %rdi
movq %rbp, %rsi
xorl %edx, %edx
movq %r15, %rcx
movq %r12, %r8
callq 0x5b8d
jmp 0x5895
movl $0x52, %r13d
jmp 0x5895