// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/nie.c
// Function: do_decode_nie
static void do_decode_nie(deark *c, lctx *d)
{
	i64 i, j;
	i64 k;
	i64 pos = 0;
	i64 sample_offset[4]; // R, G, B, A
	de_bitmap *img = NULL;

	pos += 4; // signature, already read

	if(!do_header(c, d, pos)) goto done;
	if(d->bad_image_flag) {
		de_err(c, "Bad or unsupported NIE format");
		goto done;
	}
	pos += 12;

	if(!de_good_image_dimensions(c, d->width, d->height)) {
		goto done;
	}

	// Make a sample-to-byte-offset map.
	for(k=0; k<4; k++) {
		sample_offset[k] = k; // Defaults
	}
	if(d->is_bgra) {
		sample_offset[0] = 2; // R sample is byte 2
		sample_offset[2] = 0; // B sample is byte 0
	}
	if(d->bytes_per_pixel==8) { // If 16 bits/sample, look only at the high byte
		for(k=0; k<4; k++) {
			sample_offset[k] = sample_offset[k]*2 + 1;
		}
	}

	img = de_bitmap_create(c, d->width, d->height, 4);

	for(j=0; j<d->height; j++) {
		for(i=0; i<d->width; i++) {
			u8 pbuf[8];
			u8 s[4];

			de_read(pbuf, pos, d->bytes_per_pixel);
			pos += d->bytes_per_pixel;

			for(k=0; k<4; k++) {
				s[k] = pbuf[sample_offset[k]];
			}

			if(d->premultiplied_alpha && (s[3]!=0xff)) {
				for(k=0; k<3; k++) {
					s[k] = de_unpremultiply_alpha_samp(s[k], s[3]);
				}
			}

			de_bitmap_setpixel_rgba(img, i, j, DE_MAKE_RGBA(s[0],s[1],s[2],s[3]));
		}
	}

	de_bitmap_write_to_file(img, NULL, DE_CREATEFLAG_OPT_IMAGE);

done:
	de_bitmap_destroy(img);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq $0x0, -0x30(%rbp)
movq $0x0, -0x58(%rbp)
movq -0x30(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x30(%rbp), %rdx
callq 0xee0e0
cmpl $0x0, %eax
jne 0xedc77
jmp 0xedebb
movq -0x10(%rbp), %rax
cmpl $0x0, 0x30(%rax)
je 0xedc98
movq -0x8(%rbp), %rdi
leaq 0xd0335(%rip), %rsi     # 0x1bdfc1
movb $0x0, %al
callq 0x15bfb0
jmp 0xedebb
movq -0x30(%rbp), %rax
addq $0xc, %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdx
callq 0x16a850
cmpl $0x0, %eax
jne 0xedcc7
jmp 0xedebb
movq $0x0, -0x28(%rbp)
cmpq $0x4, -0x28(%rbp)
jge 0xedcf1
movq -0x28(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, -0x50(%rbp,%rax,8)
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0xedccf
movq -0x10(%rbp), %rax
cmpl $0x0, 0x10(%rax)
je 0xedd0b
movq $0x2, -0x50(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x10(%rbp), %rax
cmpq $0x8, 0x18(%rax)
jne 0xedd4e
movq $0x0, -0x28(%rbp)
cmpq $0x4, -0x28(%rbp)
jge 0xedd4c
movq -0x28(%rbp), %rax
movq -0x50(%rbp,%rax,8), %rcx
shlq %rcx
addq $0x1, %rcx
movq -0x28(%rbp), %rax
movq %rcx, -0x50(%rbp,%rax,8)
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0xedd1e
jmp 0xedd4e
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdx
movl $0x4, %ecx
callq 0x16b750
movq %rax, -0x58(%rbp)
movq $0x0, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x28(%rcx), %rax
jge 0xedea9
movq $0x0, -0x18(%rbp)
movq -0x18(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x20(%rcx), %rax
jge 0xede96
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x60(%rbp), %rsi
movq -0x30(%rbp), %rdx
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rcx
callq 0x164d10
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
addq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movq $0x0, -0x28(%rbp)
cmpq $0x4, -0x28(%rbp)
jge 0xede03
movq -0x28(%rbp), %rax
movq -0x50(%rbp,%rax,8), %rax
movb -0x60(%rbp,%rax), %cl
movq -0x28(%rbp), %rax
movb %cl, -0x64(%rbp,%rax)
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0xeddd9
movq -0x10(%rbp), %rax
cmpl $0x0, 0x14(%rax)
je 0xede55
movzbl -0x61(%rbp), %eax
cmpl $0xff, %eax
je 0xede55
movq $0x0, -0x28(%rbp)
cmpq $0x3, -0x28(%rbp)
jge 0xede53
movq -0x28(%rbp), %rax
movb -0x64(%rbp,%rax), %al
movzbl %al, %edi
movzbl -0x61(%rbp), %esi
callq 0x16d630
movb %al, %cl
movq -0x28(%rbp), %rax
movb %cl, -0x64(%rbp,%rax)
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0xede20
jmp 0xede55
movq -0x58(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movzbl -0x61(%rbp), %ecx
shll $0x18, %ecx
movzbl -0x64(%rbp), %eax
shll $0x10, %eax
orl %eax, %ecx
movzbl -0x63(%rbp), %eax
shll $0x8, %eax
orl %eax, %ecx
movzbl -0x62(%rbp), %eax
orl %eax, %ecx
callq 0x16b350
movq -0x18(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x18(%rbp)
jmp 0xedd92
jmp 0xede98
movq -0x20(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x20(%rbp)
jmp 0xedd78
movq -0x58(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0x2, %edx
callq 0x16afd0
movq -0x58(%rbp), %rdi
callq 0x16af60
addq $0x70, %rsp
popq %rbp
retq
nopw (%rax,%rax)