mirror of
https://github.com/CCLeonOS/LeonOS.git
synced 2026-03-03 15:17:01 +00:00
159 lines
3.7 KiB
Lua
159 lines
3.7 KiB
Lua
|
|
-- rc.paintutils
|
||
|
|
|
||
|
|
local term = require("term")
|
||
|
|
local expect = require("cc.expect").expect
|
||
|
|
local textutils = require("textutils")
|
||
|
|
|
||
|
|
local p = {}
|
||
|
|
|
||
|
|
function p.parseImage(str)
|
||
|
|
expect(1, str, "string")
|
||
|
|
return textutils.unserialize(str)
|
||
|
|
end
|
||
|
|
|
||
|
|
function p.loadImage(path)
|
||
|
|
expect(1, path, "string")
|
||
|
|
local handle = io.open(path)
|
||
|
|
if handle then
|
||
|
|
local data = handle:read("a")
|
||
|
|
handle:close()
|
||
|
|
return p.parseImage(data)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function p.drawPixel(x, y, color)
|
||
|
|
expect(1, x, "number")
|
||
|
|
expect(2, y, "number")
|
||
|
|
expect(2, color, "number", "nil")
|
||
|
|
if color then term.setBackgroundColor(color) end
|
||
|
|
term.at(x, y).write(" ")
|
||
|
|
end
|
||
|
|
|
||
|
|
local function drawSteep(x0, y0, x1, y1, color)
|
||
|
|
local distX = x1 - x0
|
||
|
|
local distY = y1 - y0
|
||
|
|
|
||
|
|
local diff = 2*distX - distY
|
||
|
|
|
||
|
|
local x = x0
|
||
|
|
for y=y0, y1, 1 do
|
||
|
|
p.drawPixel(x, y, color)
|
||
|
|
if diff > 0 then
|
||
|
|
x = x + 1
|
||
|
|
diff = diff + 2 * (distX - distY)
|
||
|
|
else
|
||
|
|
diff = diff + 2*distX
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local function drawShallow(x0, y0, x1, y1, color)
|
||
|
|
local distX, distY = x1 - x0, y1 - y0
|
||
|
|
local diff = 2*distY - distX
|
||
|
|
local y = y0
|
||
|
|
|
||
|
|
for x=x0, x1, 1 do
|
||
|
|
p.drawPixel(x, y, color)
|
||
|
|
if diff > 0 then
|
||
|
|
y = y + 1
|
||
|
|
diff = diff - 2*distX
|
||
|
|
end
|
||
|
|
diff = diff + 2*distY
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
function p.drawLine(_startX, _startY, _endX, _endY, color)
|
||
|
|
expect(1, _startX, "number")
|
||
|
|
expect(2, _startY, "number")
|
||
|
|
expect(3, _endX, "number")
|
||
|
|
expect(4, _endY, "number")
|
||
|
|
expect(5, color, "number")
|
||
|
|
local startX, startY, endX, endY =
|
||
|
|
math.min(_startX, _endX), math.min(_startY, _endY),
|
||
|
|
math.max(_startX, _endX), math.max(_startY, _endY)
|
||
|
|
|
||
|
|
if startX == endX and startY == endY then
|
||
|
|
return p.drawPixel(startX, startY, color)
|
||
|
|
elseif startX == endX then
|
||
|
|
if color then term.setBackgroundColor(color) end
|
||
|
|
for y=startY, endY, 1 do
|
||
|
|
term.at(startX, y).write(" ")
|
||
|
|
end
|
||
|
|
elseif startY == endY then
|
||
|
|
if color then term.setBackgroundColor(color) end
|
||
|
|
term.at(startX, startY).write((" "):rep(endX - startX))
|
||
|
|
end
|
||
|
|
|
||
|
|
if (endY - startY) < (endX - startX) then
|
||
|
|
drawShallow(startX, startY, endX, endY)
|
||
|
|
else
|
||
|
|
drawSteep(startX, startY, endX, endY)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function p.drawBox(startX, startY, endX, endY, color)
|
||
|
|
expect(1, startX, "number")
|
||
|
|
expect(2, startY, "number")
|
||
|
|
expect(3, endX, "number")
|
||
|
|
expect(4, endY, "number")
|
||
|
|
expect(5, color, "number")
|
||
|
|
|
||
|
|
local col = string.format("%x", math.floor(math.log(color, 2)))
|
||
|
|
local ht, hc = (" "):rep(endX-startX+1), col:rep(endX-startX+1)
|
||
|
|
|
||
|
|
term.at(startX, startY).blit(ht, hc, hc)
|
||
|
|
for i=startY, endY do
|
||
|
|
term.at(startX, i).blit(" ", col, col)
|
||
|
|
term.at(endX, i).blit(" ", col, col)
|
||
|
|
end
|
||
|
|
term.at(startX, endY).blit(ht, hc, hc)
|
||
|
|
end
|
||
|
|
|
||
|
|
function p.drawFilledBox(startX, startY, endX, endY, color)
|
||
|
|
expect(1, startX, "number")
|
||
|
|
expect(2, startY, "number")
|
||
|
|
expect(3, endX, "number")
|
||
|
|
expect(4, endY, "number")
|
||
|
|
expect(5, color, "number")
|
||
|
|
|
||
|
|
local col = string.format("%x", math.floor(math.log(color, 2)))
|
||
|
|
local ht, hc = (" "):rep(endX-startX+1), col:rep(endX-startX+1)
|
||
|
|
|
||
|
|
for y=startY, endY, 1 do
|
||
|
|
term.at(startX, y).blit(ht, hc, hc)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function p.drawImage(img, x, y, frame)
|
||
|
|
expect(1, img, "table")
|
||
|
|
expect(2, x, "number")
|
||
|
|
expect(3, y, "number")
|
||
|
|
expect(4, frame, "number", "nil")
|
||
|
|
|
||
|
|
frame = frame or 1
|
||
|
|
if not img[frame] then
|
||
|
|
return nil, "invalid frame index " .. frame
|
||
|
|
end
|
||
|
|
|
||
|
|
if img.palette then
|
||
|
|
for k, v in pairs(img.palette) do
|
||
|
|
term.setPaletteColor(k, table.unpack(v))
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if img[frame].palette then
|
||
|
|
for k, v in pairs(img[frame].palette) do
|
||
|
|
term.setPaletteColor(k, table.unpack(v))
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
for i, line in ipairs(img[frame]) do
|
||
|
|
term.at(x+i-1, y).blit(table.unpack(line))
|
||
|
|
end
|
||
|
|
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
return p
|