2017-05-01 13:32:39 +00:00
|
|
|
|
|
|
|
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 )
|
|
|
|
if type( sPath ) ~= "string" then
|
2017-06-12 09:54:44 +00:00
|
|
|
error( "bad argument #1 (expected string, got " .. type( sPath ) .. ")", 2 )
|
2017-05-01 13:32:39 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
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 )
|
2017-06-12 09:54:44 +00:00
|
|
|
if type( xPos ) ~= "number" then error( "bad argument #1 (expected number, got " .. type( xPos ) .. ")", 2 ) end
|
|
|
|
if type( yPos ) ~= "number" then error( "bad argument #2 (expected number, got " .. type( yPos ) .. ")", 2 ) end
|
|
|
|
if nColour ~= nil and type( nColour ) ~= "number" then error( "bad argument #3 (expected number, got " .. type( nColour ) .. ")", 2 ) end
|
2017-05-01 13:32:39 +00:00
|
|
|
if nColour then
|
|
|
|
term.setBackgroundColor( nColour )
|
|
|
|
end
|
|
|
|
drawPixelInternal( xPos, yPos )
|
|
|
|
end
|
|
|
|
|
|
|
|
function drawLine( startX, startY, endX, endY, nColour )
|
2017-06-12 09:54:44 +00:00
|
|
|
if type( startX ) ~= "number" then error( "bad argument #1 (expected number, got " .. type( startX ) .. ")", 2 ) end
|
|
|
|
if type( startY ) ~= "number" then error( "bad argument #2 (expected number, got " .. type( startY ) .. ")", 2 ) end
|
|
|
|
if type( endX ) ~= "number" then error( "bad argument #3 (expected number, got " .. type( endX ) .. ")", 2 ) end
|
|
|
|
if type( endY ) ~= "number" then error( "bad argument #4 (expected number, got " .. type( endY ) .. ")", 2 ) end
|
2017-06-19 03:46:13 +00:00
|
|
|
if nColour ~= nil and type( nColour ) ~= "number" then error( "bad argument #5 (expected number, got " .. type( nColour ) .. ")", 2 ) end
|
2017-05-01 13:32:39 +00:00
|
|
|
|
|
|
|
startX = math.floor(startX)
|
|
|
|
startY = math.floor(startY)
|
|
|
|
endX = math.floor(endX)
|
|
|
|
endY = math.floor(endY)
|
|
|
|
|
|
|
|
if nColour then
|
|
|
|
term.setBackgroundColor( nColour )
|
|
|
|
end
|
|
|
|
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
|
|
|
|
|
|
|
|
-- TODO: clip to screen rectangle?
|
|
|
|
|
|
|
|
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 drawBox( startX, startY, endX, endY, nColour )
|
2017-06-12 09:54:44 +00:00
|
|
|
if type( startX ) ~= "number" then error( "bad argument #1 (expected number, got " .. type( startX ) .. ")", 2 ) end
|
|
|
|
if type( startY ) ~= "number" then error( "bad argument #2 (expected number, got " .. type( startY ) .. ")", 2 ) end
|
|
|
|
if type( endX ) ~= "number" then error( "bad argument #3 (expected number, got " .. type( endX ) .. ")", 2 ) end
|
|
|
|
if type( endY ) ~= "number" then error( "bad argument #4 (expected number, got " .. type( endY ) .. ")", 2 ) end
|
2017-06-19 03:46:13 +00:00
|
|
|
if nColour ~= nil and type( nColour ) ~= "number" then error( "bad argument #5 (expected number, got " .. type( nColour ) .. ")", 2 ) end
|
2017-05-01 13:32:39 +00:00
|
|
|
|
|
|
|
startX = math.floor(startX)
|
|
|
|
startY = math.floor(startY)
|
|
|
|
endX = math.floor(endX)
|
|
|
|
endY = math.floor(endY)
|
|
|
|
|
|
|
|
if nColour then
|
|
|
|
term.setBackgroundColor( nColour )
|
|
|
|
end
|
|
|
|
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
|
|
|
|
|
|
|
|
for x=minX,maxX do
|
|
|
|
drawPixelInternal( x, minY )
|
|
|
|
drawPixelInternal( x, maxY )
|
|
|
|
end
|
|
|
|
|
|
|
|
if (maxY - minY) >= 2 then
|
|
|
|
for y=(minY+1),(maxY-1) do
|
|
|
|
drawPixelInternal( minX, y )
|
|
|
|
drawPixelInternal( maxX, y )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function drawFilledBox( startX, startY, endX, endY, nColour )
|
2017-06-12 09:54:44 +00:00
|
|
|
if type( startX ) ~= "number" then error( "bad argument #1 (expected number, got " .. type( startX ) .. ")", 2 ) end
|
|
|
|
if type( startY ) ~= "number" then error( "bad argument #2 (expected number, got " .. type( startY ) .. ")", 2 ) end
|
|
|
|
if type( endX ) ~= "number" then error( "bad argument #3 (expected number, got " .. type( endX ) .. ")", 2 ) end
|
|
|
|
if type( endY ) ~= "number" then error( "bad argument #4 (expected number, got " .. type( endY ) .. ")", 2 ) end
|
2017-06-19 03:46:13 +00:00
|
|
|
if nColour ~= nil and type( nColour ) ~= "number" then error( "bad argument #5 (expected number, got " .. type( nColour ) .. ")", 2 ) end
|
2017-05-01 13:32:39 +00:00
|
|
|
|
|
|
|
startX = math.floor(startX)
|
|
|
|
startY = math.floor(startY)
|
|
|
|
endX = math.floor(endX)
|
|
|
|
endY = math.floor(endY)
|
|
|
|
|
|
|
|
if nColour then
|
|
|
|
term.setBackgroundColor( nColour )
|
|
|
|
end
|
|
|
|
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
|
|
|
|
|
|
|
|
for x=minX,maxX do
|
|
|
|
for y=minY,maxY do
|
|
|
|
drawPixelInternal( x, y )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function drawImage( tImage, xPos, yPos )
|
2017-06-19 03:46:13 +00:00
|
|
|
if type( tImage ) ~= "table" then error( "bad argument #1 (expected table, got " .. type( tImage ) .. ")", 2 ) end
|
2017-06-12 09:54:44 +00:00
|
|
|
if type( xPos ) ~= "number" then error( "bad argument #2 (expected number, got " .. type( xPos ) .. ")", 2 ) end
|
|
|
|
if type( yPos ) ~= "number" then error( "bad argument #3 (expected number, got " .. type( yPos ) .. ")", 2 ) end
|
2017-05-01 13:32:39 +00:00
|
|
|
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
|