tool
extends Reference

func draw_line(x0 : int, y0 : int, x1 : int, y1 : int, image : Image, color : Color) -> void:
	image.lock()
	
	if abs(y1 - y0) < abs(x1 - x0):
		brenzenham_line_low(x0, y0, x1, y1, image, color)
	else:
		brenzenham_line_high(x0, y0, x1, y1, image, color)
		
	image.unlock()

func brenzenham_line_low(x0 : int, y0 : int, x1 : int, y1 : int, image : Image, color : Color) -> void:
	var dx : int = x1 - x0
	var dy : int = y1 - y0
	var yi : int = 1
	
	if dy < 0:
		yi = - 1
		dy = - dy

	var D : int = 2 * dy - dx
	var y : int = y0

	for x in range(x0, x1):
		image.set_pixel(x, y, color)
		
		if D > 0:
			y = y + yi
			D = D - 2 * dx

		D = D + 2 * dy
		
func brenzenham_line_high(x0 : int, y0 : int, x1 : int, y1 : int, image : Image, color : Color) -> void:
	var dx : int = x1 - x0
	var dy : int = y1 - y0
	var xi : int = 1
	
	if dx < 0:
		xi = -1
		dx = -dx

	var D : int = 2 * dx - dy
	var x : int = x0

	for y in range(y0, y1):
		image.set_pixel(x, y, color)

		if D > 0:
			x = x + xi
			D = D - 2 * dy

		D = D + 2 * dx