// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/bmp.c
// Function: decompress_rle_to_bytes
static void decompress_rle_to_bytes(deark *c, struct rle_dcmpr_ctx *rc)
{
	i64 pos = rc->inf_startpos;

	while(1) {
		i64 num_bytes_to_read;
		i64 num_units_to_decode;
		i64 num_units_decoded;
		i64 k;
		u8 b1, b2;
		u8 b;
		u8 pix1, pix2;
		u8 cg, cr, cb;

		if(pos >= rc->inf_endpos) {
			goto done;
		}
		if(rc->ypos >= rc->height) {
			goto done;
		}
		if(rc->ypos==(rc->height-1) && (rc->xpos>=rc->width_in_units)) {
			goto done;
		}

		// Read the next two bytes from the input file.
		b1 = dbuf_getbyte_p(rc->inf, &pos);
		b2 = dbuf_getbyte_p(rc->inf, &pos);
		if(b1==0 && b2==0) { // End of line
			rc->xpos = 0;
			rc->ypos++;
			rle_to_bytes_on_eol(c, rc, rc->ypos);
		}
		else if(b1==0 && b2==1) { // End of bitmap
			goto done;
		}
		else if(b1==0 && b2==2) { // Delta
			i64 newxpos, newypos;

			rc->delta_used = 1;
			if(rc->disallow_delta) {
				rc->errflag = 1;
				goto done;
			}

			b = dbuf_getbyte_p(rc->inf, &pos);
			newxpos = rc->xpos + (i64)b;
			b = dbuf_getbyte_p(rc->inf, &pos);
			newypos = rc->ypos + (i64)b;

			if(newxpos>rc->width_in_units) {
				newxpos = rc->width_in_units;
			}
			if(newypos>=rc->height) goto done;

			while(rc->ypos<newypos) {
				rc->ypos++;
				rc->xpos = 0;
				rle_to_bytes_on_eol(c, rc, rc->ypos);
			}
			while(rc->xpos<newxpos) {
				if(rc->unit_size==4) {
					rle_to_bytes_append_unit4(c, rc, 0, 0);
				}
				else if(rc->unit_size==24) {
					rle_to_bytes_append_unit24(c, rc, 0, 0, 0, 0);
				}
				else {
					rle_to_bytes_append_unit8(c, rc, 0, 0);
				}
			}
		}
		else if(b1==0) { // b2 noncompressed pixels
			if(rc->unit_size==4) { // b2 noncompressed pixels (4-bit units) follow
				num_units_to_decode = (i64)b2;
				num_bytes_to_read = ((num_units_to_decode+3)/4)*2;
				num_units_decoded = 0;
				for(k=0; k<num_bytes_to_read; k++) {
					UI q;

					b = dbuf_getbyte_p(rc->inf, &pos);
					for(q=0; (q<2) && (num_units_decoded<num_units_to_decode); q++) {
						if(q==0) pix1 = b>>4;
						else pix1 = b&0x0f;
						rle_to_bytes_append_unit4(c, rc, pix1, 1);
						num_units_decoded++;
					}
				}
			}
			else if(rc->unit_size==24) {
				num_units_to_decode = (i64)b2;
				for(k=0; k<num_units_to_decode; k++) {
					cb = dbuf_getbyte_p(rc->inf, &pos);
					cg = dbuf_getbyte_p(rc->inf, &pos);
					cr = dbuf_getbyte_p(rc->inf, &pos);
					rle_to_bytes_append_unit24(c, rc, cr, cg, cb, 1);
				}
				if(num_units_to_decode % 2) {
					pos++;
				}
			}
			else { // b2 noncompressed pixels (8-bit units) follow
				num_units_to_decode = (i64)b2;
				num_bytes_to_read = de_pad_to_2(num_units_to_decode);
				num_units_decoded = 0;

				for(k=0; k<num_bytes_to_read; k++) {
					b = dbuf_getbyte_p(rc->inf, &pos);
					if(num_units_decoded<num_units_to_decode) {
						rle_to_bytes_append_unit8(c, rc, b, 1);
						num_units_decoded++;
					}
				}
			}
		}
		else { // Compressed pixels - b1 pixels
			num_units_to_decode = (i64)b1;
			if(rc->unit_size==4) { // b1 pixels alternating between the colors in b2
				pix1 = b2>>4;
				pix2 = b2&0x0f;
				for(k=0; k<num_units_to_decode; k++) {
					rle_to_bytes_append_unit4(c, rc, (k%2)?pix2:pix1, 1);
				}
			}
			else if(rc->unit_size==24) {
				cg = dbuf_getbyte_p(rc->inf, &pos);
				cr = dbuf_getbyte_p(rc->inf, &pos);
				for(k=0; k<num_units_to_decode; k++) {
					rle_to_bytes_append_unit24(c, rc, cr, cg, b2, 1);
				}
			}
			else { // 8:  b1 pixels of color b2
				for(k=0; k<num_units_to_decode; k++) {
					rle_to_bytes_append_unit8(c, rc, b2, 1);
				}
			}
		}
	}

done:
	rle_to_bytes_on_eol(c, rc, rc->height);
	dbuf_flush(rc->unc_pixels);
	if(rc->errflag) {
		de_err(c, "Decompression failed");
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq 0x30(%rax), %rax
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x38(%rcx), %rax
jl 0x45f9f
jmp 0x4656a
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x10(%rbp), %rcx
cmpq 0x18(%rcx), %rax
jl 0x45fb6
jmp 0x4656a
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x18(%rcx), %rcx
subq $0x1, %rcx
cmpq %rcx, %rax
jne 0x45fe6
movq -0x10(%rbp), %rax
movq 0x50(%rax), %rax
movq -0x10(%rbp), %rcx
cmpq 0x10(%rcx), %rax
jl 0x45fe6
jmp 0x4656a
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
leaq -0x18(%rbp), %rsi
callq 0x165170
movb %al, -0x39(%rbp)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
leaq -0x18(%rbp), %rsi
callq 0x165170
movb %al, -0x3a(%rbp)
movzbl -0x39(%rbp), %eax
cmpl $0x0, %eax
jne 0x46056
movzbl -0x3a(%rbp), %eax
cmpl $0x0, %eax
jne 0x46056
movq -0x10(%rbp), %rax
movq $0x0, 0x50(%rax)
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x58(%rax)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rdx
callq 0x465b0
jmp 0x46565
movzbl -0x39(%rbp), %eax
cmpl $0x0, %eax
jne 0x4606d
movzbl -0x3a(%rbp), %eax
cmpl $0x1, %eax
jne 0x4606d
jmp 0x4656a
movzbl -0x39(%rbp), %eax
cmpl $0x0, %eax
jne 0x461d1
movzbl -0x3a(%rbp), %eax
cmpl $0x2, %eax
jne 0x461d1
movq -0x10(%rbp), %rax
movb $0x1, 0x65(%rax)
movq -0x10(%rbp), %rax
cmpb $0x0, (%rax)
je 0x460a5
movq -0x10(%rbp), %rax
movb $0x1, 0x66(%rax)
jmp 0x4656a
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
leaq -0x18(%rbp), %rsi
callq 0x165170
movb %al, -0x3b(%rbp)
movq -0x10(%rbp), %rax
movq 0x50(%rax), %rax
movzbl -0x3b(%rbp), %ecx
addq %rcx, %rax
movq %rax, -0x48(%rbp)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
leaq -0x18(%rbp), %rsi
callq 0x165170
movb %al, -0x3b(%rbp)
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movzbl -0x3b(%rbp), %ecx
addq %rcx, %rax
movq %rax, -0x50(%rbp)
movq -0x48(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x10(%rcx), %rax
jle 0x4610d
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x48(%rbp)
movq -0x50(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x18(%rcx), %rax
jl 0x46120
jmp 0x4656a
jmp 0x46122
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
cmpq -0x50(%rbp), %rax
jge 0x46163
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x58(%rax)
movq -0x10(%rbp), %rax
movq $0x0, 0x50(%rax)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rdx
callq 0x465b0
jmp 0x46122
jmp 0x46165
movq -0x10(%rbp), %rax
movq 0x50(%rax), %rax
cmpq -0x48(%rbp), %rax
jge 0x461cc
movq -0x10(%rbp), %rax
cmpq $0x4, 0x8(%rax)
jne 0x46191
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
xorl %ecx, %ecx
movl %ecx, %edx
callq 0x46600
jmp 0x461ca
movq -0x10(%rbp), %rax
cmpq $0x18, 0x8(%rax)
jne 0x461b7
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
xorl %r9d, %r9d
movl %r9d, %edx
movl %r9d, %ecx
movl %r9d, %r8d
callq 0x466c0
jmp 0x461c8
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
xorl %ecx, %ecx
movl %ecx, %edx
callq 0x46790
jmp 0x461ca
jmp 0x46165
jmp 0x46561
movzbl -0x39(%rbp), %eax
cmpl $0x0, %eax
jne 0x4640e
movq -0x10(%rbp), %rax
cmpq $0x4, 0x8(%rax)
jne 0x462ca
movzbl -0x3a(%rbp), %eax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
addq $0x3, %rax
movl $0x4, %ecx
cqto
idivq %rcx
shlq %rax
movq %rax, -0x20(%rbp)
movq $0x0, -0x30(%rbp)
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
cmpq -0x20(%rbp), %rax
jge 0x462c5
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
leaq -0x18(%rbp), %rsi
callq 0x165170
movb %al, -0x3b(%rbp)
movl $0x0, -0x54(%rbp)
xorl %eax, %eax
cmpl $0x2, -0x54(%rbp)
movb %al, -0x55(%rbp)
jae 0x46260
movq -0x30(%rbp), %rax
cmpq -0x28(%rbp), %rax
setl %al
movb %al, -0x55(%rbp)
movb -0x55(%rbp), %al
testb $0x1, %al
jne 0x46269
jmp 0x462b2
cmpl $0x0, -0x54(%rbp)
jne 0x4627b
movzbl -0x3b(%rbp), %eax
sarl $0x4, %eax
movb %al, -0x3c(%rbp)
jmp 0x46285
movzbl -0x3b(%rbp), %eax
andl $0xf, %eax
movb %al, -0x3c(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movl $0x1, %ecx
movzbl -0x3c(%rbp), %edx
callq 0x46600
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
movl -0x54(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x54(%rbp)
jmp 0x46247
jmp 0x462b4
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x4621e
jmp 0x46409
movq -0x10(%rbp), %rax
cmpq $0x18, 0x8(%rax)
jne 0x46386
movzbl -0x3a(%rbp), %eax
movq %rax, -0x28(%rbp)
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
cmpq -0x28(%rbp), %rax
jge 0x46361
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
leaq -0x18(%rbp), %rsi
callq 0x165170
movb %al, -0x40(%rbp)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
leaq -0x18(%rbp), %rsi
callq 0x165170
movb %al, -0x3e(%rbp)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
leaq -0x18(%rbp), %rsi
callq 0x165170
movb %al, -0x3f(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movb -0x3f(%rbp), %cl
movb -0x3e(%rbp), %al
movl $0x1, %r9d
movzbl %cl, %edx
movzbl %al, %ecx
movzbl -0x40(%rbp), %r8d
callq 0x466c0
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x462e9
movq -0x28(%rbp), %rax
movl $0x2, %ecx
cqto
idivq %rcx
cmpq $0x0, %rdx
je 0x46381
movq -0x18(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x18(%rbp)
jmp 0x46407
movzbl -0x3a(%rbp), %eax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
callq 0x15cdf0
movq %rax, -0x20(%rbp)
movq $0x0, -0x30(%rbp)
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
cmpq -0x20(%rbp), %rax
jge 0x46405
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
leaq -0x18(%rbp), %rsi
callq 0x165170
movb %al, -0x3b(%rbp)
movq -0x30(%rbp), %rax
cmpq -0x28(%rbp), %rax
jge 0x463f5
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movl $0x1, %ecx
movzbl -0x3b(%rbp), %edx
callq 0x46790
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
jmp 0x463f7
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x463ab
jmp 0x46407
jmp 0x46409
jmp 0x4655f
movzbl -0x39(%rbp), %eax
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
cmpq $0x4, 0x8(%rax)
jne 0x464aa
movzbl -0x3a(%rbp), %eax
sarl $0x4, %eax
movb %al, -0x3c(%rbp)
movzbl -0x3a(%rbp), %eax
andl $0xf, %eax
movb %al, -0x3d(%rbp)
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
cmpq -0x28(%rbp), %rax
jge 0x464a5
movq -0x8(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x38(%rbp), %rax
movl $0x2, %ecx
cqto
idivq %rcx
cmpq $0x0, %rdx
je 0x46478
movzbl -0x3d(%rbp), %eax
movl %eax, -0x6c(%rbp)
jmp 0x4647f
movzbl -0x3c(%rbp), %eax
movl %eax, -0x6c(%rbp)
movq -0x60(%rbp), %rsi
movq -0x68(%rbp), %rdi
movl -0x6c(%rbp), %eax
movl $0x1, %ecx
movzbl %al, %edx
callq 0x46600
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x46441
jmp 0x4655d
movq -0x10(%rbp), %rax
cmpq $0x18, 0x8(%rax)
jne 0x46523
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
leaq -0x18(%rbp), %rsi
callq 0x165170
movb %al, -0x3e(%rbp)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
leaq -0x18(%rbp), %rsi
callq 0x165170
movb %al, -0x3f(%rbp)
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
cmpq -0x28(%rbp), %rax
jge 0x46521
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movb -0x3f(%rbp), %cl
movb -0x3e(%rbp), %al
movl $0x1, %r9d
movzbl %cl, %edx
movzbl %al, %ecx
movzbl -0x3a(%rbp), %r8d
callq 0x466c0
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x464e5
jmp 0x4655b
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
cmpq -0x28(%rbp), %rax
jge 0x46559
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movl $0x1, %ecx
movzbl -0x3a(%rbp), %edx
callq 0x46790
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x4652b
jmp 0x4655b
jmp 0x4655d
jmp 0x4655f
jmp 0x46561
jmp 0x46563
jmp 0x46565
jmp 0x45f8c
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdx
callq 0x465b0
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rdi
callq 0x167c30
movq -0x10(%rbp), %rax
cmpb $0x0, 0x66(%rax)
je 0x465a8
movq -0x8(%rbp), %rdi
leaq 0x158877(%rip), %rsi    # 0x19ee18
movb $0x0, %al
callq 0x15bfb0
addq $0x70, %rsp
popq %rbp
retq
nop