// File: /workspace/github_c_makefile_star2_O1/Joy-Division[P]tools-mgs/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 = w * 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 = 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);
      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, %r13d
movl %r8d, %r12d
movq %rcx, %r15
movq %rdx, %rbp
movq %rsi, %r14
movq %rdi, %rbx
movq %rdx, %rdi
movq %rcx, %rsi
callq 0x52c9
testl %eax, %eax
je 0x4e47
movl %r12d, %edi
movl %r13d, %esi
movq %r15, %rdx
callq 0x4648
xorl %r12d, %r12d
testq %rax, %rax
je 0x52b4
xorl %ecx, %ecx
movb (%r14,%rcx), %dl
movb %dl, (%rbx,%rcx)
incq %rcx
cmpq %rcx, %rax
jne 0x4e33
jmp 0x52b4
movq %r15, 0x28(%rsp)
movq %rbx, 0x18(%rsp)
imull %r12d, %r13d
movq %r13, 0x20(%rsp)
cmpl $0x3, (%rbp)
jne 0x4f05
movb 0x4(%rbp), %cl
movl $0x1, %ebx
shlq %cl, %rbx
movq 0x10(%rbp), %rax
movq %rbp, %rcx
testq %rax, %rax
jne 0x4e84
movq 0x28(%rsp), %rcx
movq 0x10(%rcx), %rax
cmpq %rbx, %rax
cmovbq %rax, %rbx
movq 0x8(%rcx), %r15
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 0x4f05
xorl %r12d, %r12d
leaq 0x30(%rsp), %r13
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 0x5336
incq %r12
cmpq %r12, %rbx
jne 0x4edb
movq 0x28(%rsp), %r8
cmpl $0x10, 0x4(%r8)
jne 0x502f
cmpl $0x10, 0x4(%rbp)
jne 0x502f
cmpq $0x0, 0x20(%rsp)
je 0x5054
movq %rbp, %r13
xorl %r12d, %r12d
leaq 0x9134(%rip), %r15      # 0xe06c
xorl %ebx, %ebx
xorl %ebp, %ebp
movw %r12w, 0x16(%rsp)
movw %r12w, 0x14(%rsp)
movw %r12w, 0x12(%rsp)
movw %r12w, 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 %r14, %r8
movq %rbp, %r9
callq 0x53f2
movl (%r13), %esi
cmpq $0x6, %rsi
ja 0x5012
movzwl 0x16(%rsp), %eax
movzwl 0x14(%rsp), %edx
movzwl 0x12(%rsp), %edi
movzwl 0x10(%rsp), %ecx
movslq (%r15,%rsi,4), %rsi
addq %r15, %rsi
jmpq *%rsi
rolw $0x8, %ax
movq 0x18(%rsp), %rcx
movw %ax, (%rcx,%rbp,2)
jmp 0x5012
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 0x5012
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 0x5012
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 0x4f3c
xorl %r12d, %r12d
movq %r13, %rbp
jmp 0x52a4
movl 0x4(%rbp), %eax
cmpl $0x8, %eax
movq 0x18(%rsp), %rdi
movq 0x20(%rsp), %rsi
jne 0x5079
cmpl $0x6, (%rbp)
jne 0x505c
movl $0x1, %edx
movq %r14, %rcx
callq 0x5571
xorl %r12d, %r12d
jmp 0x52a4
cmpl $0x8, %eax
jne 0x5079
cmpl $0x2, (%rbp)
jne 0x5079
xorl %r12d, %r12d
xorl %edx, %edx
movq %r14, %rcx
callq 0x5571
jmp 0x52a4
xorl %r12d, %r12d
movb %r12b, 0x16(%rsp)
movb %r12b, 0x14(%rsp)
movb %r12b, 0x12(%rsp)
movb %r12b, 0x10(%rsp)
testq %rsi, %rsi
je 0x52a4
movl $0x1, %r15d
xorl %ebx, %ebx
xorl %r13d, %r13d
movq 0x28(%rsp), %rax
movq %rax, (%rsp)
leaq 0x16(%rsp), %rdi
leaq 0x14(%rsp), %rsi
leaq 0x12(%rsp), %rdx
leaq 0x10(%rsp), %rcx
movq %r14, %r8
movq %r13, %r9
callq 0x59e3
movl (%rbp), %r8d
movb $0x1, %r10b
cmpq $0x6, %r8
ja 0x526a
movb 0x16(%rsp), %al
movzbl %al, %esi
movb 0x14(%rsp), %dl
movb 0x12(%rsp), %cl
movb 0x10(%rsp), %dil
leaq 0x8f58(%rip), %r9       # 0xe050
movslq (%r9,%r8,4), %r8
addq %r9, %r8
jmpq *%r8
movl 0x4(%rbp), %edx
cmpl $0x10, %edx
je 0x521b
cmpl $0x8, %edx
jne 0x5245
movq 0x18(%rsp), %rcx
movb %al, (%rcx,%r13)
jmp 0x526a
movzbl %dl, %edx
movzbl %cl, %ecx
movzbl %dil, %r8d
leaq 0x30(%rsp), %rdi
callq 0xb0b5
testl %eax, %eax
js 0x5210
movl 0x4(%rbp), %edx
cmpl $0x8, %edx
jne 0x528d
movq 0x18(%rsp), %rcx
movb %al, (%rcx,%r13)
jmp 0x529c
cmpl $0x8, 0x4(%rbp)
jne 0x51c1
movq 0x18(%rsp), %rsi
movb %al, (%rsi,%rbx)
movb %dl, 0x1(%rsi,%rbx)
movb %cl, 0x2(%rsi,%rbx)
jmp 0x526a
movl 0x4(%rbp), %ecx
cmpl $0x10, %ecx
je 0x522b
cmpl $0x8, %ecx
jne 0x526a
movq 0x18(%rsp), %rcx
movb %al, -0x1(%rcx,%r15)
movb %dil, (%rcx,%r15)
jmp 0x526a
cmpl $0x8, 0x4(%rbp)
jne 0x51e2
movq 0x18(%rsp), %rsi
movb %al, -0x2(%rsi,%r15,2)
movb %dl, -0x1(%rsi,%r15,2)
movb %cl, (%rsi,%r15,2)
movb %dil, 0x1(%rsi,%r15,2)
jmp 0x526a
movq 0x18(%rsp), %rsi
movb %al, 0x1(%rsi,%rbx,2)
movb %al, (%rsi,%rbx,2)
movb %dl, 0x3(%rsi,%rbx,2)
movb %dl, 0x2(%rsi,%rbx,2)
movb %cl, 0x5(%rsi,%rbx,2)
movb %cl, 0x4(%rsi,%rbx,2)
jmp 0x526a
movq 0x18(%rsp), %rsi
movb %al, -0x3(%rsi,%r15,4)
movb %al, -0x4(%rsi,%r15,4)
movb %dl, -0x1(%rsi,%r15,4)
movb %dl, -0x2(%rsi,%r15,4)
movb %cl, 0x1(%rsi,%r15,4)
movb %cl, (%rsi,%r15,4)
movb %dil, 0x3(%rsi,%r15,4)
movb %dil, 0x2(%rsi,%r15,4)
jmp 0x526a
movl $0x52, %r12d
xorl %r10d, %r10d
jmp 0x526d
movq 0x18(%rsp), %rcx
movb %al, (%rcx,%r15)
movb %al, -0x1(%rcx,%r15)
jmp 0x526a
movq 0x18(%rsp), %rcx
movb %al, -0x1(%rcx,%r15,2)
movb %al, -0x2(%rcx,%r15,2)
movb %dil, 0x1(%rcx,%r15,2)
movb %dil, (%rcx,%r15,2)
jmp 0x526a
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 0x18(%rsp), %rdi
movq %r13, %rsi
movl %eax, %ecx
callq 0xb05d
movb $0x1, %r10b
xorl %r12d, %r12d
testb %r10b, %r10b
je 0x52a4
incq %r13
addq $0x2, %r15
addq $0x3, %rbx
cmpq %r13, 0x20(%rsp)
jne 0x50a4
jmp 0x5054
movq 0x18(%rsp), %rdi
movq %r13, %rsi
movl %eax, %ecx
callq 0xb05d
xorl %r12d, %r12d
movb $0x1, %r10b
jmp 0x526d
cmpl $0x3, (%rbp)
jne 0x52b4
leaq 0x30(%rsp), %rdi
callq 0x5ccb
movl %r12d, %eax
addq $0xb8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq