// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/src/deark-png.c
// Function: de_write_png
int de_write_png(deark *c, struct de_write_image_params *wp)
{
	const char *opt_level;
	int retval = 0;
	struct deark_png_encode_info *pei = NULL;

	pei = de_malloc(c, sizeof(struct deark_png_encode_info));
	pei->c = c;

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

	// Optimization to speed up list mode
	if(wp->f->btype==DBUF_TYPE_NULL && !c->enable_oinfo) {
		goto done;
	}

	pei->img = wp->img;
	pei->imglo = wp->imglo;
	if(wp->flags2 & 0x1) {
		pei->encode_as_bwimg = 1;
	}
	if(wp->flags2 & 0x2) {
		pei->linear_colorspace = 1;
	}

	if(wp->f->fi_copy && wp->f->fi_copy->density.code>0 && c->write_density) {
		pei->has_phys = 1;
		if(wp->f->fi_copy->density.code==1) { // unspecified units
			pei->phys_units = 0;
			pei->xdens = (u32)(wp->f->fi_copy->density.xdens+0.5);
			pei->ydens = (u32)(wp->f->fi_copy->density.ydens+0.5);
		}
		else if(wp->f->fi_copy->density.code==2) { // dpi
			pei->phys_units = 1; // pixels/meter
			pei->xdens = (u32)(0.5+wp->f->fi_copy->density.xdens/0.0254);
			pei->ydens = (u32)(0.5+wp->f->fi_copy->density.ydens/0.0254);
		}
	}

	if(pei->has_phys && pei->xdens==pei->ydens && pei->phys_units==0) {
		// Useless density information. Don't bother to write it.
		pei->has_phys = 0;
	}

	// Detect likely-bogus density settings.
	if(pei->has_phys) {
		if(pei->xdens<=0 || pei->ydens<=0 ||
			(pei->xdens > pei->ydens*5) || (pei->ydens > pei->xdens*5))
		{
			pei->has_phys = 0;
		}
	}

	pei->outf = wp->f;
	if(!c->padpix && wp->img->unpadded_width>0 && wp->img->unpadded_width<wp->img->width) {
		pei->width = (int)wp->img->unpadded_width;
	}
	else {
		pei->width = (int)wp->img->width;
	}
	pei->src_rowspan = (int)(wp->img->width * wp->img->bytes_per_pixel);
	pei->height = (int)wp->img->height;
	pei->flip = (wp->createflags & DE_CREATEFLAG_FLIP_IMAGE)?1:0;
	pei->num_chans = wp->img->bytes_per_pixel;
	pei->samples_per_row = pei->width * pei->num_chans;
	pei->include_text_chunk_software = 0;

	if(!c->pngcprlevel_valid) {
		c->pngcmprlevel = 9; // default
		c->pngcprlevel_valid = 1;

		opt_level = de_get_ext_option(c, "pngcmprlevel");
		if(opt_level) {
			i64 opt_level_n = de_atoi64(opt_level);
			if(opt_level_n>10) {
				c->pngcmprlevel = 10;
			}
			else if(opt_level_n<0) {
				c->pngcmprlevel = 6;
			}
			else {
				c->pngcmprlevel = (unsigned int)opt_level_n;
			}
		}
	}
	pei->level = c->pngcmprlevel;

	if(wp->f->fi_copy && wp->f->fi_copy->internal_mod_time.is_valid) {
		pei->internal_mod_time = wp->f->fi_copy->internal_mod_time;
	}

	if(wp->f->fi_copy && wp->f->fi_copy->has_hotspot) {
		pei->has_hotspot = 1;
		pei->hotspot_x = wp->f->fi_copy->hotspot_x;
		pei->hotspot_y = wp->f->fi_copy->hotspot_y;
		// Leave a hint as to where our custom Hotspot chunk came from.
		pei->include_text_chunk_software = 1;
	}

	pei->crco = de_crcobj_create(c, DE_CRCOBJ_CRC32_IEEE);

	if(!do_generate_png(pei, wp->img->bitmap)) {
		de_err(c, "PNG write failed");
		goto done;
	}

	retval = 1;

done:
	if(pei) {
		de_crcobj_destroy(pei->crco);
		de_free(c, pei->tmprow);
		de_free(c, pei);
	}
	return retval;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl $0x0, -0x1c(%rbp)
movq $0x0, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movl $0x88, %esi
callq 0x15b780
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rax
cmpl $0x0, 0x20(%rax)
je 0x19aabe
jmp 0x19afcf
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rsi
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x10(%rax), %rdx
callq 0x16a850
cmpl $0x0, %eax
jne 0x19aae7
jmp 0x19afcf
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
cmpl $0x0, (%rax)
jne 0x19ab06
movq -0x8(%rbp), %rax
cmpb $0x0, 0x96(%rax)
jne 0x19ab06
jmp 0x19afcf
movq -0x10(%rbp), %rax
movq (%rax), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x10(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0x19ab3c
movq -0x28(%rbp), %rax
movb $0x1, 0x62(%rax)
movq -0x10(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x2, %eax
cmpl $0x0, %eax
je 0x19ab53
movq -0x28(%rbp), %rax
movb $0x1, 0x49(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
cmpq $0x0, 0xd0(%rax)
je 0x19aca8
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0xd0(%rax), %rax
cmpl $0x0, 0x78(%rax)
jle 0x19aca8
movq -0x8(%rbp), %rax
movzbl 0xcd(%rax), %eax
cmpl $0x0, %eax
je 0x19aca8
movq -0x28(%rbp), %rax
movl $0x1, 0x3c(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0xd0(%rax), %rax
cmpl $0x1, 0x78(%rax)
jne 0x19ac1d
movq -0x28(%rbp), %rax
movb $0x0, 0x48(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0xd0(%rax), %rax
movsd 0x80(%rax), %xmm0
movsd 0x8a5b(%rip), %xmm1     # 0x1a3638
addsd %xmm1, %xmm0
cvttsd2si %xmm0, %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x40(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0xd0(%rax), %rax
movsd 0x88(%rax), %xmm0
addsd %xmm1, %xmm0
cvttsd2si %xmm0, %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x44(%rax)
jmp 0x19aca6
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0xd0(%rax), %rax
cmpl $0x2, 0x78(%rax)
jne 0x19aca4
movq -0x28(%rbp), %rax
movb $0x1, 0x48(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0xd0(%rax), %rax
movsd 0x80(%rax), %xmm0
movsd 0x6557(%rip), %xmm2     # 0x1a11b0
divsd %xmm2, %xmm0
movsd 0x89d3(%rip), %xmm1     # 0x1a3638
addsd %xmm1, %xmm0
cvttsd2si %xmm0, %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x40(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0xd0(%rax), %rax
movsd 0x88(%rax), %xmm0
divsd %xmm2, %xmm0
addsd %xmm1, %xmm0
cvttsd2si %xmm0, %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x44(%rax)
jmp 0x19aca6
jmp 0x19aca8
movq -0x28(%rbp), %rax
cmpl $0x0, 0x3c(%rax)
je 0x19acda
movq -0x28(%rbp), %rax
movl 0x40(%rax), %eax
movq -0x28(%rbp), %rcx
cmpl 0x44(%rcx), %eax
jne 0x19acda
movq -0x28(%rbp), %rax
movzbl 0x48(%rax), %eax
cmpl $0x0, %eax
jne 0x19acda
movq -0x28(%rbp), %rax
movl $0x0, 0x3c(%rax)
movq -0x28(%rbp), %rax
cmpl $0x0, 0x3c(%rax)
je 0x19ad2b
movq -0x28(%rbp), %rax
cmpl $0x0, 0x40(%rax)
jbe 0x19ad1e
movq -0x28(%rbp), %rax
cmpl $0x0, 0x44(%rax)
jbe 0x19ad1e
movq -0x28(%rbp), %rax
movl 0x40(%rax), %eax
movq -0x28(%rbp), %rcx
imull $0x5, 0x44(%rcx), %ecx
cmpl %ecx, %eax
ja 0x19ad1e
movq -0x28(%rbp), %rax
movl 0x44(%rax), %eax
movq -0x28(%rbp), %rcx
imull $0x5, 0x40(%rcx), %ecx
cmpl %ecx, %eax
jbe 0x19ad29
movq -0x28(%rbp), %rax
movl $0x0, 0x3c(%rax)
jmp 0x19ad2b
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x8(%rbp), %rax
cmpb $0x0, 0xd5(%rax)
jne 0x19ad84
movq -0x10(%rbp), %rax
movq (%rax), %rax
cmpq $0x0, 0x18(%rax)
jle 0x19ad84
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x18(%rax), %rax
movq -0x10(%rbp), %rcx
movq (%rcx), %rcx
cmpq 0x8(%rcx), %rax
jge 0x19ad84
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x18(%rax), %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x20(%rax)
jmp 0x19ad98
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rax
movq -0x10(%rbp), %rcx
movq (%rcx), %rcx
movslq 0x24(%rcx), %rcx
imulq %rcx, %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x28(%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x10(%rax), %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x24(%rax)
movq -0x10(%rbp), %rax
movl 0x18(%rax), %edx
andl $0x4, %edx
xorl %ecx, %ecx
movl $0x1, %eax
cmpl $0x0, %edx
cmovnel %eax, %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x34(%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rax
movl 0x24(%rax), %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x2c(%rax)
movq -0x28(%rbp), %rax
movl 0x20(%rax), %ecx
movq -0x28(%rbp), %rax
imull 0x2c(%rax), %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x30(%rax)
movq -0x28(%rbp), %rax
movb $0x0, 0x60(%rax)
movq -0x8(%rbp), %rax
cmpb $0x0, 0x12d(%rax)
jne 0x19aeb2
movq -0x8(%rbp), %rax
movl $0x9, 0x130(%rax)
movq -0x8(%rbp), %rax
movb $0x1, 0x12d(%rax)
movq -0x8(%rbp), %rdi
leaq 0x42ba2(%rip), %rsi     # 0x1dd9f3
callq 0x15cb30
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
je 0x19aeb0
movq -0x18(%rbp), %rdi
callq 0x15ccc0
movq %rax, -0x30(%rbp)
cmpq $0xa, -0x30(%rbp)
jle 0x19ae85
movq -0x8(%rbp), %rax
movl $0xa, 0x130(%rax)
jmp 0x19aeae
cmpq $0x0, -0x30(%rbp)
jge 0x19ae9c
movq -0x8(%rbp), %rax
movl $0x6, 0x130(%rax)
jmp 0x19aeac
movq -0x30(%rbp), %rax
movl %eax, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x130(%rax)
jmp 0x19aeae
jmp 0x19aeb0
jmp 0x19aeb2
movq -0x8(%rbp), %rax
movl 0x130(%rax), %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x38(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
cmpq $0x0, 0xd0(%rax)
je 0x19af10
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0xd0(%rax), %rax
movzbl 0x68(%rax), %eax
cmpl $0x0, %eax
je 0x19af10
movq -0x28(%rbp), %rax
movq -0x10(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq 0xd0(%rcx), %rcx
movq 0x68(%rcx), %rdx
movq %rdx, 0x50(%rax)
movq 0x70(%rcx), %rcx
movq %rcx, 0x58(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
cmpq $0x0, 0xd0(%rax)
je 0x19af82
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0xd0(%rax), %rax
movzbl 0xe(%rax), %eax
cmpl $0x0, %eax
je 0x19af82
movq -0x28(%rbp), %rax
movb $0x1, 0x61(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0xd0(%rax), %rax
movl 0x98(%rax), %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x64(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0xd0(%rax), %rax
movl 0x9c(%rax), %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x68(%rax)
movq -0x28(%rbp), %rax
movb $0x1, 0x60(%rax)
movq -0x8(%rbp), %rdi
movl $0x10, %esi
callq 0x15eac0
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x70(%rax)
movq -0x28(%rbp), %rdi
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x28(%rax), %rsi
callq 0x19b010
cmpl $0x0, %eax
jne 0x19afc8
movq -0x8(%rbp), %rdi
leaq 0x42a41(%rip), %rsi     # 0x1dda00
movb $0x0, %al
callq 0x15bfb0
jmp 0x19afcf
movl $0x1, -0x1c(%rbp)
cmpq $0x0, -0x28(%rbp)
je 0x19b004
movq -0x28(%rbp), %rax
movq 0x70(%rax), %rdi
callq 0x15f2e0
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
movq 0x80(%rax), %rsi
callq 0x15b820
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x15b820
movl -0x1c(%rbp), %eax
addq $0x30, %rsp
popq %rbp
retq
nopl (%rax)