// File: /workspace/github_c_makefile_star2_O0/enzo1982[P]smooth/classes/graphics/backends/cairo/surfacecairo.cpp
// Function: smooth::GUI::SurfaceCairo::Line(smooth::GUI::Point const&, smooth::GUI::Point const&, smooth::GUI::Color const&)
S::Int S::GUI::SurfaceCairo::Line(const Point &iPos1, const Point &iPos2, const Color &color)
{
	if (window == NIL) return Success();

	Point	 pos1 = rightToLeft.TranslatePoint(iPos1);
	Point	 pos2 = rightToLeft.TranslatePoint(iPos2);

	/* Draw non-straight lines manually to work around bugs in XWayland.
	 */
	if (pos1.x != pos2.x && pos1.y != pos2.y)
	{
		Int	 steps	  = Math::Max(Math::Abs(pos2.x - pos1.x), Math::Abs(pos2.y - pos1.y));
		Float	 xAdvance = steps ? Float(pos2.x - pos1.x) / steps : 0;
		Float	 yAdvance = steps ? Float(pos2.y - pos1.y) / steps : 0;

		if (!painting)
		{
			CreateCairoContext();

			cairo_set_source_rgb(context, color.GetRed() / 255.0, color.GetGreen() / 255.0, color.GetBlue() / 255.0);

			for (Int i = 0; i < steps; i++) cairo_rectangle(context, pos1.x + i * xAdvance, pos1.y + i * yAdvance, 1.0, 1.0);
		
			cairo_fill(context);

			DestroyCairoContext();
		}

		cairo_set_source_rgb(paintContextCairo, color.GetRed() / 255.0, color.GetGreen() / 255.0, color.GetBlue() / 255.0);

		for (Int i = 0; i < steps; i++) cairo_rectangle(paintContextCairo, pos1.x + i * xAdvance, pos1.y + i * yAdvance, 1.0, 1.0);
		
		cairo_fill(paintContextCairo);
	}
	else
	{
		if (!painting)
		{
			CreateCairoContext();

			cairo_set_source_rgb(context, color.GetRed() / 255.0, color.GetGreen() / 255.0, color.GetBlue() / 255.0);
			cairo_set_line_width(context, 1.0);
			cairo_move_to(context, pos1.x + 0.01, pos1.y + 0.01);
			cairo_line_to(context, pos2.x + 0.01, pos2.y + 0.01);
			cairo_stroke(context);

			DestroyCairoContext();
		}

		cairo_set_source_rgb(paintContextCairo, color.GetRed() / 255.0, color.GetGreen() / 255.0, color.GetBlue() / 255.0);
		cairo_set_line_width(paintContextCairo, 1.0);
		cairo_move_to(paintContextCairo, pos1.x + 0.01, pos1.y + 0.01);
		cairo_line_to(paintContextCairo, pos2.x + 0.01, pos2.y + 0.01);
		cairo_stroke(paintContextCairo);
	}

	return Success();
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x120, %rsp            # imm = 0x120
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x88(%rbp)
cmpq $0x0, 0x50(%rax)
jne 0x12bb72
leaq -0x38(%rbp), %rdi
movq %rdi, -0x98(%rbp)
callq 0x5ca80
movq -0x98(%rbp), %rdi
callq 0x59680
movl %eax, -0x8c(%rbp)
jmp 0x12bb41
movl -0x8c(%rbp), %eax
movl %eax, -0x4(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x5a410
jmp 0x12c15a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x5a410
jmp 0x12c166
movq -0x88(%rbp), %rdi
addq $0x28, %rdi
movq -0x18(%rbp), %rsi
callq 0x73330
movq -0x88(%rbp), %rdi
movq %rax, -0x4c(%rbp)
addq $0x28, %rdi
movq -0x20(%rbp), %rsi
callq 0x73330
movq %rax, -0x54(%rbp)
movl -0x4c(%rbp), %eax
cmpl -0x54(%rbp), %eax
je 0x12be99
movl -0x48(%rbp), %eax
cmpl -0x50(%rbp), %eax
je 0x12be99
movl -0x54(%rbp), %edi
subl -0x4c(%rbp), %edi
callq 0x5c600
movl %eax, -0x9c(%rbp)
movl -0x50(%rbp), %edi
subl -0x48(%rbp), %edi
callq 0x5c600
movl -0x9c(%rbp), %edi
movl %eax, %esi
callq 0x5aae0
movl %eax, -0x58(%rbp)
cmpl $0x0, -0x58(%rbp)
je 0x12bc09
movl -0x54(%rbp), %eax
subl -0x4c(%rbp), %eax
cvtsi2sd %eax, %xmm0
cvtsi2sdl -0x58(%rbp), %xmm1
divsd %xmm1, %xmm0
movsd %xmm0, -0xa8(%rbp)
jmp 0x12bc16
xorps %xmm0, %xmm0
movsd %xmm0, -0xa8(%rbp)
jmp 0x12bc16
movsd -0xa8(%rbp), %xmm0
movsd %xmm0, -0x60(%rbp)
cmpl $0x0, -0x58(%rbp)
je 0x12bc46
movl -0x50(%rbp), %eax
subl -0x48(%rbp), %eax
cvtsi2sd %eax, %xmm0
cvtsi2sdl -0x58(%rbp), %xmm1
divsd %xmm1, %xmm0
movsd %xmm0, -0xb0(%rbp)
jmp 0x12bc53
xorps %xmm0, %xmm0
movsd %xmm0, -0xb0(%rbp)
jmp 0x12bc53
movq -0x88(%rbp), %rax
movsd -0xb0(%rbp), %xmm0
movsd %xmm0, -0x68(%rbp)
cmpw $0x0, 0xa(%rax)
jne 0x12bd8f
movq -0x88(%rbp), %rdi
callq 0x12b760
movq -0x88(%rbp), %rax
movq 0xc0(%rax), %rax
movq %rax, -0xc8(%rbp)
movq -0x28(%rbp), %rdi
callq 0x59f20
cvtsi2sd %eax, %xmm0
movsd 0x5b6a8(%rip), %xmm1    # 0x187350
divsd %xmm1, %xmm0
movsd %xmm0, -0xc0(%rbp)
movq -0x28(%rbp), %rdi
callq 0x5d920
cvtsi2sd %eax, %xmm0
movsd 0x5b687(%rip), %xmm1    # 0x187350
divsd %xmm1, %xmm0
movsd %xmm0, -0xb8(%rbp)
movq -0x28(%rbp), %rdi
callq 0x5b650
movq -0xc8(%rbp), %rdi
movsd -0xc0(%rbp), %xmm0
movsd -0xb8(%rbp), %xmm1
cvtsi2sd %eax, %xmm2
movsd 0x5b64f(%rip), %xmm3    # 0x187350
divsd %xmm3, %xmm2
callq 0x5c970
movl $0x0, -0x6c(%rbp)
movl -0x6c(%rbp), %eax
cmpl -0x58(%rbp), %eax
jge 0x12bd70
movq -0x88(%rbp), %rax
movq 0xc0(%rax), %rdi
cvtsi2sdl -0x4c(%rbp), %xmm1
cvtsi2sdl -0x6c(%rbp), %xmm0
movsd -0x60(%rbp), %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
cvtsi2sdl -0x48(%rbp), %xmm2
cvtsi2sdl -0x6c(%rbp), %xmm1
movsd -0x68(%rbp), %xmm3
mulsd %xmm3, %xmm1
addsd %xmm2, %xmm1
movsd 0x5b60b(%rip), %xmm3    # 0x187368
movaps %xmm3, %xmm2
callq 0x5aa10
movl -0x6c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x6c(%rbp)
jmp 0x12bd11
movq -0x88(%rbp), %rax
movq 0xc0(%rax), %rdi
callq 0x5c620
movq -0x88(%rbp), %rdi
callq 0x12b7f0
movq -0x88(%rbp), %rax
movq 0xd0(%rax), %rax
movq %rax, -0xe0(%rbp)
movq -0x28(%rbp), %rdi
callq 0x59f20
cvtsi2sd %eax, %xmm0
movsd 0x5b597(%rip), %xmm1    # 0x187350
divsd %xmm1, %xmm0
movsd %xmm0, -0xd8(%rbp)
movq -0x28(%rbp), %rdi
callq 0x5d920
cvtsi2sd %eax, %xmm0
movsd 0x5b576(%rip), %xmm1    # 0x187350
divsd %xmm1, %xmm0
movsd %xmm0, -0xd0(%rbp)
movq -0x28(%rbp), %rdi
callq 0x5b650
movq -0xe0(%rbp), %rdi
movsd -0xd8(%rbp), %xmm0
movsd -0xd0(%rbp), %xmm1
cvtsi2sd %eax, %xmm2
movsd 0x5b53e(%rip), %xmm3    # 0x187350
divsd %xmm3, %xmm2
callq 0x5c970
movl $0x0, -0x70(%rbp)
movl -0x70(%rbp), %eax
cmpl -0x58(%rbp), %eax
jge 0x12be81
movq -0x88(%rbp), %rax
movq 0xd0(%rax), %rdi
cvtsi2sdl -0x4c(%rbp), %xmm1
cvtsi2sdl -0x70(%rbp), %xmm0
movsd -0x60(%rbp), %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
cvtsi2sdl -0x48(%rbp), %xmm2
cvtsi2sdl -0x70(%rbp), %xmm1
movsd -0x68(%rbp), %xmm3
mulsd %xmm3, %xmm1
addsd %xmm2, %xmm1
movsd 0x5b4fa(%rip), %xmm3    # 0x187368
movaps %xmm3, %xmm2
callq 0x5aa10
movl -0x70(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x70(%rbp)
jmp 0x12be22
movq -0x88(%rbp), %rax
movq 0xd0(%rax), %rdi
callq 0x5c620
jmp 0x12c10b
movq -0x88(%rbp), %rax
cmpw $0x0, 0xa(%rax)
jne 0x12bfe7
movq -0x88(%rbp), %rdi
callq 0x12b760
movq -0x88(%rbp), %rax
movq 0xc0(%rax), %rax
movq %rax, -0xf8(%rbp)
movq -0x28(%rbp), %rdi
callq 0x59f20
cvtsi2sd %eax, %xmm0
movsd 0x5b46f(%rip), %xmm1    # 0x187350
divsd %xmm1, %xmm0
movsd %xmm0, -0xf0(%rbp)
movq -0x28(%rbp), %rdi
callq 0x5d920
cvtsi2sd %eax, %xmm0
movsd 0x5b44e(%rip), %xmm1    # 0x187350
divsd %xmm1, %xmm0
movsd %xmm0, -0xe8(%rbp)
movq -0x28(%rbp), %rdi
callq 0x5b650
movq -0xf8(%rbp), %rdi
movsd -0xf0(%rbp), %xmm0
movsd -0xe8(%rbp), %xmm1
cvtsi2sd %eax, %xmm2
movsd 0x5b416(%rip), %xmm3    # 0x187350
divsd %xmm3, %xmm2
callq 0x5c970
movq -0x88(%rbp), %rax
movq 0xc0(%rax), %rdi
movsd 0x5b40f(%rip), %xmm0    # 0x187368
callq 0x5b2e0
movq -0x88(%rbp), %rax
movq 0xc0(%rax), %rdi
cvtsi2sdl -0x4c(%rbp), %xmm0
movsd 0x7ae67(%rip), %xmm1    # 0x1a6de0
addsd %xmm1, %xmm0
cvtsi2sdl -0x48(%rbp), %xmm1
movsd 0x7ae56(%rip), %xmm2    # 0x1a6de0
addsd %xmm2, %xmm1
callq 0x5b970
movq -0x88(%rbp), %rax
movq 0xc0(%rax), %rdi
cvtsi2sdl -0x54(%rbp), %xmm0
movsd 0x7ae32(%rip), %xmm1    # 0x1a6de0
addsd %xmm1, %xmm0
cvtsi2sdl -0x50(%rbp), %xmm1
movsd 0x7ae21(%rip), %xmm2    # 0x1a6de0
addsd %xmm2, %xmm1
callq 0x5a8c0
movq -0x88(%rbp), %rax
movq 0xc0(%rax), %rdi
callq 0x5b610
movq -0x88(%rbp), %rdi
callq 0x12b7f0
movq -0x88(%rbp), %rax
movq 0xd0(%rax), %rax
movq %rax, -0x110(%rbp)
movq -0x28(%rbp), %rdi
callq 0x59f20
cvtsi2sd %eax, %xmm0
movsd 0x5b33f(%rip), %xmm1    # 0x187350
divsd %xmm1, %xmm0
movsd %xmm0, -0x108(%rbp)
movq -0x28(%rbp), %rdi
callq 0x5d920
cvtsi2sd %eax, %xmm0
movsd 0x5b31e(%rip), %xmm1    # 0x187350
divsd %xmm1, %xmm0
movsd %xmm0, -0x100(%rbp)
movq -0x28(%rbp), %rdi
callq 0x5b650
movq -0x110(%rbp), %rdi
movsd -0x108(%rbp), %xmm0
movsd -0x100(%rbp), %xmm1
cvtsi2sd %eax, %xmm2
movsd 0x5b2e6(%rip), %xmm3    # 0x187350
divsd %xmm3, %xmm2
callq 0x5c970
movq -0x88(%rbp), %rax
movq 0xd0(%rax), %rdi
movsd 0x5b2df(%rip), %xmm0    # 0x187368
callq 0x5b2e0
movq -0x88(%rbp), %rax
movq 0xd0(%rax), %rdi
cvtsi2sdl -0x4c(%rbp), %xmm0
movsd 0x7ad37(%rip), %xmm1    # 0x1a6de0
addsd %xmm1, %xmm0
cvtsi2sdl -0x48(%rbp), %xmm1
movsd 0x7ad26(%rip), %xmm2    # 0x1a6de0
addsd %xmm2, %xmm1
callq 0x5b970
movq -0x88(%rbp), %rax
movq 0xd0(%rax), %rdi
cvtsi2sdl -0x54(%rbp), %xmm0
movsd 0x7ad02(%rip), %xmm1    # 0x1a6de0
addsd %xmm1, %xmm0
cvtsi2sdl -0x50(%rbp), %xmm1
movsd 0x7acf1(%rip), %xmm2    # 0x1a6de0
addsd %xmm2, %xmm1
callq 0x5a8c0
movq -0x88(%rbp), %rax
movq 0xd0(%rax), %rdi
callq 0x5b610
leaq -0x80(%rbp), %rdi
movq %rdi, -0x120(%rbp)
callq 0x5ca80
movq -0x120(%rbp), %rdi
callq 0x59680
movl %eax, -0x114(%rbp)
jmp 0x12c12f
movl -0x114(%rbp), %eax
movl %eax, -0x4(%rbp)
leaq -0x80(%rbp), %rdi
callq 0x5a410
jmp 0x12c15a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x80(%rbp), %rdi
callq 0x5a410
jmp 0x12c166
movl -0x4(%rbp), %eax
addq $0x120, %rsp            # imm = 0x120
popq %rbp
retq
movq -0x40(%rbp), %rdi
callq 0x5b6b0
nop