
local function drawPixelInternal( xPos, yPos )
	term.setCursorPos(xPos, yPos)
	term.write(" ")
end

local tColourLookup = {}
for n=1,16 do
	tColourLookup[ string.byte( "0123456789abcdef",n,n ) ] = 2^(n-1)
end

function loadImage( sPath )
	local tImage = {}
	if fs.exists( sPath ) then
		local file = io.open(sPath, "r" )
		local sLine = file:read()
		while sLine do
			local tLine = {}
			for x=1,sLine:len() do
				tLine[x] = tColourLookup[ string.byte(sLine,x,x) ] or 0
			end
			table.insert( tImage, tLine )
			sLine = file:read()
		end
		file:close()
		return tImage
	end
	return nil
end

function drawPixel( xPos, yPos, nColour )
	if nColour then
		term.setBackgroundColor( nColour )
	end
	drawPixelInternal( xPos, yPos )
end

function drawLine( startX, startY, endX, endY, nColour )
	if nColour then
		term.setBackgroundColor( nColour )
	end
	
	startX = math.floor(startX)
	startY = math.floor(startY)
	endX = math.floor(endX)
	endY = math.floor(endY)
	
	if startX == endX and startY == endY then
		drawPixelInternal( startX, startY )
		return
	end
	
	local minX = math.min( startX, endX )
	if minX == startX then
		minY = startY
		maxX = endX
		maxY = endY
	else
		minY = endY
		maxX = startX
		maxY = startY
	end
		
	local xDiff = maxX - minX
	local yDiff = maxY - minY
			
	if xDiff > math.abs(yDiff) then
		local y = minY
		local dy = yDiff / xDiff
		for x=minX,maxX do
			drawPixelInternal( x, math.floor( y + 0.5 ) )
			y = y + dy
		end
	else
		local x = minX
		local dx = xDiff / yDiff
		if maxY >= minY then
			for y=minY,maxY do
				drawPixelInternal( math.floor( x + 0.5 ), y )
				x = x + dx
			end
		else
			for y=minY,maxY,-1 do
				drawPixelInternal( math.floor( x + 0.5 ), y )
				x = x - dx
			end
		end
	end
end

function drawImage( tImage, xPos, yPos )
	for y=1,#tImage do
		local tLine = tImage[y]
		for x=1,#tLine do
			if tLine[x] > 0 then
				term.setBackgroundColor( tLine[x] )
				drawPixelInternal( x + xPos - 1, y + yPos - 1 )
			end
		end
	end
end
