// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/bmp.c
// Function: do_image
static void do_image(deark *c, lctx *d)
{
	de_dbg(c, "bitmap at %"I64_FMT, d->bits_offset);

	if(d->bits_offset >= c->infile->len) {
		de_err(c, "Bad bits-offset field");
		goto done;
	}

	d->rowspan = ((d->bitcount*d->width +31)/32)*4;
	if(d->compression_type==CMPR_NONE && !d->want_returned_img) {
		if(c->padpix && d->bitcount==24) {
			// The 24-bit decoder can handle partial pixels.
			d->pdwidth = (d->rowspan+2)/3;
		}
		else if(d->bitcount>=1 && d->bitcount<=24) {
			// By default, ignore a partial-pixel's worth of padding.
			// bits-per-row / bits-per-pixel
			d->pdwidth = (d->rowspan*8) / d->bitcount;
		}
	}

	if(d->bitcount>=1 && d->bitcount<=8 && d->compression_type==CMPR_NONE) {
		do_image_paletted(c, d, c->infile, d->bits_offset, 0);
	}
	else if(d->bitcount==24 && d->compression_type==CMPR_NONE) {
		do_image_24bit(c, d, c->infile, d->bits_offset, 0);
	}
	else if((d->bitcount==16 || d->bitcount==32) && d->compression_type==CMPR_NONE) {
		do_image_16_32bit(c, d, c->infile, d->bits_offset);
	}
	else if((d->compression_type==CMPR_RLE4 && (d->bitcount==1 || d->bitcount==4)) ||
		(d->compression_type==CMPR_RLE8 && d->bitcount==8) ||
		(d->compression_type==CMPR_RLE24 && d->bitcount==24))
	{
		do_image_rle(c, d, c->infile, d->bits_offset);
	}
	else if(d->version==DE_BMPVER_64BIT) {
		do_image_64bit(c, d, c->infile, d->bits_offset);
	}
	else if(d->compression_type==CMPR_HUFFMAN1D && d->bitcount==1) {
		do_image_huffman1d(c, d);
	}
	else if(d->compression_type==CMPR_JPEG) {
		extract_embedded_image(c, d, "jpg");
	}
	else if(d->compression_type==CMPR_PNG) {
		extract_embedded_image(c, d, "png");
	}
	else {
		de_err(c, "This type of BMP image is not supported");
		goto done;
	}

	if(d->img && !d->want_returned_img) {
		d->createflags |= DE_CREATEFLAG_OPT_IMAGE;
		de_bitmap_write_to_file_finfo(d->img, d->fi, d->createflags);
	}

done:
	;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdx
leaq 0x17d224(%rip), %rsi    # 0x1c1f07
movb $0x0, %al
callq 0x15b0d0
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x8(%rbp), %rcx
movq 0x18(%rcx), %rcx
cmpq 0x18(%rcx), %rax
jl 0x44d17
movq -0x8(%rbp), %rdi
leaq 0x15ecb9(%rip), %rsi    # 0x1a39c4
movb $0x0, %al
callq 0x15bfb0
jmp 0x4501b
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rax
movq -0x10(%rbp), %rcx
imulq 0x50(%rcx), %rax
addq $0x1f, %rax
movl $0x20, %ecx
cqto
idivq %rcx
movq %rax, %rcx
shlq $0x2, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0xf8(%rax)
movq -0x10(%rbp), %rax
cmpl $0x0, 0xa8(%rax)
jne 0x44de2
movq -0x10(%rbp), %rax
cmpb $0x0, 0x4(%rax)
jne 0x44de2
movq -0x8(%rbp), %rax
movzbl 0xd5(%rax), %eax
cmpl $0x0, %eax
je 0x44da4
movq -0x10(%rbp), %rax
cmpq $0x18, 0x38(%rax)
jne 0x44da4
movq -0x10(%rbp), %rax
movq 0xf8(%rax), %rax
addq $0x2, %rax
movl $0x3, %ecx
cqto
idivq %rcx
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x58(%rax)
jmp 0x44de0
movq -0x10(%rbp), %rax
cmpq $0x1, 0x38(%rax)
jl 0x44dde
movq -0x10(%rbp), %rax
cmpq $0x18, 0x38(%rax)
jg 0x44dde
movq -0x10(%rbp), %rax
movq 0xf8(%rax), %rax
shlq $0x3, %rax
movq -0x10(%rbp), %rcx
cqto
idivq 0x38(%rcx)
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x58(%rax)
jmp 0x44de0
jmp 0x44de2
movq -0x10(%rbp), %rax
cmpq $0x1, 0x38(%rax)
jl 0x44e2a
movq -0x10(%rbp), %rax
cmpq $0x8, 0x38(%rax)
jg 0x44e2a
movq -0x10(%rbp), %rax
cmpl $0x0, 0xa8(%rax)
jne 0x44e2a
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdx
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rcx
xorl %r8d, %r8d
callq 0x45420
jmp 0x44fdb
movq -0x10(%rbp), %rax
cmpq $0x18, 0x38(%rax)
jne 0x44e67
movq -0x10(%rbp), %rax
cmpl $0x0, 0xa8(%rax)
jne 0x44e67
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdx
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rcx
xorl %r8d, %r8d
callq 0x454d0
jmp 0x44fd9
movq -0x10(%rbp), %rax
cmpq $0x10, 0x38(%rax)
je 0x44e7d
movq -0x10(%rbp), %rax
cmpq $0x20, 0x38(%rax)
jne 0x44eac
movq -0x10(%rbp), %rax
cmpl $0x0, 0xa8(%rax)
jne 0x44eac
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdx
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rcx
callq 0x45630
jmp 0x44fd7
movq -0x10(%rbp), %rax
cmpl $0xb, 0xa8(%rax)
jne 0x44ecf
movq -0x10(%rbp), %rax
cmpq $0x1, 0x38(%rax)
je 0x44eff
movq -0x10(%rbp), %rax
cmpq $0x4, 0x38(%rax)
je 0x44eff
movq -0x10(%rbp), %rax
cmpl $0xc, 0xa8(%rax)
jne 0x44ee7
movq -0x10(%rbp), %rax
cmpq $0x8, 0x38(%rax)
je 0x44eff
movq -0x10(%rbp), %rax
cmpl $0xd, 0xa8(%rax)
jne 0x44f21
movq -0x10(%rbp), %rax
cmpq $0x18, 0x38(%rax)
jne 0x44f21
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdx
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rcx
callq 0x45890
jmp 0x44fd5
movq -0x10(%rbp), %rax
cmpl $0xa, (%rax)
jne 0x44f4c
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdx
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rcx
callq 0x45b00
jmp 0x44fd3
movq -0x10(%rbp), %rax
cmpl $0x10, 0xa8(%rax)
jne 0x44f73
movq -0x10(%rbp), %rax
cmpq $0x1, 0x38(%rax)
jne 0x44f73
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x45d50
jmp 0x44fd1
movq -0x10(%rbp), %rax
cmpl $0xe, 0xa8(%rax)
jne 0x44f96
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
leaq 0x17a36a(%rip), %rdx    # 0x1bf2f9
callq 0x45eb0
jmp 0x44fcf
movq -0x10(%rbp), %rax
cmpl $0xf, 0xa8(%rax)
jne 0x44fb9
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
leaq 0x16ef26(%rip), %rdx    # 0x1b3ed8
callq 0x45eb0
jmp 0x44fcd
movq -0x8(%rbp), %rdi
leaq 0x15ea16(%rip), %rsi    # 0x1a39da
movb $0x0, %al
callq 0x15bfb0
jmp 0x4501b
jmp 0x44fcf
jmp 0x44fd1
jmp 0x44fd3
jmp 0x44fd5
jmp 0x44fd7
jmp 0x44fd9
jmp 0x44fdb
movq -0x10(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0x45019
movq -0x10(%rbp), %rax
cmpb $0x0, 0x4(%rax)
jne 0x45019
movq -0x10(%rbp), %rax
movl 0x18(%rax), %ecx
orl $0x2, %ecx
movl %ecx, 0x18(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
movq -0x10(%rbp), %rax
movl 0x18(%rax), %edx
callq 0x16afa0
jmp 0x4501b
addq $0x10, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)