// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/bmp.c
// Function: do_image_rle
static void do_image_rle(deark *c, lctx *d, dbuf *bits, i64 bits_offset)
{
	struct rle_dcmpr_ctx *rc = NULL;
	u8 use_mask = 0;
	u8 is_standard = 0;

	rc = de_malloc(c, sizeof(struct rle_dcmpr_ctx));

	switch(d->compression_type) {
	case CMPR_RLE4: rc->unit_size = 4; break;
	case CMPR_RLE8: rc->unit_size = 8; break;
	case CMPR_RLE24: rc->unit_size = 24; break;
	default:
		goto done;
	}

	if(rc->unit_size == d->bitcount) {
		is_standard = 1;
	}

	if(is_standard) {
		use_mask = 1;
		rc->mask = de_bitmap_create(c, d->width, d->height, 1);
	}
	else {
		rc->disallow_delta = 1;
	}

	rc->width_in_units = de_pad_to_n(d->bitcount*d->width, rc->unit_size)/rc->unit_size;
	rc->height = d->height;
	rc->dst_rowspan = d->rowspan;
	rc->inf = bits;
	rc->inf_startpos = bits_offset;
	rc->inf_endpos = bits->len;
	rc->unc_pixels = dbuf_create_membuf(c, rc->height*rc->dst_rowspan, 0x1);
	dbuf_enable_wbuffer(rc->unc_pixels);

	decompress_rle_to_bytes(c, rc);
	if(rc->errflag) goto done;

	if(!is_standard) {
		// For example, the nonstandard "Monochrome RLE" format supported by
		// the DOS software GDS, by Photodex.
		de_warn(c, "Nonstandard image type. Might not be decoded correctly.");
	}

	if(d->bitcount<=8) {
		do_image_paletted(c, d, rc->unc_pixels, 0, use_mask);
	}
	else {
		do_image_24bit(c, d, rc->unc_pixels, 0, use_mask);
	}

	if(rc->mask) {
		de_bitmap_apply_mask(d->img, rc->mask, 0);
	}

done:
	if(rc) {
		dbuf_close(rc->unc_pixels);
		de_bitmap_destroy(rc->mask);
		de_free(c, rc);
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq $0x0, -0x28(%rbp)
movb $0x0, -0x29(%rbp)
movb $0x0, -0x2a(%rbp)
movq -0x8(%rbp), %rdi
movl $0x68, %esi
callq 0x15b780
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
movl 0xa8(%rax), %eax
movl %eax, -0x30(%rbp)
subl $0xb, %eax
je 0x458f2
jmp 0x458de
movl -0x30(%rbp), %eax
subl $0xc, %eax
je 0x45900
jmp 0x458e8
movl -0x30(%rbp), %eax
subl $0xd, %eax
je 0x4590e
jmp 0x4591c
movq -0x28(%rbp), %rax
movq $0x4, 0x8(%rax)
jmp 0x45921
movq -0x28(%rbp), %rax
movq $0x8, 0x8(%rax)
jmp 0x45921
movq -0x28(%rbp), %rax
movq $0x18, 0x8(%rax)
jmp 0x45921
jmp 0x45ac9
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x10(%rbp), %rcx
cmpq 0x38(%rcx), %rax
jne 0x45937
movb $0x1, -0x2a(%rbp)
cmpb $0x0, -0x2a(%rbp)
je 0x4596c
movb $0x1, -0x29(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x50(%rax), %rsi
movq -0x10(%rbp), %rax
movq 0x60(%rax), %rdx
movl $0x1, %ecx
callq 0x16b750
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x48(%rax)
jmp 0x45973
movq -0x28(%rbp), %rax
movb $0x1, (%rax)
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rdi
movq -0x10(%rbp), %rax
imulq 0x50(%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x15ce90
movq -0x28(%rbp), %rcx
cqto
idivq 0x8(%rcx)
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x10(%rbp), %rax
movq 0x60(%rax), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x10(%rbp), %rax
movq 0xf8(%rax), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x18(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x30(%rax)
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x38(%rax)
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
movq 0x18(%rax), %rsi
movq -0x28(%rbp), %rax
imulq 0x20(%rax), %rsi
movl $0x1, %edx
callq 0x168020
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x40(%rax)
movq -0x28(%rbp), %rax
movq 0x40(%rax), %rdi
callq 0x167b90
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x45f70
movq -0x28(%rbp), %rax
cmpb $0x0, 0x66(%rax)
je 0x45a44
jmp 0x45ac9
cmpb $0x0, -0x2a(%rbp)
jne 0x45a5c
movq -0x8(%rbp), %rdi
leaq 0x15dfad(%rip), %rsi    # 0x1a3a02
movb $0x0, %al
callq 0x15bc10
movq -0x10(%rbp), %rax
cmpq $0x8, 0x38(%rax)
jg 0x45a87
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x28(%rbp), %rax
movq 0x40(%rax), %rdx
xorl %eax, %eax
movl %eax, %ecx
movzbl -0x29(%rbp), %r8d
callq 0x45420
jmp 0x45aa5
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x28(%rbp), %rax
movq 0x40(%rax), %rdx
xorl %eax, %eax
movl %eax, %ecx
movzbl -0x29(%rbp), %r8d
callq 0x454d0
movq -0x28(%rbp), %rax
cmpq $0x0, 0x48(%rax)
je 0x45ac7
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x48(%rax), %rsi
xorl %edx, %edx
callq 0x16cf60
jmp 0x45ac9
cmpq $0x0, -0x28(%rbp)
je 0x45af7
movq -0x28(%rbp), %rax
movq 0x40(%rax), %rdi
callq 0x1676a0
movq -0x28(%rbp), %rax
movq 0x48(%rax), %rdi
callq 0x16af60
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x15b820
addq $0x30, %rsp
popq %rbp
retq
nopl (%rax)